【编辑器】Emacs编辑器的基本使用
本帖最后由 ring_chen 于 2018-1-18 23:21 编辑0.什么是Emacs?
Emacs是一款跨平台免费的编辑器。它的功能十分强大。Emacs不同于Word,Pages等 WYSIWYG(What you see is what you get. 所见即所得) 的文字处理软件,它是专门为程序员们量身定做的编辑器。在Word或者Page上,你可以对文字进行排版,挑选字体,甚至插入图片,一切都非常方便。不过使用Emacs的时候可不是这样。也许一开始你会觉得它的用法晦涩难懂,但这却是它的魅力之一。你会慢慢喜欢上它的!
关于Emacs的更多信息,请搜索相关网页。
1.为什么要使用Emacs?
编辑器中我也很喜欢Notepad++。可惜NP++只支持Windows平台。而Emacs除了几乎支持所有Linux平台以外还支持Windows平台。Unix上面有VIM编辑器,gnu Nano编辑器。Nano类似于Windows自带的Notepad,功能过于简单。Vim编辑器的各项功能相较Emacs而言还是不够强大。正如Emacs爱好者所言,Emacs是真正的程序员编辑器。
2.怎样使用Emacs?
下面我以OSX 10.8为例向大家展示Emacs的使用方法:
打开“终端”应用。输入 emacs 并按下回车即可运行 Emacs。在“终端”中运行的Emacs如下图所示:
紧接着我们按下 Ctrl+x 组合键,放开后再接着按下Ctrl+f 组合键。这时在窗体的底部会出现 Find file: ~/ 这样的提示。紧接着斜线后面依次键入 source.c, Emacs就会在 OSX的 “~/”目录下新建一个名为 source.c 的文件。按下图所示输入 C 语言代码:
然后依次按下 Ctrl+x, Ctrl+s 组合键。 source.c 就被保存到磁盘上了。
按下 Esc 键后放开,再按下 x 键。窗体底部会出现 M-x 字样。紧接着输入 compile 并按下回车,会看到输入位置出现 Compile command:make -k 字样。按下退格按键删除 make -k 并输入 cc -g source.c 这样就完成了 source.c 的编译。编译完成后在OSX的“~/”目录下生成a.out文件。
按下Esc按键后不放。再按下 Shift+1(!) 键。在窗体底部提示的 Shell Command:处后面键入 ./a.out 即可查看程序运行结果。
依次按下 Ctrl+x,Ctrl+c 组合键退出Emacs。
上面我们在Emacs中完成了一个简单C语言程序的编辑编译以及执行。大家也许会发现“依次按下 Ctrl+x,Ctrl+c ”这些操作是不容易完成的。尤其是如果我想按 Ctrl+c 却因为一时心急而按成了Ctrl+s 怎么办?不要急,发现按键被按错以后只要键入若干次 Ctrl+g 键即可撤销错误的按键序列。(*1)
也许我们当中的有些人用过Visual Studio。高版本的Visual Studio中注释C语言代码的默认按键是Ctrl+k, Ctrl+c。我们在实际操作当中不需要“先按下 Ctrl+k 组合键后放开,再按下 Ctrl+c 组合键后再次放开”才能完成注释操作。有经验的朋友都知道“按住 Ctrl 键不放,依次按下 k,c
键,再同时放开最后按着的 Ctrl+c 键”也可以达到同等的效果——那么在Emacs中道理也是一样的:我们可以“按住 Ctrl 键不放,再依次按下 x,c 键,最后同时放开所有按键”来关闭Emacs。那么,Ctrl+x,Ctrl+f 的文件查找功能组合键也是一样的道理。要熟悉这套流程,我们要先掌握——
一、Emacs的基本术语和一些组合按键约定:
如图所示,框架内可以包含多个窗体。窗体上显示缓冲区里的内容。这就是Emacs的基本结构。要想控制这些元素,我们就需要知道如何使用按键。
首先让我们约定 C-x C-f 组合键就是“按下 Ctrl 后依次按下 x,f 按键”。而 M-x 组合键是按下 Esc 后放开,再按下 x。为什么这里用 M 表示Esc 按键,而不是用 E 表示呢?因为 M 是 Meta 的缩写。除了“按下 Esc 放开后紧接着再按下 x”能实现 M-x 的功能以外,如果指定了 Alt 键为 Meta 按键,那么 Alt+x(按住 Alt 不放,再按下 x。最后同时放开 Alt 和 x)也能实现 M-x 所表达的的功能。关于在OSX上如何将 Alt 键设置为 Meta 按键,请看下文:
在OSX上如何将 Alt 键设置为 Meta 按键
打开终端应用。接着在终端应用程序菜单内找到并作键单击“偏好设置”。(这一步可以用快捷键Command+,[逗号])来实现。在“设置”主题内找到“键盘”选项卡。选中窗体下方的“使用Option作为Meta键”复选框。
这样设置好以后,C-M-b 这样的组合键既可以“先按下 Esc 后放开,再按下 Ctrl+c 组合键”,也可以“先按下 Ctrl 后放开,再按下 Esc 后放开,最后按下b ”,又可以“同时按下 Ctrl+Esc+b”,还可以“同时按下 Ctrl+Alt+b ”。因为 C-M-b 等于 M-C-b 不等于 b-M-C 也不等于 M-b-C 更不等于 C-b-M。
大家或许觉得——上一段好烦啊,键位什么的简直把我搞得晕头转向。Emacs的设计者们,你们就不能笨一点吗?唔~其实Emacs有着非常久远的历史了。在那个时候,不仅计算机系统接口五花八门不能统一,就连键盘布局也是不统一的。有些键盘甚至不配备 Alt 按键,但是却有一只 Meta 键。时至今日因为世界各地人民使用的语言不尽相同,键盘布局的差异也是很大的。Emacs的设计者们为了兼容各种键盘绞尽脑汁吃尽了苦头,最终才诞生了Emacs这样一款伟大的编辑器。(计算机键盘是由打字机键盘发展而来的。有兴趣的读者可以自己去了解相关情况。很有意思哦~)
所以,大家就需要花点时间弄明白这些按键的含义和用法。(话又说回来,如果所有的操作系统都是统一的——比如操作系统只有Windows,或者更甚:Windows就是操作系统的另一个叫法。那么这个世界将会变得多么无聊啊!如果你不喜欢Windows没关系,请默默地放弃它。然后再充满激情地投入另一个操作系统的怀抱。如果你是Windows的粉丝,那么请热爱Windows。你的爱好也将得到别人的尊重。)Emacs中的组合键太多了,多到我们没法一下子计数。但是一些基本按键却是需要掌握的。这些基本按键的使用频率最高。
我们继续来看各种按键:
C-x C-f 查找文件并打开一个文件。如果同名文件已经被打开,那么Emacs将会自动跳转到那个被打开的文件并等待用户编辑。每次打开一个已经存在的文件以后Emacs都会为那个版本做个备份。备份文件与新版本文件保存在同一目录下。备份文件的命名规则为:源文件名~
C-x C-s 保存当前缓冲区内的文件。
C-x s 提示询问用户保存已经打开的所有文件缓冲区中的文件。
C-x C-c 退出Emacs
以上四条是打开关闭文件所需要的最基本按键组合。文件打开后就被Emacs安排到缓冲区里边了。接下来的一些命令将教大家如何管理缓冲区:
C-x b 选择一个缓冲区进行显示。方法是输入缓冲区名称并按下回车键。
C-x C-b 显示Emacs管理着的所有缓冲区。
C-x k 关闭一个缓冲区。Emacs将文件写在缓冲区内。过一段时间后Emacs会自动将缓冲区内的文件存盘。这样是为了防止计算机断电后用户来不及保存在内存缓冲区中的文件。(试想,打了近2万字的小说因为停电而且没有辅助电源加上计算机的停机而消失了是什么感觉。此时的你想嚎叫,吐血,亦或已无言以对。也许最终无辜的键盘变成了你的发泄对象。。。)没有保存命令,Emacs绝不会覆盖你的源文件。取而代之的是Emacs会将buffer中的内容定时自动保存到名为 #源文件名# 的文件中去。
C-x C-q 将一个缓冲区设置为只读/或者取消一个只读缓冲区的只读属性。
如何在使用 C-x C-b 后出现的缓冲区列表上进行选择呢?我们需要紧接着学习一下窗体管理组合键——
C-x o 切换到其他窗体。使用此组合键就可以自由地在所有打开的窗体上进行切换。
C-x 2 垂直分割窗体。
C-x 3 水平分割窗体。
C-x 0 关闭当前窗体。当然,窗体关闭后缓冲区还在内存中保留。
C-x 1 关闭另一个窗体。
如果一个窗体内的内容太多,比如一个文件拥有很多行。我们怎样上下滚动浏览呢?使用以下组合键就可以解决这个问题。
C-v 向下滚动一页。(向下滚动到当前窗体的最后一行之后,再向上滚动两行以方便浏览。如果不保留滚动前出现的最后两行而直接换一面的话可能对用户造成些许的不方便。有最后两行记忆短暂停留在我们大脑中,给人以滚动是连续的错觉。其实只是为了让人觉得舒服。)
M-v 向上滚动一页。道理与向下滚动一页一样。只不过操作相反。但却不是互逆。(假设一页显示10行,并且当前光标在第一行。按下 C-v 组合键后,光标出现在窗体顶部。光标所在行数为9。此时再按下 M-v 组合键后,光标依然在第九行。但是窗体顶部出现的是第一行。)
C-M-v 向下滚动另一个窗体。
现在回到 C-x C-b 组合键中。使用 C-x o 切换到缓冲区列表窗口。使用上下方向键移动到你要使用窗体打开并查看的缓冲区那行上。按下回车键后就可以用窗口打开那个缓冲区了。再次使用 C-x o 切换到缓冲区列表,使用 C-x 0 就可以关闭这张列表所在的窗体。
CRM Buffer Size Mode File
当我们使用 C-x C-b 打开缓冲区列表时,不知大家注意到缓冲区列表窗体顶部左侧的“CRM buffer”字样没有?什么是“CRM buffer”?难道是 Crew Resource Management buffer?(误!)既然是列表头,那么CRM的每一个字母都有其含义。如果C所在的一列出某行缓冲区有个“.”标记,那就表示这个缓冲区是当前被选中的,正在被显示的缺省缓冲区。C 就是 Current 的缩写。R用来显示某一行缓冲区是不是只读的。R 应该是 Read-only 的缩写。M标记了该缓冲区是否被修改过。被修改过的缓冲区在M列处有个“*”(Aterisk)标记。所以 M 是 Modified 缩写。Buffer显然是缓冲区名称列,size 就是缓冲区大小列。Mode 是缓冲区模式列。File 是缓冲区所指向的外存上文件列。
接着看缓冲区列表头上边一行:
-uu-:---F1 source.c All L1 (C/l Abbrev)----------------
这一行又包含了丰富的信息。如果 source.c 已经被编辑,但是还未来得及保存,这一行就会变成:
-uu-:**-F1 source.c All L1 (C/l Abbrev)----------------
如果你在编辑 source.c 的过程中使用了C-x C-q组合键,将source.c变为了只读,这一行又会变成:
-uu-:%%-F1 source.c All L1 (C/l Abbrev)----------------
All又是什么意思呢?如果一个窗体内显示出了文件的全部,All标记就会出现。如果All的位置出现的是一个百分比,这个百分比就是窗体内的行数占文件总行数的百分比。缓冲区的第一行被显示在窗体上的时候,并且整个窗体内放不下缓冲区内的全部内容,All字样处就显示为 Top(到顶了)。那么整个窗体内放不下缓冲区内的全部内容,而且缓冲区的最后一行被显示在窗体上时,此处显示 Bot(Bottom 到底了)。紧跟着的“L数字”就是光标所在的行号。后面出现的(C/l Abbrev)代表了source.c是已C语言源文件形式进行高亮显示的。如果没有文件被打开。source.c 的位置就会被 *scratch* (思维碎片)字样替换。
当然,Emacs在窗体底部都会保留一条迷你缓冲区(Minibuffer)。大家可能已经知道了迷你缓冲区是用来记录和输入命令的。同时迷你缓冲区又用来显示Emacs给用户的信息。Emacs使用这种方式与用户进行交互。所以迷你缓冲区又叫响应区域(echo area)。
如同一个经验丰富的飞行员一般,熟练掌握这些知识后,只要对着仪表盘般的Emacs界面轻扫一眼就知道编辑器的各种状态了!
当然,同飞行学校的学员一样。光会看仪表、按按钮是无法驾驶飞机的。操作Emacs还需要编辑文档的基本知识加上熟练的练习。光这样还不够,因为Emacs太复杂了。出现异常时我们得要查看手册。那么下一段先讲怎样查手册吧。
除了上网用查找出现的状况外。Emacs自带在线手册。翻阅这些在线手册的办法是:
C-h a 关于输入的特定信息的帮助。
C-h k 关于组合按键的帮助。
C-h i 查看超链接形式的帮助文档
C-h m 有关于当前模式的信息。
C-h p 按照关键词查找相关帮助。
C-h t Emacs自带的简单入门教程。
在这一段结束以前,请不要忘了任何时候你觉得输错了组合按键序列,请按下 C-g 多次。直到迷你缓冲区内出现 Quit 字样就可以重新输入正确的按键序列了。(*2)
二、使用Emacs进行编辑:
现在我们正式进入Emacs编辑文本操作的学习。
@1.移动光标。在使用Emacs 时除了使用上下左右键、在OSX上用鼠标滚轮控制光标纵向移动外我们还需要记住几个组合键。
C-f 向前移动一个字符。(forward)
C-b 向后移动一个字符。(backward)
M-f 向前移动一个词。
M-b 向后移动一个词。
C-n 将光标移动到下一行。(next)
C-p 将光标移动到上一行。(previous)
既然使用鼠标和方向键移动那么方便,我们为什么还要花时间记忆这些组合键呢?因为[1].在没有鼠标或者键盘上没有方向键(比如某些服务器上)我们还能方便地编辑文本。[2].在学会使用以下命令后,你便会发现这些组合键的妙处——
C-u 给一个组合键命令加参数
假设现在的光标位置是这样 |aaaaa 管道符代表光标。我们可以使用五次C-f来把光标移动到这个位置 aaaaa| 。我们还可以输入这样的按键序列:C-u 5 C-b 它的效果等于五次 C-f 之行后的效果。所以聪明的你猜到了吗?C-u 加一个十进制数字,再添上一个组合键命令。就是将那个组合键命令执行十进制整数次。
这样的话,如果光标现在处在第一行,要移动到第五行的话只需要执行 C-u 4 C-n。因为 5-1=4. 其实直接输入 C-u C-n 也能达到同样的效果。因为 C-u 组合键后不加参数就表示已经加上了默认的参数 4。那么 C-u C-u 呢?就表示 C-u 4*4 = C-u 16 也就是说执行后面的命令16次。C-u C-u C-u 就是 64 次了。如果一个文件有超过100行字符,并且现在光标插入符在第一行,那么移动到第65行只需要 C-u C-u C-u C-n(按组合键的速度比按下组合键后再去按65要迅速的多)。要将光标移动到第72行只需要依次按下 C-u C-u C-u C-n C-u 7 C-n。1+64=65; 72-65=7。这里 C-u C-u C-u 可以合并为 C-u-u-u;但是 C-u C-u C-u C-n 不能合并为 C-u-u-u-n。因为 C-u-u-u-n 的执行结果是打印64个n。
上面是光标的纵向移动组合键。继续来看能使光标横向移动的组合键。
C-a 将光标移动到行首。(beginning of line)
C-e 将光标移动到行尾。(end of line)
M-a 将光标移动到句首。
M-e 将光标移动到句尾。
再来看将光标一次移动一大块儿的组合键:
M-{ 将光标移动到段首。
M-} 将光标移动到段尾。
C-x [ 将光标移动到页首。
C-x ] 将光标移动到页尾。
M-< 将光标移动到整个缓冲区的头部。
M-> 将光标移动到整个缓冲区的尾部。
以下的组合键可以在移动光标时进行括号匹配。令”->”符号之前是按下组合键前的状态,“->”符号之后是按下组合键后的状态,“|”表示插入符位置,“(”与“)”同为字符,那么:
C-M-b ()(()(())|) -> ()(()(|()))
C-M-f |()(()(())) -> ()|(()(()))
C-M-u ()(()|(())) -> ()|(()(())) 将光标移到外层括号处。
C-M-d ()|(()(())) -> ()(|()(())) 将光标移到内层括号处。
下面的组合键用来在一个函数的内部移动光标。
C-M-a 将光标移动到函数定义(definition)的首部。(注意不是查找函数声明[declaration]。)
C-M-e 将光标移动到函数定义(definition)的尾部。
@2.插入字符
接下来我将介绍一个实用的命令。该命令用来引用一个ASCII字符——
C-q x 这里的x代表任何一个含有Ascii字符的按键。比如我要在文本文件当中插入一个ESC字符。字符ESC在Ascii码表内的十进制编码是27。使用 C-q ESC 将Ascii字符 0x1b 插入到文本中后,Emacs在窗体的相应位置上显示“^[”字样。
让我们联合使用 C-u 和 C-q 这两个组合键。在某一行某一处插入64个英文小写字母a:C-u C-u C-u C-q a
@3.剪切文本
C-d 剪切一个字符。剪切刚才的64个a:C-u C-u C-u C-b C-u C-u C-u C-d。使用C-b是因为要将光标向行首位置移动64次再进行剪切。
DEL 剪切插入符/光标右侧的一个字符。
M-d 剪切一个单词/标识符。
C-k 从当前光标剪切到行尾,但是不会剪切本行后跟着的那个换行回车符。
C-u -1 C-k 从当前光标剪切到行首。如果光标已经在行首则剪切光标所在行的上面一行。
M-k 从当前光标剪切到句尾。
C-u -1 M-k 从当前光标剪切到句首。如果光标已经在句首则剪切光标所在句的上面一句。
C-M-k 剪切光标所在的括号对儿。
C-u -1 C-M-K 剪切光标所在的括号对儿之前的括号对儿。
@4.粘贴
如果你已经会使用上面的组合键剪切文本了。如何将剪切掉的文本拽(yank)回来呢?答案是使用——
C-y 拽回/粘贴命令。int |main(void) 在此处使用M-d剪切掉单词main,再将光标移动到此处:int (void)|。使用C-y命令后文本就变成了:int (void)main
@5.撤销重做
C-_ 使用 Ctrl+减号进行撤销操作。如果你因为Windows下Notepad有限的撤销次数而心有余悸。现在请放心吧,因为Emacs可以无限次撤销!Emacs的操作链表可以无限延长,这使得你可以进行无限次的撤销操作!(当然操作链表的大小受计算机存储设备大小的制约。)另外 C-x u 命令也可以进行撤销重做操作。
@6.如何复制文本呢?呃……Emacs好像不提供特别的复制功能。但是你可以先剪切,再在原地粘贴,然后到别处再进行无限次的粘贴。
@7.选中文本
M-@ 选中一个单词。
M-h 选中一个段落。
C-M-@ 选中一个括号。
C-M-h 选中一个函数。
C-x C-p 选中一页。
C-x h 选中整个缓冲区。
C-@ C-@ 选中一个区域。使用这个组合键后就可以使用方向键或者光标移动系列组合键来自由地选中一个区域。
选中后的文本可以被进行以下操作:
C-x C-x 交换选中开始标记与选中区域的结束标记。如果在此处 |apple 按下 M-@ 则从 a 标记到了 e。使用 C-x C-x 后。从 e 选中到 a。
C-w 剪切掉选中区域。
M-w 先剪切掉选中区域,再粘贴回去。所以就相当于复制。
M-u 将选中区域内的小写字母变成大写字母。
M-l 将选中区域内的大写字母变成小写字母。
@8.查找文本
#i.增进搜索
增进搜索过程中,Emacs会高亮出当前页面上所有与目标内容匹配的字符串。多从使用 C-s 做连续向下查找。多次使用 C-r 做连续向上查找。
C-s 使用该组合键后,在迷你缓冲区内键入你要搜索的文字。连续使用 C-s 组合键来向下查找文本。使用 RET (回车键) 结束查找。
C-r Emacs对输入的文本做逆向查找。
#ii.非增进搜索
C-s RET string RET 将string替换为你要非增进搜索的内容。
#iii.复杂内容的非增进搜索
在这种形式的搜索中,你可以在要搜索的字符串中掺进任意数量的单词,还允许有回车换行符出现在其中。
C-s RET C-w string RET 将string替换为你要进行增强型非增进搜索的内容。
@9.查询替换文本
M-% 使用此组合键后,Emacs在响应区首先提示你输入被替换的内容。按下回车键后Emacs再次提示输入替换成的内容。然后使用空格键进行替换。DEL和ESC键不执行替换。RET(回车键)结束查询替换。“.”英文句号键进行一次替换。“!”感叹号替换缓冲区中所有内容。
本段结束前,请不要忘了任何时候你觉得输错了组合按键序列,请按下 C-g 三次。Emacs会存储你输入的3个有效按键组合。所以三次 C-g 就可以打断Emacs正在处理的所有事情了。每一次按下 C-g 组合键后终端都会收到一个‘\a’“响铃”字符。如果你的计算机连接声频播放设备,你应该会听到一声响铃。(*3)
三、Emacs其他模式的简单介绍
@1.其他程序语言的编辑模式
Emacs会自动根据文件扩展名选择相应的编辑模式从而对词汇进行高亮显示。你也可以自己手动选择编辑模式。方式如下——
M-x c-mode 进入 C语言的编辑模式。
M-x pascal-mode 进入 Pascal语言的编辑模式。
注意:在输入 M-x pas 后按下 TAB 键,微型缓冲区内的字符串就会被自动完成为:M-x pascal- 输入 mode,或者输入 m 后再次按下 TAB 键完成键入。按下回车即可更改模式。
Emacs还提供更多的模式。请查看相关帮助文档。
@2.十六进制编辑器模式 hexl-mode
M-x hexl-mode 进入十六进制编辑器模式。十六进制编辑器模式如下图所示:
@3.Emacs与gdb搭档
如果你安装了gdb,在Emacs中使用 M-x compile 编译C文件后即可在Emacs中使用gdb调试。对!不用退出Emacs,回到终端中运行gdb。gdb与Emacs完美融合!输入 M-x gdb 即可开启gdb调试器。
注意要使用gdb调试则编译C文件时使用 -g 参数生成符号表。
@4.小游戏
Emacs内置很多有趣的小游戏!它们是——
M-x tetris 俄罗斯方块。
M-x snake 贪吃蛇。
M-x doctor 心理医生。
这是关于Emacs心理医生的相关资料:https://en.wikipedia.org/wiki/ELIZA
其他游戏请参见[4.其他资料]一节。
3.结束语
@a.虽然傻瓜相机不是给傻瓜用的,但是单反相机傻瓜肯定用不了——作为单反相机一般的Emacs就是这样诱人。如果你有操作复杂机械的冲动,请使用Emacs吧!
@b.即使Emacs界面动感丰富,代码高亮后色彩鲜艳诱人,眼花缭乱的操作不胜枚举,片刻学习过后你便能对其驾轻就熟,继而行云流水的操作让旁人望尘莫及垂涎三尺自愧不如,然后你便能自鸣得意对Emacs夸夸其谈白驹过隙间技高一筹的你便能使用Emacs用高山流水般的代码让别人措手不及。但是请不要忘了——永远不要使自己屈服于在短时间内处理大量事物的诱惑之下。专注于你的代码!
4.其它资料
@1.在OSX下Emacs有脱离终端的独立APP应用:https://emacsformacosx.com/
@2.适用于Windows平台上的Emacs在这里:http://ftpmirror.gnu.org/emacs/windows/
@3.GNU网站上的Emacs使用手册在此:https://www.gnu.org/software/emacs/manual/
@4.这个网页上有emacs的游戏大汇总:https://www.emacswiki.org/emacs/CategoryGames
如果你有有关Emacs的其他好玩的信息,或者对本文有任何意见和建议,请回帖参与讨论:)
页:
[1]