2009年2月23日星期一

Emacs入门

1.关于 Emacs

it’s much more than an editor.
Emacs 的功能太强大了,但我们这里不偏离基础,只把它当作 windows 里的记事本来用。
寻找到一个文件意味着你可以在 Emacs 里查看这个文件的内容。从许多角度看,
这就等于你在直接编辑这个文件,只是你所做的修改只有在“存盘”的时候才会
被写入文件。也正因为如此,你可以丢弃一个写到一半的文件而不必把这个残缺
文件也保存到计算机上。在存盘的时候,Emacs 会把存盘前的文件重命名保存,
以防你改完之后又想反悔。重命名的规则通常是在原文件名之后添加一个“~”字符。
【对许多人来说,这是一个烦人的特性,关掉文件备份可以用如下命令:
M-x customize-variable make-backup-files

存盘结束后,Emacs 会显示写入文件的文件名。你最好养成经常存盘的习惯,这
可以减少系统崩溃和死机给你带来的损失。

在屏幕的下方,你应该能够看到头尾都是短线“-”的一行,行首通常是一些诸如
“--:-- TUTORIAL.cn”的文字,这些文字代表了你当前正在访问的文件。比如你
现在正在访问的文件叫“TUTORIAL.cn”,它只是一个给你临时使用的拷贝。每当
Emacs 寻找到一个文件,文件名就会出现在这个位置。


2.打开 Emacs

$ emacs >>>> 无参数的输入emacs命令,emacs 会为你打开一个新file
$ emacs hello.c >>>> 如果hello.c 存在,则打开次文件;如果不存在,则新建hello.c文件。

Note: 在图形终端上打开的emacs, 上面有一排类似windows的文件菜单,点选 File -> Open File …, 然后输入文件名
在纯命令行的shell 里面,鼠标点击是不起作用的。这时候打开文件需要就需要用键盘键入命令(我们之后谈到的命令都是运用键盘的,鼠标点击大家都会)

3.Emacs中通过键盘输入命令
命令的输入,通常需要 Ctrl (Control键) 加上字母键 完成。有一些是Alt(又名 Meta 键) 与 字母 组合。如果你看了 emacs 的帮助指南,命令的表示通常是这样的:C-x C-c >>>> 先按住 Ctrl 键不放,按下 x,松开 x, 按下 c, 松开 c, 松开 Ctrl
M- >>>> Meta-, 或 Alt-, 或 Esc
C-M- >>>> Control-Alt-

(有一系列命令都是以 CONTROL-x 开始的,这些命令许多都跟“窗格、文件、
缓冲区【缓冲区(buffer)会在后文详细介绍】”等等诸如此类的东西有关,其
中有些命令可能包含了 2 个、3 个或者 4 个字符。)
4. 在Emacs 打开一个文件
刚才我们是在打开emacs 的时候同时打开了一个文件,如 hello.c
那如何在emacs里打开另一个文件呢?(就象在 windows的 notepad 中的“新建”“打开”项)C-x C-f filename >>>> 打开一个filename文件

…... (输入文本) ……


5. 保存,退出操作

C-x C-s >>>> 保存文件
C-x C-c >>>> 退出Emacs
C-z 或者
C-x C-z >>>> 挂起Emacs


( 挂起的意思就是把程序放到后台操作,前台回到 shell 提示符上,输入fg 回到emacs 界面 )
(在没有提供挂起功能的系统中,C-z 会在 Emacs 之下创建一个子 shell 来让你
运行其它程序,并且再次“回到”Emacs 中――虽然我们并没有真正离开过。这
种情况下,通常用 shell 命令“exit”从子 shell 回到 Emacs。)

6.在输入文本过程中经常要用到的几个命令C-v >>>> 向下滚动窗口
M-v >>>> 向上滚动窗口
C-x u >>>> 取消上一次操作

7. * 自动保存(AUTO SAVE)
-----------------------

如果你已经修改了一个文件,但是还没来得及存盘你的计算机就罢工了,那么你
所做的修改就很可能会丢失。为了避免这样的不幸发生,Emacs 会定期将正在编
辑的文件写入一个“自动保存”文件中。自动保存文件的文件名的头尾各有一个
“#”字符,比如你正在编辑的文件叫“hello.c”,那么它的自动保存文件就叫
“#hello.c#”。这个文件会在正常存盘之后被 Emacs 删除。

所以,假如不幸真的发生了,你大可以从容地打开原来的文件(注意不是自动保
存文件)然后输入 M-x recover file 来恢复你的自动保存文件。在提
示确认的时候,输入 yes
--------------------------------------------------------------------------------

