写作体例说明
在本书中,我会通过图例进行演示,而不是描述它们。用书面语不太容易做到这一点。为了显示在交互式编辑会话中所采取的步骤,我采用了一种简单的标记方法,把按键操作及 Vim 缓冲区的内容排在一起进行说明。
如果你急于动手操作的话,现在可以直接跳过这一部分。这一部分主要描述本书沿用的体例,你会发现其中很多都不需要解释。或许在某个地方你会偶然发现一个符号,想搞清楚它究竟代表什么意思。当这种情况发生时,你可以回到这一部分来寻求答案。
了解Vim的内置文档
了解Vim文档的最好方式是花点时间进行阅读。我在书中给出了Vim文档入口的“超链接”,以方便读者找到相关文档。例如,这里有一个通往Vim向导的“超链接”::h vimtutor。
这个图标具有两个作用。第一,它起到指示牌的作用,把目光吸引到这些有用的参考信息上;第二,如果你在联网的电子设备上阅读本书的话,那么你可以点击这些图标,它会把你带到 Vim 在线文档的相应入口。从这个意义上讲,它的确是超链接。
但是,如果你正在阅读纸版书,那该怎么做?别担心,如果在你手边有可访问的Vim程序,简单地输入图标前的命令即可。
例如,你可以输入:h vimtutor(:h 是:help 命令的简写)。你可以把它想成vimtutor 文档的唯一地址,即某种形式的 URL。从这个意义上讲,此 help 引用也是一种指向 Vim 内置文档的超链接。
在书页中模拟 Vim 的标记
Vim 区分模式的界面把它同其他文本编辑器区别开来。以音乐作个比喻,让我们拿 Qwerty 键盘与钢琴键盘进行比较。一个钢琴家可以每次只弹一个琴键来演奏主旋律,他也可以一次弹多个键来演奏和弦。对于多数文本编辑器,要触发一个键盘快捷键,需要先按住一个或多个修饰键,如控制键或命令键,然后再按另外一个键,在Qwerty键盘上的这种操作方式,等同于在钢琴键盘上演奏和弦。
某些Vim命令也由演奏和弦的方式触发。不过普通模式命令则被设计成输入一串按键。在Qwerty键盘上的这种操作方式,则等同于在钢琴键盘上演奏主旋律。
Ctrl-s是用来表示组合键命令的惯用约定,意为“同时按控制键及 s 键”,但这种约定方式并不适合用来描述Vim区分模式的命令集。在本节,我们将结识贯穿于全书的标记,在讲解Vim的用法时会用到它们。
演奏主旋律
在普通模式中,我们按次序输入一个或多个键组成一条命令。这些命令看起来像下面这样:
这些序列大多数包含两个或 3 个按键,但有的命令会更长。解读 Vim 普通模式命令序列的含义可能颇具挑战性,不过经过练习后你会做得更好。
演奏和弦
当你看到诸如<C-p> 这样的键时,它的意思不是“先按 <,然后按 C,再按 -,等等”。<C-p> 标记等同于 Ctrl-p,意为“同时按 <Ctrl> 及 p”。
我不会无缘无故地选择这种标记方式的。首先,在Vim 的文档中使用了这种标记(:h key-notation),我们也用它定义自定义按键映射项。另外,某些Vim命令由组合键及其他键以一定的次序组合在一起,这种标记也可以很好地表达这些命令。请看下面这些例子:
占位符
很多Vim命令需要以一定的次序按两个或多个按键。有些命令后面必须跟某种特定类型的按键,而其他命令后面则可以跟键盘上的任意键。我使用花括号表示一条命令后可以跟有效按键集合。下面是一些例子:
显示特殊按键
有些特殊按键以其名字表示,下表节选了其中的一些:
注意,空格由表示。它和 f{char} 命令组合在一起时记为 f。
区分不同模式下的输入
在操作Vim时,经常会从普通模式切换到插入模式,然后再切换回普通模式。Vim 中的每个键都可能具有不同的含义,这取决于当前哪个模式生效。我用了另一种样式表示在插入模式中输入的键,这可以让人很容易地把它们与普通模式下的按键区分开来。
看看这个例子cwreplacement<Esc>。普通模式命令cw会删除从光标位置到当前词结尾处的文本,并切换到插入模式。然后我们在插入模式中输入单词“replacement”,并按 <Esc> 键再切换回普通模式。
普通模式所用的样式也用于可视模式,而插入模式的样式也用来表示命令行模式及替换模式下输入的按键。你可以通过上下文清楚地知道当前处于哪个模式。
在命令行中操作
在有些技巧中,我们会在 shell或 Vim中执行一条命令行命令。下面是在 shell 中执行 grep 命令的格式:
➾$ grep -n Waldo *
下面是执行 Vim 内置的 :grep 命令的格式:
➾:grep Waldo *
在全书中,$符号表示在外部 shell 中执行一条命令行命令,而 : 提示符则表示这条命令在内部的命令行模式中执行。有时我们也会看到其他的提示符,包括:
无论你何时在文中见到一条 Ex 命令,比如 :write,都可以假设我们按了 <CR>键来执行该命令,否则该命令什么也不会做,因此你可以认为 <CR> 在 Ex 命令中是隐含的。
与之相反,Vim 的查找命令允许在按 <CR> 前预览第一个匹配项(参见技巧81)。当你在文中见到一条查找命令时,比如 /pattern<CR>,你会看到 <CR> 键被显式地标出来了;如果<CR> 被省略了,那是有意为之,也就是说你现在还不要按回车。
显示缓冲区内光标的位置
在显示缓冲区内容时,如果能指示当前光标位于何处,那会很有用。在下面的例子里,你可以看到光标位于单词“One”的第一个字母上:
One two three
当我们执行一项包含若干步的修改时,缓冲区的内容会经历一些中间状态。为了讲解这一过程,我使用了一个表格,在其左栏中显示所执行的命令,在右栏中显示缓冲区的内容。下面是个简单的例子:
在第2行,我们运行 dw 命令删除了光标下的单词。通过查看位于同一行的缓冲区内容,我们可以立刻看到这条命令执行完后缓冲区的状态。
高亮显示查找匹配项
在讲解 Vim 的查找命令时,如果能把缓冲区内出现的每个匹配项都高亮显示出来,那会很有帮助。在下例中,查找字符串“the”会让出现该模式的4处地方被高亮显示出来:
你可以跳到技巧80,了解如何激活 Vim 的查找高亮功能。
在可视模式中选择文本
可视模式允许我们在缓冲区内选择文本,然后在其上操作。在下例中,我们用 it文本对象选中 <a> 标签内的文本:
注意,高亮显示可视选区的样式与高亮显示查找匹配项的样式是一样的。当你看到这种样式时,根据上下文就可以知道它究竟是代表一处查找匹配项,还是一个高亮选区。
下载本书中的示例
本书中的例子通常都先显示修改前的文件内容,并在示例文本中给出该文件所在的路径,如下所示:
macros/incremental.txt
partridge in a pear tree
turtle doves
French hens
calling birds
golden rings
每当你看到以这种方式列出的文件路径时,都表示该例可被下载。我建议你在Vim 中打开此文件,然后亲自试试这个例子。这是学习Vim的最好方式。
要照着书中的例子操作,你可以从Pragmatic Bookshelf的网站上下载本书所有的示例和源代码。如果你在联网电子设备上阅读本书,也可以点击文件名来逐一获取每个文件。你可以用上面的例子试验一下。
使用Vim的出厂配置
Vim 是高度可配置的,如果你不喜欢其默认的行为,你可以改变它们。这本是好事,但是,如果你用自定义的 Vim 跟着做本书中的例子,可能会感到迷惑,你也许会发现有些东西并不像书中描述的那样工作。如果你怀疑是自定义配置造成了干扰,那么你可以做一个快速的测试。试着先退出 Vim,然后再用下列选项启动它:
➾$ vim -u NONE -N
-u NONE 标志让 Vim 在启动时不加载你的 vimrc,这样,你的定制项就不会生效,插件也会被禁用。当用不加载 vimrc 文件的方式启动时,Vim 会切换到 vi 兼容模式,这将导致很多有用的功能被禁用,而 -N 标志则会使能 ‘nocompatible’ 选项,防止进入 vi 兼容模式。
对于本书中的大多数例子来说,用vim -u NONE -N启动 Vim 应该可以确保你获得与书中的描述相符的体验,不过也有几处例外。有些 Vim 的内置功能是由 Vim 脚本实现的,也就是说,只有在激活插件时它们才会工作。下面的文件中包含了激活 Vim内置插件的最小配置:
essential.vim
set nocompatible
filetype plugin on
在启动 Vim 时,你可以执行如下命令,用该文件取代你的 vimrc:
➾$ vim -u code/essential.vim
在执行时,你需要相应地调整code/essential.vim 文件所在的路径。在激活了Vim 内置的插件功能后,你将可以使用诸如 netrw(参见技巧 43)、omni-completion (参见技巧117),以及很多其他的功能。我在本书中所说的Vim的出厂配置,指的就是激活了内置的插件功能,并且禁用了 vi 兼容模式时的配置。
需要留意技巧开头的名为“准备工作”的小节,要想跟着技巧中的步骤做,你需要对Vim进行相应的配置。如果你由Vim的出厂配置开始,然后再动态应用这些定制项,你就应该能重现技巧中的结果,不会遇到任何问题。
如果你仍遇到问题,请看“关于Vim的版本”部分。
Vim 脚本所扮演的角色
Vim脚本让我们可以给Vim添加新的功能,或是改变其已有的功能。它是一种完整的脚本语言,并且这个主题本身就可以写一整本书。不过本书并不是这样一本书。
但我们不会完全避开此话题,Vim脚本一直隐身在幕后,时刻准备响应我们的召唤。在技巧16、技巧70、技巧94及技巧95中,我们将看到一些如何使用它们完成日常工作的例子。
本书展示了如何使用Vim的核心功能。换句话说,它假设我们不使用任何第三方插件。不过技巧86和技巧96是例外,在这两个例子里,我推荐的插件所添加的功能是不可或缺的,并且在这两个例子里,插件都只需一些少量的代码——少于10行Vim脚本。另外,这两个例子也展示了扩充 Vim 的功能是多么容易。文中给出了visual-star.vim 和 Qargs.vim 的实现,但没有做讲解。这应该能给你一些印象,了解Vim脚本是什么样的,以及你能用它干什么。如果它激起了你的兴趣,那就更好了。
关于 Vim 的版本
本书中的所有例子都在最新的 Vim 版本中测试过,在写本书时是版本 7.3。就是说,大多数例子在任意 7.x 版本中都能够很好地工作,并且所讨论的很多功能在 6.x中也同样适用。
有些Vim功能可以在编译期间被禁用。例如,在配置编译选项时,我们可以传入--with-features=tiny参数,这会禁用除最基本的功能外的其他所有功能(Vim的功能集还包括small、normal、big和huge)。你可以查阅:h+feature-list,浏览完整的功能列表。
如果你发现自己的Vim缺少本书所讨论的某个功能,那么你也许正在使用一个最小功能集的 Vim 发行版。你可以用:version命令检查此功能是否可用:
➾:version
《 VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Sep 18 2011 16:00:17)
Huge version with MacVim GUI. Features included (+) or not (-):
+arabic +autocmd +balloon_eval +browse +builtin_terms +byte_offset
+cindent +clientserver +clipboard +cmdline_compl +cmdline_hist
+cmdline_info +comments
...
在现代计算机上,没理由不用 Vim 的 huge 功能集!
用终端 Vim 还是图形化Vim?你自己定!
传统上,Vim在终端内运行,没有图形用户界面(GUI)。我们也可以说Vim具有TUI,即文本用户界面。如果你每天有大量时间花在命令行上,你会感觉这很自然。
如果你通常使用基于图形用户界面的文本编辑器,那么 GVim(或 OS X 上的MacVim)可以给你提供一个通往Vim世界的有用桥梁(参见:h gui)。GVim支持更多的字体以及更多的语法高亮颜色,也可以使用鼠标。它也遵从某些操作系统的约定,例如,在MacVim中,你可以用 Cmd-X 和 Cmd-V 与系统剪切板交互,也可以用Cmd-S 保存文件,用 Cmd-W 关闭一个窗口。如果你能接受的话,可以用这些命令,不过你应该已意识到,还有更好的方法完成这些。
对本书的目的而言,运行终端Vim还是GVim关系不大。我们将着重于介绍Vim的核心命令,这些功能在两者中都能很好地运行。我们要学习的重点是如何用Vim的方式来工作。