mengma2008
mengma2008

都 2022 年了,为什么我还在用 Vim

创作者的工具,追求的应该是效率,而非易用。

TL;DR 太长不看

  • Vim 是强大高效灵活优雅的文本编辑器;
  • 使用 Vim 是复利投资,也是有趣的探索;
  • 所有常见操作系统都有 Vim,你的电脑里可能已经预装了它;
  • Vim 有无数强大插件可以提升你的编辑效率;
  • 要开始使用 Vim,掌握几个基本功能就够了;
  • 唯一需要的,是不断尝试、总结、改进的练习心态;

Vim 的最小必要知识

  1. Vim 用户的最高理想,是以思考的速度编辑文本。也许没有人能真正实现这一理想,但是有些人的确很接近。
  2. Vim 是世界上寿命最长的软件之一,至今已有 30 年历史,而且还在持续改进中。它的灵感之源是 Bill Joy 在上世纪七十年代所写的 vi,而 vi 的前身是伴随着 Unix 诞生的 ed。Vim,就是「Vi IMproved」。
  3. 使用 Vim 时无需鼠标。Vim 支持鼠标,但是 Vim 用户嫌弃鼠标拖慢了他们的速度。
  4. Vim 有庞大的用户社区,是编辑器大战的阵营之一。另一方是 Emacs,第三方是其他所有编辑器:「编辑器之神」和「神之编辑器」,以及其它。
  5. Vim 和其他常见文本编辑器的根本区别是「模式」。Vim 可以在几种模式中切换,但同一时间只能处于一种模式。大部分时候,Vim 处于「普通」(Normal) 模式。在这种模式下,按下键盘上的某个键将会触发一个命令,而不是把对应的字符显示在屏幕上。这是最困扰 Vim 初级使用者的。
  6. Vim 有一个深刻洞察(从 vi 继承来的):无论我们写程序、写小说,或者只是写个简单的说明书,花在修改上的时间总比花在写作上的时间多;而修改时花费时间最多的,是移动光标、选择或删除需要修改的对象。
  7. Vim 有一个优雅设计(也是从 vi 继承来的):文本结构化。一篇文章包括一个或多个段,每段包括一个或多个句子,一个句子包括一个或多个词,这些都是可以单独编辑的文本对象。程序代码也是如此,一对引号、一对括号、一对中括号、一对大括号、HTML 中的一对标签,也都是文本对象。想要删除一整块代码?只需要敲三个键。
  8. Vim 编辑英文文章或程序代码非常流畅,但中文文章时会差一些。这是因为 Vim 不支持中文分词。不过我们可以稍微迂回地解决这个问题。
  9. 很难完全掌握 Vim。它的 中文帮助手册和用户参考手册一共有 4000 页。stackoverflow.com 上 「如何退出 Vim 编辑器?」的浏览次数超过了 250 万次。不过我们只需要启动 Vim,尝试几个简单命令,就已经在使用 Vim 了。
  10. Vim 并不需要学习;它需要使用。最好每天都用。

一点背景信息

我的工作主要是和文本打交道:写文章,翻译,写一点程序。2008 年开始比较频繁地使用 Ubuntu,2010 年左右开始以 Ubuntu 为主,偶尔才用 Windows。

用 Ubuntu 的原因之一是离开微软生态,另一个原因就是久仰的 Vim。不过 Vim 的确不怎么容易上手。跟着官方的 vimtutor 走了几遍,只记住了一些移动命令,还有打开文件、保存文件、退出 Vim,以及剪切、复制和粘贴。

一开始只能用 hjkl 笨拙地移动,只会用 a 和 i 进入插入模式,只会按 Esc 键回到普通模式,只会用 ZZ 保存和退出,只能用网上搜索拼凑出来的 vimrc 配置文件。虽然总会忘记切换模式,经常会打开莫名其妙的窗口,不过也算是开始使用了。

只要开始,就总是会有进步的。对笨拙缓慢的操作厌倦了以后,自然就会去找更好的方法;重复某些系列操作太多,自然就会想去把它自动化。渐渐地,按键成了肌肉记忆,就像用双拼输入法般完全不必想。

2013 年彻底转到 Mac 生态,Vim 的配置和使用习惯也带了过来。机器的性能越来越强,显示器的分辨率越来越高,终端从 gnome-terminal 换成了 iTerm2,Shell 从 bash 换成了 zsh(还加上了 oh-my-zsh),Vim 也终于升级到了第八个大版本,但一直是我的主力编辑器。

十几年间,我的 Vim 的配置文件像是忒修斯之船,不知道还有哪里没有被修改过。打开某些开关,关上另外一些;加上几个键盘映射,删掉一些不常用的;添加某个插件,偶尔又卸载掉;旧的插件不维护了,换成新的;性能差的插件被性能好的替代;即使是插件管理插件本身,也经历了几次替换。

