Pulpcode

捕获,搅碎,拼接,吞咽

0%

闲扯编辑器

如果要让我列举出自己曾经做过哪些浪费时间的事,我觉得“折腾编辑器”必须算其中之一。但是我为什么还要写这样一篇博客来聊编辑器呢?因为我报着“来都来了xxx”的态度,觉得总要总结点什么东西出来,否则不白浪费这么多时间。来写这样一篇博客。

这篇博客我会主要提及linux的两种重要的编辑器vim, emacs还有现在大多数平台被大多数人接受使用的sublime。还有其它的一些ide比如IDEA, visual studio。

从IDE到编辑器

其实大部分人开始写代码的时候,都是使用IDE进行开发的,那些写c++的可能最先使用的vc9.0,写java的最先使用Eclipse,还有一些像是php,python这样的动态语言,也都有IDE。然后这些人大部分最后都转战到编辑器上了,可能是Editplus,或者是sublime。甚至是古老的notepad++。这大部分原因都出自一句叫:“IDE会害了你,会用编辑器写代码的人才真正的懂代码。”等你以后写了几年代码,你会觉得这话真的是扯淡。但是很神奇的是就在当年大家都不会写代码的时候,这话仿佛真的像什么“箴言”一般,让大部分同学卸了ide改用编辑器甚至是记事本写代码。而后来有一部分人转战vim和emacs,把这两个编辑器的配置写的越来越大。让它们变得越来越像一个IDE。他们说用vim或者emacs的快捷键写代码是最快的,还称一个是编辑器之神和神之编辑器。不过你写了几年代码再想想这句话还是经不起推敲,什么时候写代码快,成了衡量程序员的指标了?再说大部分快速移动的功能是个编辑器都有啊。后来有一部分开始觉得这些东西很蠢,开始转战使用IDE。还有另一部分人仍然使用编辑器开发代码。不愿意的换的人大部分是因为已经都熟练了。好不容易折腾这么多日子,突然转战了,这不就白折腾了么,所以迟迟不愿意放弃,当然你说这是“沉没成本”,但是“沉没成本”真的只是理性的说法,大部分人都不会简单的接受“沉没成本”这一事实的。就像我不愿意接受“折腾编辑器是白折腾”这一事实,而去写一篇博客一样。

不过我还看过一些博主把对vim和emacs的崇拜发展成如宗教般的沉迷和精神寄托。仿佛脑海中浮现一个精专的工匠,一个偶像,活在“什么问题都能用一个emacs解决,或者一个人用vim维护了一套百万行的代码。”的传说之中。
这种一根筋的沉迷就像早些年那些沉迷于武侠小说中,武功盖世却又不争夺功名利禄的侠客一样。

在总结那些编辑器的特点,设计理念,使用方式,实现原理之前,我先来总结一下如果作为一个编辑开发工具,什么才是我最关心,最想使用的功能?

首先就是快速移动,很多人觉得vim等编辑器比ide好的地方,就是可以用键盘快速移动,而不用再鼠标和键盘之间来回切。不过这个说法其实站不住脚,因为大部分IDE都有快速移动,而且还支持vim和emacs模式的移动快捷键扩展。

然后是通用的“复制,剪贴,粘贴,删除,撤销和重做 ”的操作。这其中包括一个“选择某一个单位,再进行操作”的动作,比如说选择一行,选择一个单词,选择一个段落。不过我觉得记这些命令都不如一个简单的鼠标选中来的实在。

还有就是查找功能,包括在文件中查找单词,或者是在一个目录中查找某个单词,或者是查找某个文件。不过大部分查找都会配一个替换功能。

然后是编辑多个窗口的文件,分页或者是分屏,打开,关闭一个文件。这些看上去也没有鼠标来的爽快。

最后包括其它一些对程序员很实用的功能,比如语法高亮,智能提示,批量编辑,录制宏,代码模板,注释与反注释,查看目录接口,类结构,显示文件行号,find useage, go to decleartion, go to define,还有重构式替换,删除。还有跟程序运行相关的“运行,debug,断点。”

