装逼利器emacs(1)

| 分类 软件使用  | 标签 emacs 

理性对待emacs

  今天来说说编程软件中的装逼神器emacs。

  如果编程软件界有敏感词的话,那么毫无疑问,emacs必定是其中之一。作为一个难以上手却配置灵活的软件,emacs历来是众多码农们宗教战争时的必争之地。尤其它的狂热信徒,把他捧到天上还不算,还总要把vs、eclipse等IDE给黑出翔来才肯善罢甘休。说来惭愧,当年我也是狂热分子中的一员:先是用emacs替换掉IDE,后又用emacs替换掉音乐播放器,后又用emacs替换掉图片查看软件;然后,便是和身边的人交流emacs的奇葩功能,和用vim的人打嘴仗……

  现在看来,这股脑残粉的劲儿就跟当年红卫兵一个德行。emacs固然是有不少优秀的功能,但是事事交给它真的是非常的不明智的。不过话又说回来了,谁没有年轻糊涂的时候呢?

  于是,我准备把这几年来使用emacs的心得整理一下。新手们可以拿来做个参考,老手们直接无视掉我就OK了。

上手

  相比较打开之后什么都不能输入的vim,emacs上手还是要容易些的。好歹你朝里面输入东西,不会叮叮叮发出一大堆警告的声音。但是因为和常用编辑软件的快捷键不同,它还是会吓跑一大帮子的人。这里我建议用鼠标点开help菜单栏,第一项”Emacs Tutorial”就是一个非常不错的入门教程。把这个教程跟着学下来,基本的文本编辑的快捷键还是能学个差不多的。

  我是一个很懒的人,到处都有的东西我不想重复。所以emacs常用快捷键,这里我就不写了。教程里有,谷歌上也是一搜一大把。

文本编辑

  从文本编辑的角度看,emacs是有它的优势的。因为它老本行就是做文本编辑,所以它有很多方便的功能。这里把我用过的几个列举一下:

列编辑

  顾名思义,列编辑就是对列的操作。比如说你在写python或者shell这种不支持多行注释的代码的时候,发现需要把好几行注释掉。那怎么办,总不能逐行加#吧。这个时候,emacs的列编辑就可以派上用场了。把要注释的那几列选中,然后用组合键“Ctrl-x r t”,输入#,就大公告成了。

  其实用列编辑这个说法是不准确的。emacs操作的是一个矩阵区域:左上角是所选区域的起始点,右下角和当前光标位置。

  如下图所示:绿色部分表示编辑器选中的部分。以include的n为左上角,main的n为右下角,构成的矩形框就是emacs矩阵操作的目标。

  对于这个矩形框,可以执行删除,插入,复制,剪切等操作。这里给出常用的组合键:

  • Ctrl-x r o,插入空白空格(即矩形中每个字符都换成空格)
  • Ctrl-x r d,删除矩形区域
  • Ctrl-x r t,用字符替换矩形区域

  更多详细列编辑的命令可以上网搜一下。这里就不说了。

递归编辑

  比如你写了一个函数

  void function1(int a, int b)

  很多地方调用了这个函数。后来发现有些地方需要替换成原型是这样子的函数

  void function2(int a)

  怎么办呢?直接把function1替换成function2是不行的。因为函数的原型已经不一样了。写脚本也不太容易,你得根据代码的上下文判断什么地方需要换掉。这个时候,就需要递归编辑了。

  首先,用Meta-%调用emacs的查询式替换(Query-Replace),每查询到一个地方,就可以用Ctrl-r进入递归编辑。这样,当前的查询就被挂起了。你可以像平常一样编辑文本。编辑好后,再用Ctrl-Meta-c退出编辑,就又回到了查询的状态。继续查询下一条。

  当然,这个功能可能还不够屌。但当你考虑到有多个文件需要把function1修改成function2的话,你就能发现emacs是多么逆天了。结合emacs的文件夹浏览功能,你可以在多个文件中执行询问式查询和递归编辑。是不是有种很酷的感觉?

正则表达式替换

  这个就不用解释了吧。把某个模式的字符串替换掉。

当IDE使用

  因为emacs扩展极为方便,所以人民群众给emacs写了各种各样的插件:自动补全,代码跳转,项目树浏览……把这些功能配备上,emacs几乎像模像样的拼的上半个IDE了。但我其实不是很建议用emacs来当IDE使用的。一个是插件多了,emacs速度就慢了;二个么,这些插件的功能真的其实也只是差强人意而已,和专门开发的IDE比起来还是有些差距的。有好用的IDE不用,偏用emacs,这几乎就是和自己过不去。

  当然还是不排除有些人硬要和自己过不去的,我还是把我使用经验分享一下吧。

C/C++

####自动补全   自动补全可以使用一个叫做auto-completion的插件,词法分析做的不错,速度也快,用户体验也不错。因为是词法补全,所以可以在编辑任何语言时使用;也因为仅仅是词法分析,所以只能检索到已打开文件中的单词。这个插件有一个蛮不错的地方在于如果你在输入一个文件路径,他能默认把目录中的文件给补全出来,这一点非常好用。

  如果C/C++想做语义的补全,比如C++想补全stl库或其他类的成员函数。可以使用auto-completion-clang这个插件,它是在auto-completion基础上开发的,用clang/clang++编译器的补全功能来做语义式补全。这个效果其实还是蛮赞的。如果配置好了头文件路径,可以拿来补全各种库函数的。这里,还是要对苹果公司做的这个开源编译器表示十二分的敬意。

####编译和修改   编译上,老老实实写Makefile。编译错误可以直接看到,用Ctrl-x `的组合键可以逐个查看语法错误并修改。

####调试   用Meta-x快捷键,输入命令gdb调用gdb调试器,用起来也还算舒服吧。可问题是gdb在调试C++的stl库上不很给力。

####代码跳转   ctags生成符号文件然后跳转,只有词法跳转,没有语义分析。也没用过很好用的插件,完全无法比得过IDE。

Java,python等其他语言

  别多想,eclipse真的比emacs好用多了。我用emacs写过Java,那个补全真是叫慢。

lisp及其各种方言

  目测这应该是emacs在编程上唯一能够大放异彩的语言了吧。我只写过一点emacs lisp的代码,还有一些scheme的代码,用了括号匹配和括号高亮的两个插件,体验还是不错的。关于scheme编程环境的配置大家可以参考王垠大神的这篇博客。只知道他不让转载,链接过去应该是可以的吧。


上一篇     下一篇