进一步自学 Emacs

如果已经成功使用了以上的基本操作,那么进行简单的文本编辑,保存,就没有什么问题了。
但是不是觉得 emacs 很不方便呢?网上有很多资源可以帮助进一步的学习emacs的使用。

btw, 偶觉得在实际需要中学习可以真正的掌握emacs的使用,不止是 emacs 的学习.
当你想完成某个快捷功能,比如同时打开两个窗口( C-x 2 ),有一个 命令列表 是很方便的。


每天要用到的命令

希望你的身边已经打开了一个emacs的编辑器,依次操作下面的命令,可以获得更直观的认识和理解。

查找功能
C-s 在文件中实现查找功能

* 搜索(SEARCHING)
-------------------

Emacs 可以向前或向后搜索字符串。搜索命令是一个移动光标的命令:搜索成功
后,光标会停留在搜索目标出现的地方。

Emacs 的搜索命令的独特之处在于,它是“渐进的(incremental)”。意思是搜
索与输入同时进行:你在键盘上一字一句地输入搜索词的过程中,Emacs 就已经
开始替你搜索了。

C-s 是向前搜索,C-r 是向后搜索。不过手别这么快!别着急试。

在按下 C-s 之后,回显区里会有“I-search”字样出现,表明目前 Emacs 正处
于“渐进搜索”状态,并等待你输入搜索字串。按 可以结束搜索。

>> 输入 C-s 开始一个搜索。注意敲慢一点,一次输入一个字符。
慢慢输入“cursor”这个词,每敲一个字都停顿一下并观察光标。
现在你应该已曾经找到“cursor”这个词了。
>> 再按一次 C-s,搜索下一个“cursor”出现的位置。
>> 现在按四次退格键,看看光标是如何移动的。
>> 敲 结束搜索。

看仔细了么?在一次渐进式搜索中,Emacs 会尝试跳到搜索目标出现的位置。要
跳到下一个命中位置,就再按一次 C-s。如果找不到目标,Emacs 会发出“哔”
的一声,告诉你搜索失败。在整个过程中,都可以用 C-g 来终止搜索。【你会发
现 C-g 会让光标回到搜索开始的位置,而 则让光标留在搜索结果上,
这是很有用的功能。】

注意:在某些终端下,输入 C-x C-s 会冻结屏幕【屏幕没有任何输出】,使你看
不到 Emacs 的任何变化。其原因是操作系统的“流量控制”功能拦截了 C-s 并
冻结了屏幕。用 C-q 可以解除屏幕冻结。要解决这个问题,请参考 Emacs 手册
里的“Spontaneous Entry to Incremental Search”一节【Emacs 手册可能还没
有中文翻译】,那里提供了一些有用的建议。

在渐进式搜索中,按退格键会删除目标字符串的最后一个字符,并且光标会回到
最近一次搜索的命中位置。比如你已经输入了“c”,光标就停在“c”第一次出
现的位置,再输入“u”,光标停在“cu”第一次出现的位置,这时再按退格键,
“u”就从搜索字串中消失了,然后光标会回到“c”第一次出现的位置。

另外,如果你在搜索的时候输入了 CONTROL 或者 META 组合键的话,搜索可能会
结束。(也有例外,比如 C-s 和 M-r 这些用于搜索的命令。)

前面说的都是“向下”搜索,如果想“向上”搜索,可以用 C-r。C-r 与 C-s
相比除了搜索方向相反之外,其余的操作都一样。

同时打开多个文件:
C-x 2 水平分割主窗口
C-x 3 垂直分割
note: 操作这两个命令后,你会发现两个窗口显示的是同样的文本,在任一窗口进行的内容修改,都会改变两个窗口上的相同内容,因为他们就是同一个文件。 >>>> 这个功能非常好用,尤其是需要对一个很长的文件进行编辑,同时又需要查找内容的时候。
当然你也可以在新开的窗口 C-x C-f 打开另一个文件。

C-x o 在多个窗口之间进行切换 >>>> 也就是将光标移到当前要进行操作的窗口
C-x 1 将光标所在的窗口最大化 >>>> 相当于又回到了原来一个窗口的状态

新手可能会问的一些问题

Q: 如何在Linux上检查是否安装了emacs?
A: 在命令行提示符后输入 emacs, 如果什么都没有发生或者提示:“command not found”.
那么你可能还没有安装 emacs 或者安装的路径有问题

