不想再说废话了,既然你会阅读这篇文档,说明你多少对Emacs有 些兴趣,或者已 经非常熟悉Emacs的基础操作了,并且希望有所提高。因此我不需要再把"编辑器 之神,还是神的编辑器"之类的恶俗话语放出来,来吸引你的好奇心。下面的内容, 从最基础的快捷键操作开始,一直到让你生活在Emacs中。这中间没有跳跃,你只 需要跟着我做,就可以了。
下面这些主要涉及了文件的基本操作,包括打开,新建,保存,另存为以及退出等比较常用的命令。
C-x C-f | 打开/新建一个文件 |
C-x C-s | 保存文件 |
C-x C-w | 另存为文件 |
C-x C-v | 关闭当前缓冲区文件并打开新文件 |
C-x i | 在当前光标处插入文件 |
C-x b | 新建/切换缓冲区 |
C-x C-b | 显示缓冲区列表 |
C-x k | 关闭当前缓冲区 |
C-x C-c | 关闭emacs |
这里边最方便的就是句首句尾和行首行尾,因为我的是笔记本键盘,上下左右主 要是用方向键,如果要是标准键盘的话,最好常用绑定键。
C-f | 后一个字符 |
C-b | 前一个字符 |
C-p | 上一行 |
C-n | 下一行 |
M-f | 后一个单词 |
M-b | 前一个单词 |
C-a | 行首 |
C-e | 行尾 |
C-v | 向下翻一页 |
M-v | 向上翻一页 |
M-< | 到文件开头 |
M-> | 到文件末尾 |
这里面包括了复制粘贴剪切删除等常用的操作命令。注意,在这里,移除包括了 剪切和删除两个概念,要区分清楚。
M-n/C-u n | 重复执行后一个命令n次 |
C-d | 删除后一个字符 |
M-d | 删除后一个单词 |
Del | 删除前一个字符 |
M-Del | 删除前一个单词 |
C-k | 移除一行 |
C-@ | 设定标志位(主要是为了粘贴剪切以及删除使用) |
C-w | 移除标记区域的内容(剪切) |
M-w | 复制标记区域的内容(复制) |
C-y | 召回(yank)复制/移除的区域/行(粘贴) |
M-y | 召回更早的内容 (在kill缓冲区内循环) |
C-t | 交换两个字符的位置 |
M-t | 交换两个单词的位置 |
C-x C-t | 交换两行的位置 |
M-u | 使从光标位置到单词结尾处的字母变成大写 |
M-l | 与M-u相反 |
M-c | 使从光标位置开始的单词的首字母变为大写 |
C-g | 停止当前运行/输入的命令 |
C-x u/C-_ | 撤销前一个命令(undo) |
C-s | 向后搜索 |
C-r | 向前搜索 |
窗口命令比较常用,尤其是编辑多个文件的时候,你可以打开多个窗口,可以提 高编辑效率。
C-x 2 | 水平分割窗格 |
C-x 3 | 垂直分割窗格 |
C-x o | 切换至其他窗格 |
C-x 0 | 关闭窗格 |
C-x 1 | 关闭除了光标所在窗格外所有窗格 |
C-h m | 查看当前模式 |
C-h c | 显示快捷键绑定的命令 |
C-h k | 显示快捷键绑定的命令和它的作用 |
C-h f | 显示函数的功能 |
C-h b | 显示当前缓冲区所有可用的快捷键 |
C-h t | 打开emacs教程 |
每一次emacs启动的时候,它将加载一个名为~/.emacs的Lisp代码文件,对该文件 进行编辑是一种常用的定制emacs的方式。
下面是一个典型的Lisp语句:
它的意思是在minibuffer上栏显示行列号。其中,括号表示这是一个lisp函数调 用,圆括号内第一个符号setq为emacs配置文件中常用的的函数,它为某个全局变 量赋值。该函数第一个参数为要设置的变量名,第二个数则是该变量的值。
下面讲到的每一行代码,你都可以直接拿到~/.emacs中使用。当你想要了解某一 行代码的作用时,可以把它复制粘贴到~/.emacs中,保存然后重启emacs就可以看 到效果了。
每一条上面都有注释,我就不多说了。
这里所说的高级定制,基本上都属于比较重要的日常应用,比如说主题,w3m浏览 器,Irc,日程管理Org,版本控制Git,代码浏览Cscope。而像那些查看pdf,听 音乐以及煮咖啡的玩意,基本上是华而不实的东西,你要有兴趣,完全可以自己 去做,记住,Emacs提供无限可能。
Emacs的插件一般都是一个以el为后缀名的文件, 把这个文件下载下来后放到一个 目录, 比如~/.emacs.d/, 然后执行下面这两条语句:
这样该插件就安装好了。
其实主题非常重要,因为字体的颜色,背景光标等等都是你天天必须面对的,设 定一个合适的主题,就像一个舒服的狗窝,让你不愿意离开。
下面是我的Emacs主题截图:
这个在Emacs23之后已经自带了,只需要在~/.emacs中加入下面的代码即可使用。
虽然Emacs23自带了Org-mode,但是如果方便地需要使用它,必须做相应的配置才 行。而关于Emacs org是什么,到底有什么用,这里不解释,如果你想了解,可以 在网上搜索,或者进入我的博客找到关于Emacs org 和 GTD 的文章。
好了,在这之前,我还是放一张我打开Emacs的截图
正常生成的html白白黑黑的,没有第三种颜色,对一般人来说比较枯燥。如果你 需要插入lisp/shell代码,五颜六色的比较赏心悦目,当然我不太喜欢它生成的 html,也没有使用。
- 下载htmlize.el
这个很简单,输入htmlize.el,直接就会找到,很简单。 - 添加配置
;; 添加网页着色 (require 'htmlize)
日程表这个东西就是需要不时的看一下,不然单单把它记录起来很容易遗忘,所 以我就把它放在启动的时候。每天,开机,打开Emacs,查看今天的日程表,然后 做相应的工作,多好~
如果你不知道org或者GTD为何物,可能有些云里雾里的。转接的
目的,就是方便 在文件内或者文件之间,互换某些内容。比如,我在inbox里完成了某个 TODO ,然后将其标志成 DONE
,接着需要将这部分内容放到finished里面。如果按 照正常的流程,肯定是先剪切然后复制。由于每天的可能标记完成的任务比较多,
如果都剪切复制,这样的效率太低了,转接就是专门为了提高这个而来的。
首先在你的系统里查询是否有下列文件包。
cvs autoconf libgc-dev libncurses5-dev
查询的方法很简单,例如在终端输入:
它就会自动查看是否已经安装cvs,如果没有,你需要使用下面的指令安装:
上面的几个都可以使用这种方法来确定是否有该安装包。
- APT安装
如果是ubuntu的话,可以先试试apt sudo apt-get install w3m如果可以的话,就不需要使用源代码安装了
- 源代码安装
- 首先:回到主目录 cd
其次:使用cvs下载源码包,输入下面的命令:
- cvs -d:pserver:anonymous@w3m.cvs.sourceforge.net:/cvsroot/w3m login
它会要求你输入密码,直接回车即可。然后在输入下面的命令:
- cvs -d:pserver:anonymous@w3m.cvs.sourceforge.net:/cvsroot/w3m checkout w3m
这一步会下载w3m安装包,可能会浪费点时间,别着急。
然后:安装w3m
- cd w3m ./configure sudo make sudo make install
这几步都是常见的安装命令,无错误之后就表示w3m已经安装完毕。
最后:验证w3m是否正确安装。
在终端输入
- w3m http://www.google.com
如果出现谷歌的搜索界面就表示成功了,这个时候可能中文显示是乱码,别着急, 后面我会解决这个问题。
这个貌似只能用源代码安装了~
首先:仍旧是回到主目录:
其次,使用cvs下载安装包(这一步和w3m安装差不多)
要你输入密码,直接回车。接着输入下面的命令:
这一步需要下载安装包,需要一段时间,当下载完毕的时候,进入emacs-w3m:
然后:安装emacs-w3m
这些步骤下来不出现问题就表明emacs-w3m安装成功。
这是我的~/.emacs中关于Emacs-w3m部分。
由于w3m-el和emacs23并不能充分匹配,有的时候会出现中文乱码问题。这个时候 你需要卸载w3m-el包,同时安装w3m-el-snapshot包。命令如下:
在Emacs上使用git的选择比较多,有Emacs VC git.el git-emacs magit等等,我 使用的是git-emacs。我已经默认你安装了git。
同样,我还是先放上一张git-emacs的截图:
其实https那个是git-emacs在github上的托管地址,有兴趣可以进去看一看。
- 下载cscope
- 这是cscope的下载地址: http://sourceforge.net/projects/cscope/files/
这是cscope的主页: http://cscope.sourceforge.net/
仍然是老三步:
Cscope 的发行包里面有个 xcscope.el 能很好地用于XEmacs 。它处于源代 码包的 contrib/xcscope 目录下,请将xcospe放入.emcs.d/中。
如果需要使用cscope,请将cscope-indexer放入该目录,同时执行M+X
cscope-index-files,即可在该目录下生成索引文件。同时将cscope-indexer放
入/usr/bin中,设置为可执行,在该目录下执行 sudo cscope-indexer -r,它会
生成cscope.files和cscope.out两个文件或目录。