随着需求逐渐清晰和技能慢慢提升,Vim 也在变得越来越顺手。也许永远不会达到完美,永远达不到「以思考的速度编辑」,但是每次发现了一个新用法,总会觉得有一点欣喜,觉得离完美更近了一点。

我们应该致力在不完美的存在中找到完美的存在,应该致力在不完美中找到完美。对我们来说,全然的完美与不完美没有什么不同。 铃木俊隆,《禅者的初心》

这么多年来,我写 txt,ReST,Markdown,写一点 C,一点 Python,一点 HTML 和 CSS,最主要的编辑器都是 Vim。有时候我用 Typora 或 Ulysses,有时候会用 Sublime Text、PyCharm、WebStorm,也从 iPython 用到 Jupyter,但最习惯的动作,还是用快捷键呼出 iTerm2,然后输入v <filename>

为什么要使用 Vim

首先,当然是效率

的确,对一般用户来说,更糟就是更好 是成立的:软件受欢迎的程度并不随功能的增加而提高,太多选择会让人不知所措而心生厌倦。用户使用软件是为了完成自己的任务、达成自己的目标,并不是成为专家。

日常使用的科技产品追求开箱即用,追求简明清晰,追求只靠直觉来操作。降低认知损耗,这是对的。

《Unix 编程艺术》中也说:「最易用的程序就是用户需要学习新东西最少的程序——或者,换句话说,最易用的程序就是最切合用户已有知识的程序。」

但编辑器不是日常科技产品,它是用来创造的工具。为了效率,我们需要牺牲一点舒适和直觉。

开汽车和开飞机哪一个更容易?全拼输入和五笔输入哪一个更容易?而哪一个效率更高呢?不言而喻。

对于需要使用键盘和鼠标操作的计算机软件来说,简单易用就意味着低效率。我们也许可以列出几条简单的经验法则:

  • 手臂、手腕、手指在完成操作时的移动距离越短,效率越高;
  • 击键次数越少、键位越容易被主要手指按到,效率越高;
  • 操作越熟练,操作过程越不干扰思路,效率越高;

所以我们认为快捷键效率高于鼠标右键菜单,鼠标右键菜单效率高于菜单栏菜单项;输入 20 次 j 的效率低于输入:20G 的效率;双拼比全拼效率高,五笔比双拼效率高;盲打比二指禅效率高,熟悉的快捷键比陌生的快捷键效率高。

即使是标榜最简单易用的编辑器,也会列出大量快捷键。不同用户的需求不同,但是软件不应该去阻碍用户对高效的追求。

同样还是在 《Unix 编程艺术》 中说:「调试通常会占用四分之三甚至更多的开发时间。」

使用快捷键,把记忆的负担从机器上转到了人身上,但是提升了操作效率。

这是「必要的懒惰」。用尽可能少的操作来完成尽可能多的任务;例如设置新的快捷键,设置宏,写几行代码来自动重复操作。这种懒惰,需要尝试、探索、总结才能获得。

其次,是灵活

在 Vim 中几乎可以自定义一切。外观可以随意调整,提示方式可以随心更换。几乎所有的功能都可以重新映射,可以把最常用的功能放在最顺手的位置。

灵活是效率的注脚。灵活意味着可以自行打造自己的工具,最适合自己的使用习惯,最适应自己要完成的任务,也就意味着更高的效率。

不过当然,灵活意味着让初级用户不知所措,意味着混乱,意味着反复练习,意味着你只能用自己配置的 Vim。

这些其实不是问题。毕竟初级用户变成中级用户的路途,是以大量尝试和练习来铺就的;而专家用户,只是失败得更多也练习得更多的中级用户。自己的机器只有自己使用已经是常识;就算偶尔要去远程使用其他机器,也完全可以把配置文件连同相关目录打个包扔到网盘、github 或者 U 盘里,到时直接下载就好。

再次,是投资

唯一能和 IT 界比潮流速度的,可能只剩时尚界了。

不过潮流来了又去,底层却不易变化。每过一阵就有新的编辑器、新的框架、新的语言、新的概念独领一时风骚,但 Unix 设计哲学、传统数据结构、C 语言长存。

Vim 也是如此。它很可能会随着键盘的消失而消失,不过在那之前都会存在——存在时间越长的东西,越有可能继续存在下去。使用 Vim,是对自己工作效率的一项长期复利投资。

一些现代编辑器也提供了 Vim 模式或 Vim 插件,Sublime Text、Atom、VS Code 都有,可以提供 Vim 的主要功能。在不同工具中使用同一套已经熟悉的操作方法,这也是效率的体现。

更进一步地,浏览器也有 Vim 插件。Chrome 上有几个插件,其中比较受欢迎的是 Vimium。一旦习惯在 Chrome 中用 u,d,j,k 来上下滚动页面,用 J,K 在标签页之间跳转,用 f 来打开链接,用 F 在新标签页中打开链接,用 v 来选中内容,就很难再回去使用鼠标了。

