译者序
虽然在Linux 下偶尔用Vim 做一些简单的编辑,但是真正再拾起Vim 是2014 年我在花瓣网的实习期间。里面的同事们都非常Geek,大家都用着非Vim 即Emacs 的编辑器,在观察了他们的日常工作后,我深深地被这款简洁又高效的编辑器所吸引。于是,我也入了Vim 的坑。
Vim 虽好,但是它在终端下的性能其实已经逐渐不能满足我的日常开发了,尤其是在我安装了一堆性能不那么好的插件之后。还好,Vim 8 和Neovim 出来了。它们的各种异步API 使得一些计算不再那么卡。Vim 又流畅了。
这个时候我才感觉到,Vim 并没有被时代所抛弃,它跟上了时代的步伐。自从现代Vim 出来之后,我的tmux 加上Vim 的组合刀刃又锋利了许多。再加上丰富的生态,例如现在还有对Language Server Protocol 很好的支持,使得我
的开发环境无往不利。
如果说Visual Studio 是我认为最好的IDE 之一的话,那么Vim 无疑是我认为最好的代码编辑器之一。值得一提的是,我的《Node.js:来一打C++ 扩展》一书,就是使用Vim 写的Markdown 文件,又生成GitBook 文件,最终导出给
编辑的。
当我看到有这么一本书可以翻译的时候,我是很兴奋的。这么好的编辑器在焕发第二春的时候,我能将一本介绍它的书翻译成汉字,推广到国内的市场,这是多么美妙的一件事情!
在此,我非常感谢在国内的Vim 生态圈和开发者们。感谢给本书写中文推荐语的同行。感谢我的妻子:她的支持是对我最大的鼓励,如果不是她,这本书的问世也许会更晚。感谢我的父母,在我的背后默默支持我的事业。在我
小的时候,他们就一直支持我的梦想,才使我在编程领域一路走下来。感谢Vim 这个伟大的编辑器。
死月
2019 年11 月于杭州
前言
关于Vim版本
在阅读本书之前,需要安装好最新的 Vim 版本。有两个选择:Vim 8 或者Neovim 0.2。
Vim 8
Vim 8 于 2016 年 9 月发布。它引入了一些我们在本书中将要学习的新特性,例如包特性以及任务控制机制。阅读本书的最低环境要求是,你安装的Vim 8 应当包含huge 特性集。关于安装方式,可以参考本书第1 章中的知识点1。
除了一些专为Neovim 所写的技巧之外,本书中所有的知识点中的示例都在Vim 8 中测试通过了。
Neovim
Neovim 是一个可以替代 Vim 的社区分支。它支持Vim 8 所支持的各种特性,也支持很多 Vim 8 没有的特性。你可以参考本书知识点2 中的介绍安装它。
本书中所有知识点中专为Neovim 编写的示例都在Neovim 0.2.2 中测试通过了。
术语
在很多方面,Vim 8 和 Neovim 都是相通的。如果我在书中使用“Vim”字眼,你可以认为该功能既可以在 Vim 8 中使用,也可以在 Neovim 中使用。如果我在书中特意指定“Vim 8”或者“Neovim”,那说明只能使用相应的编辑器。
如果你在一个知识点的开头看到这么一个标记,就说明它只在 Neovim 下有效:
Neovim only
如果标记是这样的,则说明它只在 Vim 8 下有效:
Vim 8 only
当然,如果没有任何标记,则说明两者都可用。书中大部分的知识点都是两个编辑器都支持的。
使用$VIMCONFIG 代入上下文Vim 8 和Neovim 遵循不同的约定保存配置文件。Vim 8 通常将配置文件放在~/.vim 目录中,而Neovim 则使用~/.config/nvim 目录,请记住这一点。
所以为了区分清楚,我使用环境变量$MYVIMRC、$VIMCONFIG、$VIMDATA来表示这些文件。当你看到$VIMCONFIG 的时候,你可以认为它是Vim 8 下的~/.vim 或者是Neovim 下的~/.config/nvim。
在本书第1 章中有关于Vim 的上下文指令和Neovim 的上下文指令的详细介绍。
其他软件要求
在本书中,很多地方都使用实际例子来介绍,也就是说,你如果跟着做会达到最佳学习效果,但有一些实例需要我们安装除 Vim 之外的软件。
JavaScript、Node.js 和npm书中的很多实例都使用的是JavaScript 这门近几年来比较通用的语言。所以即使你的主手武器不是 JavaScript,相信你也多多少少对其有所了解,这对你阅读本书来说绰绰有余了。而且就算你不想使用 JavaScript,使用其他语言也是可以的。
如果你想执行本书中的 JavaScript 实例,则需要安装 Node.js1 运行时环境和包管理工具npm2。你可以从它的官方网站获取详情。
1 见链接2所示网址。
2 见链接3所示网址。
Bash Shell 或者其他Shell
有时需要在shell 中执行命令。本书假设你使用 Bash shell,毕竟它是很多操作系统默认的shell 工具。
这并不意味着你只能使用 Bash。如果你更习惯使用 zsh、fish 或者其他的一些shell 工具也是可以的。相信使用其他shell 的你有能力将本书中的一些命令适配成你的shell 工具所使用的命令。不用担心,我们只使用Bash 最基本的功能。
Git
你会发现Git 的命令贯穿全书,例如clone、init 以及commit 等。所以需要安装一个最新版本的Git。可以在网上学习如何安装Git。
1Ripgrep
本书中多次使用到Andrew Gallant 编写的Ripgrep 工具。Ripgrep2 工具的主要功能是在多个文件中进行搜索,这和grep 很像。本书中的知识点13 介绍了如何使用类Grep 搜索器搜索文件。实际上,Ripgrep 还有一个功能,那就是
通过ripgrep --file 命令列出当前目录下的所有文件,除了版本控制工具忽略的文件。知识点7 中在进行模糊文件匹配时使用了这个特性。可以使用你的操作系统上的包管理器安装Ripgrep。如果不能安装成功,则可以查看它在 GitHub3 上的版本发布页面,那里有Linux 或者macOS 下的二进制文件。
Vim按键表示
Ctrl-s 是一个最常用的快捷键输入表示法。它的意思是“按住Ctrl 键,然后按下s 键”,但是这对于Vim 并不友好。在本书中,我会使用另外的表示法表示各种按键。
命令输入
在普通模式下,“命令”是一系列的键盘输入,就和在钢琴上演奏旋律一样,例如下面这些命令输入:表示意义
x 按下一次 x 键,dw 按下一次 d 键,然后按下一次 w 键,dap 按下一次 d 键,然后按下一次 a 键,然后是 p 键
本书中大多数的命令输入都在两三个键左右,但也不排除有更长的序列。解读 Vim 普通模式下的各种命令序列可能会耗费一些脑力,但是熟练之后就不是问题了。
组合键
当你看到形如 <C-p> 这样的表示时,如果你觉得它的意思是“按一次< 键,然后按C 键,再是- 键,然后……”就错了。<C-p> 等同于Ctrl-p,意思是“按住 Ctrl 键,然后按下p 键”。
其实我并没有什么理由去反驳 Ctrl-p 这种表示法,只是因为 Vim 的文档中使用了<C-p>,并且我们也能用这种表示法定义Vim 的自定义键位。有一些复杂的Vim 命令是由两种表示法共同表示的,例如下面这些表示:
表示意义
<C-n> 按住Ctrl 键,然后按一下 n 键
g<C-]> 按一下g 键,然后按住 Ctrl 键后,再按一下 ] 键
<C-r>0 按住 Ctrl 键后,按一下 r 键,放开后再按一下 0 键
<C-w><C-=> 按住 Ctrl 键后,按一下 w 键,放开 w 键后再按一下 = 键
占位符
很多Vim 命令都需要按多次键。有些命令后面的键输入是固定的,而有些则不是固定的。我们用花括号来包含命令序列某个位置中的有效按键集,例如:
表示意义
f{char} 按一下f 键,然后按任意字符键
`{a-z} 按一下 ` 键,然后按任意小写字母键
m{a-zA-Z} 按一下 m 键,然后按任意大小写字母键
d{motion} 按一下 d 键,然后键入任意动作命令
<C-r>{register} 按住 Ctrl 键后按一下 r 键,放开后键入任意一个寄存器地址
<C-v>{nondigit} 按住 Ctrl 键后按一下 v 键,放开后键入任意一个非数字键
特殊键
有些特殊键以其名字表示,下表列出了其中一些:
表示意义
<Esc> 按一下退出键
<CR> 按一下回车键
<Tab> 按一下 Tab 键
<S-Tab> 按住 Shift 键后按一下 Tab 键
<M-j> 按住 Meta 键后按一下 j 键
<Up> 按一下上光标键
<Down> 按一下下光标键
<Space> 按一下空格键
<Leader>g 按一下引导键,再按一下 g 键
值得注意的是,Meta 键需要视情况而定,它有可能是Option 键或者Alt 键。
引导键
<Leader> 引导键是可以自行定义的。在默认情况下,引导键为反斜杠\,也有很多人喜欢将其设置为逗号 ,。可以在vimrc 文件中对其进行设置:
let mapleader = ','
所以当看到 <Leader>g 这种表示法的时候,就应该在脑海中将其翻译成 ,g,或者是\g。如果引导键不是它们其中之一,那么就是你自行设置的mapleader 跟着g。
与命令行交互
我们时常会在 Vim 或者 shell 中执行一些命令。例如,在用Vim 打开一个随书源码文件之前,先进入相应的目录。在
这些实例中,你会看到一个 $ 命令提示符,这表示该命令运行在一个外部的shell 中:
? $ cd code/terminal/
? $ nvim readme.md
而在 Vim 中,按下 : 键会从普