vim

如果现在我还有用vim的场景,那一定是因为我登录了一台linux服务器,然后发现没什么好的编辑器可以用了,而且大部分linux是不会预装emacs的。否则我是不会用vim的。vim最核心的功能应该是可以再命令模式和插入模式下切换。来方便的在一个shell里面编辑代码。
在《unix编程艺术》这本书里面,提到vim的简明扼要恰恰符合unix简约主义的设计思维:“只做一件事,把它做好。”而且vim的设计思路就来源于ed。
不过你用过ed那种难用的编辑器,就觉得vim真的是太好用了。我觉得使用图形化界面的人同样也觉得vim太难用了。尤其是那些吃过苦的前辈,他们肯定以为这些有vs不用的后辈,使用Turbo C来写代码,一定在搞什么浪漫主义。

vim的快速移动和快速编辑来源于把文本,以字符,单词,行,段,页的单位进行划分,然后在这些单位上进行移动,删除,复制,粘贴,修改。而且还能够加入数字来扩展这些命令,所以这些命令看上去就变成了“数字+命令+单位”,你现在所看到的键盘绑定,宏,扩展配置,多缓冲区,鼠标等都是后来一步一步加入的功能,搞得都有人在windows下使用vim。不过有一部分人对这些扩展的功能嗤之以鼻,觉得这恰恰让vim越来越不像vim了,不符合之前的设计哲学。对这件事我举一个例子吧,你觉得在vim上配置各种键盘和高亮提示是一件提升效率的时,然而当你遇到一个问题需要别人帮你解决的时候,你的伙伴完全不了解你的那套配置,这就搞得人家很容易就按错了。所以接下来你们还要为沟通快捷键的问题讨论一番。所以照这个理论,鼠标这一门槛低的工具,永远是最快的编辑方式,因为它降低了学习成本,包括降低与他人沟通的成本。

在vim下面开发程序,如果你不想每次开发完切出去,然后在shell下运行代码,再切回去改程序的话。要么选择一个插件来让你在后台运行代码,然后将结果显示在屏幕上,或者选择tmux这样的分shell软件,让你在某一个子shell下开vim。不过这种分屏软件有一个问题是可能会让你好不容易配置的某个vim插件失效,比如语法高亮。而且在某些纯shell的环境,比如没安装x windos的shell,它支持的颜色少的可怜,比如256色,可能都不能支持你配的那个代码高亮主题,比如zenburn。再说一点,shell下vim的代码补全提示,是在重绘原来的shell窗口(其实每一次编辑操作都是在重绘),我的意思是shell显示应该只有一层,毕竟它不是图形界面,所以你会觉得那个shell下显示的下拉提示很别扭,而且不知怎么就卡死了。关于我提到的编辑器最想使用的功能,vim的那部分实现方式,我都在之前的博客写过了:暴力的使用vim

emacs

gnu

你一定听到过“emacs不是一个编辑器,是一个操作系统”的言论,之所以这样说,是因为emacs最初就被设计成“可编程的编辑器”。他的设计者理查德·马修·斯托曼是哈佛大学毕业的黑客,也是GNU的创始人。可以说emacs首先是一个解释器,或者说是一种Lisp的方言,Emacs Lisp的解释器。它可以解释运行elisp语言。而且emacs在设计的时候更像是一个架子,可以把编辑器套在这个架子里面,所以多文件编辑,多buffer是emacs很早就支持的功能,同时也可以运行别的unix进程,让emacs和这些进程进行交互。这也就是为什么他们传说emacs可以煮咖啡,你想,一个解释器,还可以和别的进程交互,那还有什么不能干呢?只要这个咖啡机提供协议就可以了啊。而且一个编辑缓冲区还可以开启一个主模式和多个子模式,使得针对不同功能的文本进行编辑。比如代码模式或者文档阅读模式。一句话解释的话:“emacs是一个elisp虚拟机,一个解释器。”,而这可以说是我曾经最迷恋emacs的原因。

