最好的编辑器Vim

背景

最近为了体验完整版的 org mode,准备入坑 Emacs,怕以后就没机会写这篇文章了,所以赶紧整理一下目前我用过的最好的编辑器 Vim 的强大之处。

一直以来,Vim 和 Emacs 作为众多 Unix 系统内置的编辑器,强大的功能吸引了很多用户,形成了两个派系,大家都有自己的坚持,但不可否认的是,这两个编辑器都是经历了数十年的考验,依然坚挺的优秀编辑器。

随着技术的不断更新,出现了很多现(卡)代(到)化(爆)的编辑器,于是有些人开始嘲讽,说只有你们这些跟不上时代的老家伙,才抱着过时的编辑器不放。认知的差别注定了这种争吵是不会有结果、也是没有意义的,不如自己动手试试,体验一下 Vim 的强大和不可替代之处。

设计

先介绍一下 Vim 设计上的一些独到之处,看看一个本身非常简洁的编辑器,是如何通过鲁棒的设计,展现出超级强大的扩展能力,以至于硬件发展到了今天,它也依然没有被淘汰。

模式

Vim 与现代很多入门门槛极低的编辑器的最大的区别就是,它是区分操作模式的,在不同的模式下,同样的按键会有截然不同的作用。

这样有一个非常明显的好处,就是快捷键的定义可以变得更简单。举个例子,编辑模式下,我们输入 p,就会插入一个字符 p,但是到了普通模式下,输入 p 会粘贴寄存器里的内容。

什么?只需要按一个键的快捷键?是不是很棒?实际上因为模式的存在,在 Vim 里面大量操作都可以只按一个键,大大减少了对小拇指的伤害,而且真的很快,手都不怎么需要挪动。

基于字符

Vim 里的键定义都是基于可见字符的,这也是一个和其他软件不太一样的地方。

通常一个快捷键的定义是与 keyCode 之类的硬件相关的值相绑定的,这使得在不同的键盘布局下,快捷键的定义变得复杂,比如日语键盘布局下,很多平时需要按 Shift 的字符,都不再需要 Shift 了。

而 Vim 中,一切基于可见字符,也就是说,不管你用什么方式,只要最终打出来的字符是一样的,起到的作用就是一样的。

可重复

Vim 基于可见字符的键设计,使得 Vim 中的所有操作,都可以被记录下来,可以重复。

就跟普通文本的复制粘贴一样,Vim 中的所有按键操作,也可以录制,然后重放。

举个例子,我们有一个很长的文本,要对每行做一个相同的排版,比如调整一下内容的顺序,加一些标点符号,总之就是一些无法用简单的查找替换完成的任务,用 Vim 来做就很简单了。只要开启按键录制,在第一行操作一次,然后重放 n 次,就完成了。

简单地说,就是可以通过按键录制的方式,实现类似编程的效果,快速完成大量重复操作。

键的组合

Vim 一直被诟病的一个问题就是学习曲线过于陡峭,以至于很多人根本不敢尝试,就已经放弃了。

实际上,一般的编辑功能很快就可以学会,只要了解了 Vim 的键的组合,就自然可以组合出各种操作了。

基础的 hjkl 方向移动,想必了解过 Vim 的人都已经知道了。重复一个操作,只需在前面加数字,比如 3j 就相当于按了3次 j,即向下移动3行。再举个例子,d 表示删除,但是它需要跟移动一起使用,比如 d3j,就是向下删除3行。

类似的操作还有很多,这里就不多说了,总结下来就是,Vim 将操作按照范围、次数、功能等做了细粒度的拆分,只需要分别记住每一类的快捷键,就可以自由组合了。

可扩展

Vim 本身是非常简单和轻量的,只有基本的文本操作能力,在文本处理方面已经比一般的编辑器要强大很多了。但是还有很多可以通过插件优化的空间,比如语法高亮、智能缩进、导出成特殊格式等等。以前可能受限于同步执行,不能做过重的工作;现在有了支持异步任务的 NeoVim 和 Vim 8,各种扩展功能应有尽有。

知乎有个帖子介绍了很多奇技淫巧,可以开阔一下眼界。

Vim 内置了 VimL 作为配置和开发语言,比较小众,很多插件都是基于 VimL 开发。除此之外,比较新的 Vim 已经内置 Lua,还可以非常方便地调用 Python、Node.js 等语言,从而让更多的开发者可以加入,贡献强大的插件。

顺便做一个广告,最近改进了一个插件,可以使用 Markdown 写 PPT,一键导出,非常酷炫。

使用

性能

前面已经说过,Vim 本身非常简单,简单到任何一个 Unix 系统都会内置它,即使是树莓派这么低端的设备,开一排 Vim 也没有任何压力,任何时候打开 Vim 编辑一个文件都是秒开,这一点就是各种现代化编辑器/IDE 完全无法比拟的。

以前的 Vim 是不支持异步操作的,所以比较慢的操作会阻塞主线程,导致卡顿。但是 NeoVim 的出现,也促使多年没有大动作的 Vim 升级到了 8,都加入了异步任务支持,这使得现代化的 Vim 性能得到了大大的提升,可以进行更多更复杂的操作,比如大项目实时 lint,完全可以媲美一般的 IDE。

纯键盘操作

Vim 的设计完全是基于键盘操作,而且所有按键都是可见字符,所以整个操作过程中,双手只需要放在主键盘区域,几乎不需要挪动。

而且文本操作通常都是要精确地选择某一个位置,某一段文字,才能进行后续操作。

试想一下,用鼠标选择一段文字,首先需要把手从主键盘区域挪到鼠标(或者触摸板)上,然后控制指针移动,一边移动一边判断位置,最后微调,再点击。这个过程是一个模糊的鼠标移动操作,很难再加速。

而如果通过键盘,输入一些指令,就完全不一样了。比如 10G 跳转到第10行,f" 找到第一个 ",然后 i 插入文本。几次按键之后就可以开始输入了,这个过程是准确的按键,只要手速够快,瞬间就可以完成。

文字利器

Vim 毕竟是一个比较 geek 的工具,所以对大多数人来说,可能会认为它是一个编程的工具。实际上,它就是一个单纯的文本编辑器,只要是文字,就可以用它来处理。

比如看小说,Vim 可以用快捷键翻页、跳转,自动拆分章节,记住上次的阅读位置。

又比如写博客,你正在看的这篇文章,就是我用 Vim 敲出来的。

还有数据分析、表格处理,我都是在 Vim 中完成。

所以我的日常,只需要一个开着 Vim 的命令行,和一个很多 tab 的 Chrome 就可以了。

总结

Vim 是一个设计非常棒的编辑器,它既可以很简单,也可以很复杂,可以胜任各种程度的文本编辑工作,用习惯了之后就成为了一种生活方式,每次打开一个输入框,都期望能有 Vim 的操作模式。

这也是为什么牛逼哄哄的 VSCode、Atom 等等编辑器都有对应的 Vim 模式,因为有很多习惯了 Vim 的用户,哪怕想去享受这些编辑器带来的额外体验,也不能放弃 Vim 的操作方式。甚至是 Chrome 都有对应的 Vim 插件,让我在浏览网页的时候也可以高效地键盘操作,可见 Vim 的这种设计带来的效率提升是可以延伸到其他领域的。

免责

最后声明一下,本文无意挑起编辑器之间的战争,只是从个人角度客观地阐述一个我用过的最好用的编辑器的一些特点。毕竟萝卜白菜,各有所爱,如果你不喜欢,大可略过。说不定下次,我就会说 Emacs 才是最好的编辑器了。😏


© 2020