有一个可以在终端中运行的软件包叫 ranger,可以看成是简单的资源管理器或 Finder,支持 Vim 键位;键盘编辑器 Karabiner 甚至提供了一套预设的键映射,能在任意 App 中使用 Vim 键位。

忘掉方向键吧,hjkl 才是真正的方向键;忘掉<Ctrl+C>和<Ctrl+V>吧,y 和 p 才是真正的复制和粘贴。

最后但绝非最不重要的,是乐趣

探索的乐趣。解决问题的乐趣。有新发现时的乐趣。

搞懂规则的乐趣。精进技能的乐趣。

以及,因为高效,而能将更多时间投入到兴趣、娱乐、社交、学习的乐趣;离开电脑,去接触真实世界的乐趣。

如何入门

Vim 的下载页面和安装说明在 这里

Mac 已经预装了 Vim,只是版本有点低。要安装更高版本,只需要brew install vim即可。本文不详述如何在 Mac 上安装brew,不过安装好后最好把源换成国内源,例如中科大的源。

想要安装图形用户界面版本,brew install macvim --cask

在各种 Linux 发行版上,使用相应的包管理器安装即可。

在 Windows 上,下载安装包并安装;如果有必要的话,把安装路径到系统环境变量。

然后,在终端输入命令 vimtutor 就会打开 Vim 教程,可以开始练习 Vim 的基本操作。

更好的做法,是去找到特定语言的 Vim 教程,复制一份来练习。

例如,要在 Mac 上使用简体中文版教程,可以这样操作:

  1. 在终端中输入locate tutor.zh并回车。终端中将会列出中文 Vim 教程的所在路径。
  2. 在终端中输入cp /路径/tutor.zh_cn.utf-8 ~/Documents,可以将简体中文版 Vim 教程复制到「文档」文件夹下;
  3. 在终端中输入vim ~/Documents/tutor.zh_cn.utf-8,就可以开始练习了。

完整的练习大概需要半小时,不过并不需要一次完成。在一开始,掌握基本移动、模式切换、保存、退出就够了。

接下来,就可以尝试把 Vim 用在用在你的工作当中了。

基本原则

避免重复(DRY, Don't repeat yourself):如果你重复了某个操作好几次,那么一定有更好的方法来实现它。停下来,想想看,也许搜索一下。然后再练习一下。

Vim 的作者曾经写过一篇 《高效编辑的七个习惯》 ,这里有一份中译版。

几个小提示

注:Vim 相关文档中习惯以<C-R>的形式来表示组合键 Ctrl+R。在本文中依然使用传统记法。

  1. 如果你用标准键盘,把 Cap Lock 和 Ctrl 键换一下会是个好主意。
  2. 练习使用<Ctrl+[>回到普通模式,不要使用<Esc>。这个组合键会方便很多。
  3. HHKB 键盘对 Vim 很友好,但是并不一定非要用它。我在 iMac 上用 HHKB,在 Macbook 上用自带键盘,并没有感到不便。不过我把 Macbook 上的 Cap Lock 和 Ctrl 调换了位置,把 HHKB 上的"~"映射成了<Shift+Esc>
  4. 使用<Ctrl+M><Ctrl+J>在插入模式下换行,比敲回车键更方便。严格来说这两种换行方式有一些区别,不过可以先忽略。
  5. 经常回到普通模式。它被叫做「普通(Normal)」模式是有原因的——它才是 Vim 的默认状态。
  6. cdyv这几个命令和文本对象组合起来,会极大提升效率。删除一对引号和其中的内容?da"。删掉一整块用大括号括起来的代码?da}。删掉一对 HTML 标签?dat。如果只想删掉其中的内容但保留成对的符号或标签,把a换成i就可以了。类似地,选中一个句子?vis。复制一段?yip。要删除到下一个分号?dt;。要删除到下一个分号但保留分号?df;即可。
  7. 要快速在文档中跳转,可以考虑四管齐下:使用m标记、使用<Ctrl+I><Ctrl+O>,设置使用相对行号set relativenumber,以及安装 vim-easymotion 插件。
  8. 大量使用./命令。它们超级好用。

下一步

你会越来越熟练,也会越来越不满,希望能让自己效率更高。接下来,你会慢慢去查找、去了解这些内容:

  • 高效移动;
  • 跳转;
  • 高效删除;
  • 查找替换;
  • 寄存器;
  • 宏;
  • 缓冲区;
  • 窗口;
  • 标签页;
  • 配置文件;
  • 常用插件;
  • 以及更多更多。

然后某一天,你会奇怪地问自己:「为什么我没有早一点开始用 Vim?」

CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…

发布评论