有一个关于“用emacs我小拇指疼”的梗,这是因为emacs的按键绑定是各种功能键的组合:比如C-n 向下移动一个字符。所以你在使用emacs的时候,会让自己看上去张牙舞爪的。

刚才提到emacs是一个lisp解释器,lisp代码长这样:

1
2
(add-hook 'python-mode-hook
(lambda () (highlight-lines-matching-regexp ".\\{81\\}" "red")))

你发现lisp本身就是由一堆括号所“包裹”住的代码,这也是lisp语言表达能力强大的原因(本身就是一棵树)。同时上面的这段代码也算是一个emacs配置,它用来将那些一行超过80个字符的代码标记为红色。对比下vim的配置文件,你会发现emacs lisp所提供的功能肯定远比一个类bash的配置提供的多。因为相比较而言,vim就像是将编辑器的部分功能支持为可配置的。而emacs更像将一个编辑器的功能制作成封装成一套完整的api,并提供一个解释器,供你编写程序去调用这些api。比如你可以将一个函数绑定到一个键组合上,通过按键来调用这个函数,或者直接打开emacs的交互解释器,运行这个函数。

1
(global-set-key (kbd "M-g") 'goto-line)

同时因为emacs可以开其它的进程进行交互,所以在一个emacs里开发,调试,运行代码也变得容易的多。也是因为可以开进程的原因,emacs可以有一个方便的文件管理器功能,或者是收发邮件功能,git版本控制功能,或者干脆开一个shell,甚至是在emacs里开一个vim,玩一些字符相关的游戏。

还有我要说的一点是emacs的快捷键要比vim实用一点,不要看emacs组合式移动快捷键按起来要比vim麻烦,但实际上,这种快捷键在大多数编辑器,ide,甚至是shell上都是默认支持这种按键的。比如:

1
2
3
C-b 向左移动一个字符
C-f 向右移动一个字符
M-Backspace 向前删除一个单词

所以有时我宁愿去记emacs的快捷键。

同样的,对于上面提到的常用编辑功能的emacs版本,我也写过一篇博客去总结。暴力的使用emacs

sublime

sublime应该是现在最受欢迎的文本编辑器了吧,简单的来说就是图形界面+鼠标,自定义插件扩展功能。而且自带的sublime主题确实也挺好看的。我在sublime中最爱使用的功能就是批量编辑,也就是按住option,按住鼠标左键然后拖动。同时另一个常使用的功能就是command+shift+p启动Package Control。我最常用的插件就是格式化xml和格式化json的插件:Index XML。而且我很少在sublime上写代码。写博客比较多。

IDE

等你完成了那些所谓的:“自己动手一步步搭建才是所谓的高手。”的弯路之后还是投抱ide的怀抱吧。这里能提供最高效的工作方式,即使你懒得记什么快捷键,一个鼠标来回点也够你用的了,而且不会慢到哪去的。而且我说过,你配的那些快捷键,将让给你指点程序的那些人难以使用。顺便说一句,你要让我说什么IDE是最好用的,那必须是Visual Studio。你会发现一件有趣的是,mac和linux上的人,给你讲各种设计理念和设计哲学。但windows从来不扯这些,他们仿佛就告诉你一件事:“我们就是好用,我们就是强大”。参看Visual Studio,office这样的软件就明白了。

其它

其实如果你仔细的去看一看早期的linux文本编辑命令,它们的使用方式和设计思路,都可以从中学习这些前辈们的智慧。比如unix中,每一个命令实现自己的功能,然后用管道将它们连在一起,让字符集从一头流向另一头。包括那些强大的sed命令。正则表达式,甚至是早期的ed编辑器。我觉得这些都能给你在平时的编码设计中带来一定的启发。甚至是给自己的编辑器写一些插件脚本之类的东西。

比如你要给自己的代码加上行号,让:

1
2
3
apple
banana
pear

变为:

1
2
3
1 apple
2 banana
3 pear