macOS 效率系列 07 (番外): Vim 统天下

2019年9月18日 · 5 years ago

macOS 效率系列 07 (番外): Vim 统天下

本文为《macOS 效率系列》的番外,我们来聊聊 Vim 编辑器及其衍生品的前世今生。

但凡是程序员,无论前端、后台、客户端都应该使用过或者听说 Vim 这款所谓“编辑器中的神器”。多年以来和它的竞争对手 Emacs 一直是经典引战话题。跟“PHP 是最好的语言”、“缩进用 Tab 还是空格”、“大括号要不要换行”之类的战争类似,常在程序员中被人提及。

我没有用过 Emacs 所以本文只谈 Vim。和大多数现代的文本编辑器一诞生就支持 GUI 相反,Vim 是从终端开始的一个编辑器,虽然它也支持 GUI (gVim) 但是喜爱 Vim 用户大都在黑乎乎的命令行里使用它。

一、 Vim 编辑器的历史

1. vi 出现

Vim 是 vi 编辑器的加强版(Vi IMproved),vi 是几乎所有的类 Unix 系统的标配文本编辑器。读者朋友们若使用过 Linux 操作系统,无论用哪一个发行版,基本都开箱自带 vi。

vi 是一代神人 Bill Joy 开发的,我们在 macOS 效率系列 02: 在终端 Terminal 中运键如飞 提到 csh 也是他写的。关于这位 Sun 公司创始人的传奇故事还有很多,比如拒绝把 BBN 写的 TCP/IP 栈引入 Berkeley Unix 系统,因为他觉得 BBN 的版本太垃圾了,于是自己手搓了一个高性能版本。比如 2000 年他在 Wired 发表了《Why the Future Doesn't Need Us | WIRED》,里面提到未来的人工智能机器人,转基因技术和抗生素滥用等人类的科技发展对于整个地球生态这个复杂系统可能造成的深远影响的担忧。有兴趣的读者朋友不妨读读看。

在电子显示器出现以前,计算机使用打字机来进行人机交互。当时流行的文本编辑器都是所谓的"行编辑器(line editor)"。你通过键盘输入一行命令,然后计算机通过打印机把内容打印到纸上。所以你不可能实时看到所有文本内容,不然刷一下纸张就都打没了。

靠打印机交互的计算机

1970 年代贝尔实验室(Bell Labs)发行的 Unix 系统自带的文本编辑器叫做 ed,也是一个行编辑器,非常不友好。于是来自伦敦玛丽女王大学(Queen Mary University of London)的 George Coulouris 改进了一下写了个改进版叫做 em。

他到伯克利大学的时候给很多人演示了这个编辑器。Bill 对这个东西非常感兴趣,于是要来了代码(装在一个磁带里),和同学 Chuck Haley 一起写了个 em 的改进版叫做 en,然后又拓展了 en 成了 ex(EXtended)。再后来电子显示器开始出现了,Bill 给自己的 ex 编辑写了个全屏版,于是就有了 vi。

现在 Vi 和 Vim 里还保留了 ex 模式,输入 : 就是 ex 模式。常见的命令比如:

:1,2 p // 打印 1-2 行的内容
:1,2 d // 删除 1-2 行的内容
:1,2 m 12 // 把 1-2 行移动到 12 行下面
:1,2 co 12 // 把 1-2 行的内容复制并粘贴到 12 行下面
:= // 显示总行数

显然这些命令都是为了打印机交互而设计的。

Bill 在开发 vi 的时候使用的是 Lear Siegler 公司的 ADM-3A 终端。

ADM-3A

他的键盘布局长这样:

ADM-3A Keyboard Layout

看到这里大家应该就能明白为什么 Vim 的键盘设计是 hjkl 为左下上右了,以及为什么 Esc 键那么常用了。按照 ADM-3A 这么紧凑的键盘布局,基本上双手不需要过多移动就能完成大部分工作。

题外:那么为什么现在常用的键盘用是 Tab 键取代了 Esc 键的位置呢?那是因为大 IBM 崛起了 XD

2. Vim

Vim

vi 流行起来以后大家都想用这个编辑器,但当时 ex 和 vi 都是 AT&T 的知识产权。如果想在 Unix 以外的平台使用 vi 你就得自己 clone 下来改一波。于是在这期间出现 vi 的许多个衍生版:

  • nvi - 1980 for 4BSD
  • calvin - 1987 for DOS
  • vile - 1990 for DOS
  • stevie - 1987 for Atari ST
  • elvis - 1990 for Minix and 386BSD
  • vim - 1991 for Amiga
  • viper - 1995 for Emacs
  • elwin - 1995 for Windows
  • lemmy - 2002 for Windows

1988 年来自荷兰的程序员 Bram Moolenaar 为了在 Amiga 机器上(Commodore International 公司生产的机器。这家公司1954 年成立,曾开发过全球最畅销的台式电脑 Commodore 64,后来在 1994 年破产。)使用 vi 自己移植了一个版本,叫做"Vi IMitation"。直译成中文就是 Vi 的模仿版。后来改名为"Vi IMproved"也就是 Vi 的改进版,移植到了许多其他平台。当时 Vi 在 Unix 平台还是非常受欢迎的编辑器,大家对 Vim 心存疑虑,不知道它的质量是否真的称得上 Vi "改进版"。直到 1992 年 Vim 首次在 Unix 平台发布后迅速蹿升为最流行的文本编辑器。