Q: C-x C-c 退出时的提示选项是什么意思?
A: 如果没有保存过文件,就是用 C-x C-c 退出,会出现以下提示信息:
Save file /home/software/carol/tmp/test.c? (y, n, !, ., q, C-r or C-h)
输入 y 保存文件并退出
输入 ! 不保存就退出
输入 Ctrl-h 获得帮助信息

Q: 如何使用emacs提供的快速入门手册
A: 用 C-h t (help tutorial) 可进入快速入门手册

* 获得更多帮助(GETTING MORE HELP)
-----------------------------------

本快速指南的目的仅仅是帮助你在 Emacs 的海洋里下水,不至于束手无策望洋兴
叹。有关 Emacs 的话题可谓汗牛充栋,这里自然是难尽万一。不过 Emacs 很理
解你求知若渴的心情,因为它提供的强大功能实在是太多了。为此,Emacs 提供
了一些命令来查看 Emacs 的命令文档,这些命令都以 CONTROL-h 开头,这个字
符也因此被称为“帮助(Help)字符”。

要使用帮助(Help)功能,请先输入 C-h,然后再输入一个字符以说明你需要什
么帮助。如果你连自己到底需要什么帮助都不知道,那么就输入 C-h ?,Emacs
会告诉你它能提供了哪些帮助。如果你按了 C-h 又想反悔,可以用 C-g 取消。

(有些主机改变了 C-h 的意义,这种以己度人外加一刀切的做法确实不太好,不
过倒是让你可以义正辞严地抱怨他们的系统管理员。话说回来,如果你按 C-h 之
后没有任何帮助信息显示出来,那么试试 F1 键或者 M-x help 。)

最基本的帮助功能是 C-h c。输入 C-h c 之后再输入一个组合键,Emacs 会给出
这个命令的简要说明。

>> 输入 C-h c C-p。

显示的消息应该会是这样:

C-p runs the command previous-line

这条消息显示了 C-p 命令对应的函数名,函数名主要用来定制和扩展 Emacs。命
令的功能由函数完成,所以函数名本身也可以被看成是最简单的文档――至少对
于你已经学过的命令来说,它们的函数名足以解释它们的功能了。

多字符命令一样可以用 C-h c 来查看。

想得到更多的信息,请把 C-h c 换成 C-h k 试试看。

>> 输入 C-h k C-p。

上面的命令会新打开一个 Emacs 窗格以显示函数的名称及其文档。你读完之后可
以用 C-x 1 关掉这个帮助窗格。当然你并不需要立即这样做,你完全可以先在编
辑窗格里做点别的事情,然后再关掉帮助窗格。

还有一些其它有用的 C-h 命令:

C-h f 解释一个函数。需要输入函数名。

>> 试试看,输入 C-h f previous-line
Emacs 会给出它所知道的所有有关“实现 C-p 命令功能的函数”的信息。

C-h v 用来显示 Emacs 变量的文档。Emacs 变量可以被用来“定制 Emacs 的行
为”。同样,你需要输入变量的名称。

C-h a 相关命令搜索(Command Apropos)。
输入一个关键词然后 Emacs 会列出所有命令名中包含此关键词
的命令。这些命令全都可以用 M-x 来启动。对于某些命令来说,
相关命令搜索还会列出一两个组合键。

>> 输入 C-h a file

Emacs 会在另一个窗格里显示一个 M-x 命令列表,这个列表包含了所有名称中含
有“file”的命令。你可以看到像“C-x C-f”这样的组合键显示在“find-file”
这样的命令名的旁边。

>> 用 C-M-v 来回滚动 help 窗格,多试几次。

>> 输入 C-x 1 来删除 help 窗格。

C-h i 阅读联机手册(也就是通常讲的 Info)。
这个命令会打开一个称为“*info*”的特殊缓冲区,在那里,
你可以阅读安装在系统里的软件包使用手册。要读 Emacs 的使
用手册,按 m emacs 就可以了。如果你之前从没用
过 Info 系统,那么请按“?”,Emacs 会带你进入 Info 的使
用指南。在看完本快速指南之后,Emacs Info 会成为你的主要
参考文档。



退出 Emacs 按 C-x C-c (就是 Ctrl+x 接着按 Ctrl+c)。

打开和保存文件
启动 Emacs 后,按 C-x C-f,minibuffer (就是 Emacs 最下面一条) 会提示路 径,你可以在这里输入路径名和文件名,或者回车看到这个目录列表。可以 用方向键移动光标到文件名上回车打开文件,或者在子目录上进入子 目录,在 .. 上进入上一层目录。