Vim 项目至今仍在活跃迭代,截止本文发布之日,Vim 最新的版本为 8.1.2052。

时间 版本特性
1991 Nov 2 Vim 1.14: First release (on Fred Fish disk #591).
1992 Vim 1.22: Port to Unix. Vim now competes with Vi.
1994 Aug 12 Vim 3.0: Support for multiple buffers and windows.
1996 May 29 Vim 4.0: Graphical User Interface (largely by Robert Webb).
1998 Feb 19 Vim 5.0: Syntax coloring/highlighting.
2001 Sep 26 Vim 6.0: Folding, plugins, vertical split.
2006 May 8 Vim 7.0: Spell check, omni completion, undo branches, tabs.
2016 Sep 12 Vim 8.0: Jobs, async I/O, native packages.

二、什么人需要学习 Vim

一直以来 Vim 项目都以跨平台的目标在编写,所以代码非常容易被移植。造成的结果就是目前你可以在几乎所有平台上使用 Vim。

从 Vi 到 Vim 我们可以看到这个编辑器有极重的历史痕迹。像是全键盘操作,Terminal Style 的 UI 之类的。对于已经习惯了鼠标操作的现代用户来说,Vim 的学习门槛确实比较高。但是入门以后可以在全平台轻松使用这个优点还是很棒的。

作为一个程序员,除非是纯粹面向 Windows 生态并且不做也不需要了解任何服务器相关开发的人,否则几乎绕不开"终端"这个东西。我相信一个好的程序员不可能没用过终端命令行。

当你设置一台新的服务器时,常见的选择是用 Linux 系统,远程 SSH 登录操作,就算使用 Docker,你也得先配置好 Docker 环境。

当你使用 macOS 系统的时候,GUI 可以满足日常轻量任务,但是跑个脚本自动化,跑个 git 代码管理什么的还是终端更加高效。

而只要你在终端使用文本编辑器,基本就会遇到 Vim。学会 Vim 可以一招鲜吃遍天。这大概是学习 Vim 最大的好处。

至于用 Vim 来取代 IDE 进行工程项目我倒觉得不一定合适。许多现代编辑器和 IDE 都设计得非常优秀,可以帮我们节省大量的时间。iOS 和 Android 开发需要用 Xcode 和 Android Studio 有其特殊性且不提,Sublime Text,Visual Studio Code 都有非常实用的 UI 功能和丰富的插件库。通过鼠标和键盘结合,也能非常高效地完成任务,同时入门的难度也变得很低。

所以虽然日常工作已不再依赖 Vim 编辑器了,但是学习实用 Vim 依然能帮助我们在多种系统间无缝切换。Vim 的键位设计也让用户双手无需离开基本位置就能完全所有任务,这点让许多追求高效的用户十分着迷。于是就有了很多 Vim-like 的插件。

三、Vim-like

Sublime Text, Visual Studio Code, Xcode 之类的编辑器都有 Vim 操作的插件。可以说只要是个主流编辑器都有人给他加了个 Vim 模式。

不仅编辑器,浏览器也有许多 Vim 的忠实粉丝。比如早在 IE 6 还统治这个世界的时候,Firefox 强大的插件系统就催生了一个非常厉害的项目,叫做 Vimperator

Vimperator

当时 Chrome 尚未崛起,Firefox 的插件能力还很强大,允许用户把浏览器改成千奇百怪的形态。再结合 Stylish 自定义浏览器的样式,可以实现没有标题栏,没有搜索框,没有 Tab,只有地址栏的全屏体验。使用全键盘操作,无需鼠标参与,受到一众 Geek 的喜爱。

后来 Chrome 开始版本号大战之后,无需 Reload 的插件系统,极其迅速的启动、浏览体验把 Firefox 一举击垮。Firefox 也在版本号大战开始后不久,把插件系统改成类似 Chrome 的开发者友好向,同时也丧失了更加强大的自定义性。

期间 Vimperator 项目团队还因为意见分歧,分裂出了 Tridactyl 项目。Vimperator 在 Firefox 大幅修改插件系统之后宣告结束。Tridactyl 目前还活着,不过我早已转投 Chrome 阵营,没再使用过 Firefox 了。

Chrome 上自然也有类似的插件比如: Vimium。但是由于 Chrome 插件的设计,这东西必须等到网页加载完后才能加载自己的逻辑,所以加载过程中你无法使用 hjkl 来滚动页面。同时 Chrome 插件的能力也相当有限,以前 Vimperator 可以通过 : 命令模式对整个浏览器进行各种操作,可以使用 / 进行当前页面搜索并对可点击区域弹出数字标签然后模拟鼠标点击等等。

介绍如何使用这些类 Vim 体验的插件的文章很多,本文不再赘述,有兴趣的读者朋友可以自行 Google 尝试:

Vim-like 软件还有很多,程序员圈子对 Vim 的热情不减,除了情怀,更多是因为其高效的特性。丰富的插件系统和同样丰富的插件管理器,可以自由 map 的快捷键设置,可以在多个系统共享的 .vimrc 配置文件,以及开源,这些非常 geek 的特质让 Vim 成为程序员们心之向往的一代神器。

P.S. 感谢 @RoCry, @Jake 以及许多小伙伴在过去岁月中的推荐与交流,macOS 效率系列中提到的许多工具都来自和朋友们的交流与讨论

参考资料

相关链接