打开文件后像往常一样编辑,随便按字母键输入一些字符。按 C-x C-s 保存文件。按 C-x k 回车关闭这个 buffer。

小结:按键说明
这 里可以看到很多 C-x 开头的组合键,这些通常都是 Emacs 预先定义,全局性 的命令。按了 C-x 不动,一秒钟后 minibuffer 提示 C-x- ,表示 Emacs 正在 等待用户按下一个键。如果你想取消这次按键,可以接下去按 C-g,minibuffer 提示 C-x C-g is undefined 也就是说 Emacs 什么都没有执行。C-g 一般都是取 消命令,取消按键。如果按了 C-x C-h 就会出现一个帮助 buffer,里面是以 C-x 开头的按键帮助。C-h 是一个帮助按键。如何获得更多的帮助,会在之后的 小节介绍。C-c 开头的按键通常是用户自定义的按键和扩展包或扩展模式定义的 按键,同样也可以获得帮助信息。

选定区域,剪切、复制、粘贴
好了,到现在为止你大概一共花了 10 分钟吧。

你 可以用鼠标拖选一块区域。当然,最好用键盘。按 C-@,minibuffer 提示 Mark set,设定了一个 mark。然后移动光标,这时候你就选定了光标和 Mark 之 间的区域。什么都看不到?你可以按 C-w,这块区域就消失了,C-w 是剪切。按 C-x u 可以撤销上一次的剪切,C-x u 是取消。你肯定想看到你到底选中了哪块 区域,可以按M-x 然后输入 transient-mark-mode ,回车。这次你就可以看到你 选中了哪块区域了。M-x 是执行 Emacs 命令。

【插播广告】如果是德语键盘,在 Windows 下很可能按不出 C-@, 而 C-又被输入法占去了。所以最好自己设定 set-mark 的按键。比如把 C-" 设为 mark 命令。按 C-: (ctrl-冒号) 输入下面这句话,然后回车:

(global-set-key (kbd "C-\"") 'set-mark-command)

可以在你的.emacs文件里加入类似的语句

【广告结束】

Emacs 有一个很有用的功能,在你选定了区域之后按 C-x C-x 可以交换光标 (point) 和 Mark 的位置,这样你就可以修改调整你选定的区域了。

按 C-g 取消选定的区域。

重新用 C-@ 选定一块区域,按 M-w,这是复制,移动光标到别处,按 C-y,这是 粘贴。紧接着再按一次 M-y,这时可以看到粘贴的内容变成了上一次剪切的内容。 再按 M-y 又变成之前一次复制的内容。

C-k 可以剪切一行。连续的 C-k 会把剪切的内容放在一起,一次 C-y 就可以把 之前的 n 行一起贴上。

C-x u 可以撤销,不过这个撤销和常规 windows 程序的撤销不太一样。按了 C-x u 撤销后,如果移动一下光标,再按一次 C-x u,可以撤销之前的撤销命令。 这样相当于是 redu。

小结:

C-@ 选定区域
C-w 剪切
M-w 复制
C-y 粘贴
M-y 粘贴剪贴板之前的内容
C-k 剪切一行
C-x u 撤销
查找
其 他 windows 程序的查找通常会跳出一个对话框,这很讨厌,会遮住文本内容, 有时候我就会忘了我到底要找什么。Emacs 就不会这样。按 C-s 是查找, minibuffer 提示 I-search: 接下来你可以输入你要找的词,比如想找 windows, 输入 w,Emacs 开始找到 w,光标移动到 w 上,接着输入 i,Emacs 找到 wi, 并注意到Emacs 会同时高亮所有的 wi,接着输入 n,Emacs 找到 win,等等。这 就是 incremetal search,它的好处是,你想要找 windows,但实际上你只要输 入 win 就能定位到 windows 上了,不需要继续输入 dows 了。继续按 C-s 找下 一个匹配的。C-r 往回查找。按回车或者方向键结束本次查找,再按两次 C-s 重 复上次查找,按 C-g 取消查找,光标回到原处。

C-s 或 C-r 也可以用作光标定位,比如想要移到前面 Emacs 处,就可以 C-r Emacs,效率很高,可以说是指哪打哪。

如果查找输入的全是小写,那么这次查找是大小写不敏感的,如果输入字符中有 大写字母,那么这次查找就是大小写敏感的。很智能吧。

C-M-s 或 C-M-r 是正则表达式查找。或者在 C-s 之后按 M-r 也可以切换到正则 表达式查找。这里不仔细讲 Emacs 的正则表达式是怎么样的。那样会多花一个小 时。

替换
M-% 是 query-replace,输入查找内容和替换内容,然后 Emacs 会询问是否要 替换,y 替换,n 不替换,! 替换光标之后所有,q 结束,? 可以得到帮助。

Emacs 的替换有一个很好的特性,可以只在选定区域内进行替换。这样就可以放 心大胆地使用 ! 替换所用,而不用担心超出范围了。

C-M-% 是正则表达式的替换。

小结:

C-s 和 C-r 向前向后查找
C-% 替换
C-M-s 和 C-M-r 向前向后正则表达式查找
C-M-% 正则表达式替换
寻求帮助
到这里你用了大概20分钟,基本的文本编辑功能都有了。

接着你可以自己摸索了。

Emacs 提供了极其强大的帮助系统。

C-h t 是一个 tutorial,现在也有不同语言的 tutorial。按 M-x 输入 help-with-tutorial-spec-language 可以选择不同的语言。按 Emacs 可 以帮你补全命令。按两次 会有补全的提示。

C-h a 是 apropos command,你可以输入几个简单的单词,Emacs 可以帮你找到 相应的命令,这个帮助非常好用。比如你想把一个单词全部大写,但不知道该怎 么做,可以 C-h a 输入 upcase word 或者 up word,Emacs 就会找到几个命令, 其中一个是 upcase-word,并且对应的按键是 M-u,你只要把光标移动到单词前 按 M-u 就可以了。

C-h k 是描述某个按键会执行什么。例如你要看看 M-; 是干什么的,按 C-h k, 接着按 M-; 你就会看到 M-; 会运行 comment-dwim,dwim 是 do what i mean 的缩写,这个命令会注释或反注释你选定的区域,如果没有选定区域,会在这一 行后面加上注释。很聪明的命令吧。

C-h c 简单描述某个按键执行什么。

C-h f 描述某个函数

C-h v 描述某个变量

C-h 会提供很多很多帮助信息,C-h ? 会显示有哪些帮助信息。

简单配置
Emacs 有超强的可配置性,1000个人可以有1000种配置,可以有自己的键绑定, 有自定义的函数,有自己喜欢的扩展包。配置放在 home 目录下的 .emacs 里, Emacs 启动的时候会自动读取这个文件。启动 Emacs 后,C-x C-f ~/.emacs 会 打开 .emacs 文件,如果不存在的话就是新建这个文件。home 目录在哪里呢? 可以 M-x getenv home 得到 home 的位置。Linux 系统很好理解。 Windows 系统,会默认放在 C:\Documents and Settings\username\Application Data 下,有几种方法可以指定 home 的位置:

在 我的电脑->属性->高级->环境变量 里添加一个 HOME 环境变量,指定位 置。
在注册表 [HKEY_CURRENT_USER\SOFTWARE\GNU\Emacs] (如果没有 GNU 或 Emacs,添加一个即可) 添加 HOME 字符串变量,值为指定的 home 路径。
Emacs 配置使用的语言是 Elisp,Emacs 附带非常详细的 Elisp 手册,可以通 过 M-x info 得到。配置 .emacs 一般只需要几个简单语句,比如:

(setq variable-name value) 设置变量值,例如 (setq transient-mark-mode t) 设置选定区域范围高亮
(require 'extension) 安装一个扩展包。
(load "file-name") 使用一个 .el 文件
(global-set-key (kbd "C-c f") 'function-name) 全局自定义键绑定
(define-key dired-mode (kbd "j") 'dired-next-line) 局部键绑定,只在 dired-mode 起作用
(if ...) 一些简单的判断语句
这里提供一个简单的 .emacs 文件: quick.emacs.el

你可以把它复制到你的 home 目录下并改名为 .emacs 注意有个.

或者用 runemacs.exe -q -l quick.emacs.el 来指定 emacs 使用这个配置文件。

总结
到 这里差不多就是30分钟吧,介绍一些文本编辑的基本操作。只是为了说明上手 Emacs 其实很简单,而且几乎每一样操作都有比普通 Windows 文本编辑器更好 的特性,比如可以任意调整已选定的区域,更好的复制粘贴机制,更好的撤销机 制,更好的 isearch 查找方式,可以在区域内替换,强大得多的帮助系统,没 有任何限制的扩展性。用了几天或几个星期后就会觉得其他的编辑是多么麻烦和 弱小。

没有评论: