Practical Vim

Drew Neil 所作《Practical Vim》(中译本)是被Vim核心开发者Tim Pope不吝赞美之辞的宝典。和大而全的Vim教程不一样,这本书关注的是Vim的核心功能,讲解了地道的Vim用法。

第1章 Vim解决问题的方式

技巧1 结识 . 命令

. 命令可以让我们重复上次的修改,它是 Vim 中最为强大的多面手。

  • >G 缩进了当前行至文件尾的内容;
  • xdd>都是普通模式中的命令,编辑亦是;
  • 移动并不是修改,移动到新的位置再用.重复之前的修改。

技巧2 不要自我重复

对于在行尾添加内容这样的常见操作,如添加分号,Vim 提供了一个专门的命令,可以把两步操作合并为一步。

  • A 代替了 $a,在利用.重复时效率提升;
  • 其它从普通模式进入输入模式的方式都是可重复的提倡方式。

技巧3 以退为进

我们可以用一种常用的 Vim 操作习惯在一个字符前后各添加一个空格。乍一看,这种方法有点古怪,不过其好处是可重复,这将使我们可以事半功倍地完成工作。

  • ;.来重复查找和操作

技巧4 执行、重复、回退

本节将介绍 Vim 可以重复执行的每个操作,并学习如何回退这些命令。

image

技巧5 查找燕手动替换

  • * 查找当前鼠标所在位置的词;
  • *cw copy<Esc> 查找当前鼠标所在的词,并进行修改;
  • n. 下一个匹配并进行同样的修改。

技巧6 结识 . 范式

用一次按键移动,另一次按键执行,即为.范式。

返回

第2章 普通模式

技巧7 停顿时请移开画笔

大部分时候,我们都在普通模式下编译文档。

技巧8 把摊销单元切成块

尽可能在输入后退回到普通模式,便于用u退回。

  • 换行时\<Esc>o要好于<CR>,这样便于撤销。

技巧9 构造可重复的修改

尽可能的使修改可重复。

  • daw优于bdw
  • bdw优于dbx

技巧10 用次数做简单的算述计算

略过

技巧11 能够重复,就别用次数

d7w 不如 dw......来得直接。

技巧12 双剑合璧,天下无敌

操作符 + 移动命令 = 操作

  • d{motion}、c{motion}、y{motion}
  • g~、``gugUg作为前缀改变了后面按键行为。g`使Vim进入了待决模式
  • daw、dap、gUaw、gUap
  • dd、>>、gUgU、gUU 作用于当前行,是操作符+移动命令的变种;
  • Tim Pope的commentary.vim定义了\\命令,\\ap即注释整段,\\G即注释至文件尾,\\\即注释当前行。

返回

第3章 插入模式

技巧13 在插入模式中即时更正错误

如果在插入模式下撰写文本时出了错,我们可以立刻对它进行更正,而无需切换模式。要迅速更正错误,除了用退格键外,我们还可以用插入模式中的其他一些命令。

在输入出现错误时,除了退格键外,还可以在不退出输入模式前提下,修改错误:

用途
<C-h> 删除前一个字符(同退格键)
<C-w> 删除前一个单词
<C-u> 删至行首

上述命令在非插入式模式、bash shell 中亦可用。

技巧14 返回普通模式

插入模式只专注于做一件事,那就是输入文字,而普通模式却是我们大部分时间所使用的模式(顾名思义),因此能快速在这两种模式间切换是很重要的。本节将介绍一些技巧,可以减少模式切换所带来的损耗。

用途
<Esc> 切换到普通模式
<C-[> 切换到普通模式
<C-o> 切换到插入-普通模式

插入-普通模式

比如\<C-o>zz可将在输入模式下临时进入普通模式,重绘屏幕,使当前行居中,然后即刻回到插入模式。

技巧15 不离开插入模式、粘帖寄取器中的文本

Vim 的复制和粘贴操作一般都在普通模式中执行,不过有时我们也许想不离开插入模式,就能往文档里粘贴文本。

image

yt,是将逗号前的Practical Vim复制到专用寄取器中(这是技巧49中t{char}动作命令),然后在插入模式中用\<C-r>0把刚才复制的文本粘贴到光标所在位置。

  • 命令:\<C-r>{register}

技巧16 随时随地做运算

表达式寄存器允许我们做一些运算,并把运算结果直接插入到文档中。在本节我们将看到一个运用此强大功能的实例。

\<C-r>=之后会在屏幕下方显示一个提示符,输入要执行的表达式,然后回车,即可以光标处插入计算结果。如\<C-r>=6*35<CR>210

表达式寄存器远不止能做简单算术运算。我们将在技巧 70 中看到一些更高级的应用。

技巧17 用字符编码插入非常用字符

Vim 可以用字符编码(Character Code)插入任意字符。使用此功能可以很方便地输入键盘上找不到的符号。

  • 命令:<C-v>{code},若{code}unicode,则形式为 <C-v>u{unicode}
  • 示例
    - \<C-v>065: A
    • \<C-v>u00bf: ¿
    • kN\<C-v>u00b7m: kN·m

unicode查询见:https://unicode-table.com/en/

技巧18 以二合字母插入非常用字符

虽然 Vim 允许我们用数字编码插入任意字符,不过这既难记忆也难输入。我们也可以用二合字母(digraph)来插入非常用字符,成对的字符更容易记忆一些。

  • 命令:<C-k>>{char1}{char2}
  • 示例
    • \<C-k>?I: ¿
    • \<C-k><<: »
    • \<C-k>>>: «
    • \<C-k>12: 1/2

技巧19 用替换模式替换已有文本

在替换模式中输入会替换文档中的已有文本,除此之外,该模式与插入模式完全相同。

这里主要讲的R命令,从普通模式切入到插入模式。

虚拟替换模式

  • 命令:gR触发虚拟替换模式
  • 场景:替换制表符时,若用普通替换模式,则一个字符就会替代整个制表符;若用gR,则会输入到满制表符宽度时才替换掉制表符。

返回

第4章 可视模式

技巧20 深入理解可视模式

可视模式允许我们选中一个文本区域并在其上操作。尽管这看起来似乎很熟悉,但对于所选中的文本,Vim 的视角却有异于其他文本编辑器。

  • 在可视模式中,原本属于普通模式中的一些移动命令仍然是有效的,如hjkl等,查找等。
  • 可视模式中选定文本后,c是针对选定文本做替换,其它操作命令是一样的。
  • 用可视模式选定一个词:viw
  • 在可视模式中可切换到选择模式,亦可切换回来:\<C-g>,这种模式即类似于Windows编辑器中选择区域的行为。

技巧21 选择高亮选区

可视模式的 3 个子模式用于处理不同类型的文本。我们将在本节看到如何激活每种子模式,以及如何在它们之间切换。

激活可视模式

image

在可视模式间切换

image

切换选区的活动端

  • 命令:o

image

技巧22 重复执行面向行的可视命令

当使用. 命令重复对高亮选区所做的修改时,此修改会重复作用于相同范围的文本。在本节中,我们会对一个面向行的高亮选区做一个修改,然后使用. 命令重复此修改。

image

返回

技巧22 只要可能,最好用操作的命令,而不是可视命令

可视模式可能比 Vim 的普通模式操作起来更自然一些,但是它有一个缺点:在这个模式下.命令有时会有一些异常的表现。我们可以用普通模式下的操作符命令来规避此缺点。

使用可视模式下的命令

image

使用普通模式下的操作符命令

  • 操作 + 移动 = gU + it

image

如果我们想使点命令能够重复某些有用的工作,那么最好要远离可视模式。作为一般的原则,在做一系列可重复的修改时,最好首选操作符命令,而不是其对应的可视模式命令。

技巧24 用面向列块的可视模式编辑表格数据

在任何编辑器中,我们都能够操作以行为单位的文本,但以列为单位进行文本操作就需要更为专业的工具了。Vim 面向列块的可视模式就提供了这种能力,我们可以用它来对纯文本表格进行转换。

技巧25 修改列文本

用列块可视模式可以同时往若干行中插入文本。列块可视模式不仅仅对表格数据有用,在编程时我们也时常受惠于此功能。

注意,只有在按了 <Esc> 返回到普通模式后,我们才看到刚才输入的文本出现在下面这两行里。

技巧26 在长短不一的高亮块后添加文本

image

返回

第5章 命令行模式

命令行模式来自于Ex编辑器。

技巧27 结识 Vim 的命令行模式

命令行模式会提示我们输入一条 Ex 命令、一个查找模式,或一个表达式。在本节,我们将结识一些操作缓冲区中的文本的 Ex 命令,并学习一些可在此模式中使用的特殊按键映射项。

  • 在按下 : 键时,Vim 会切换到命令行模式。
  • 在我们按 /调出查找提示符或用 <C-r>= 访问表达式寄存器时,命令行模式也会被激活。

有时使用 Ex 命令,能比用普通模式命令更快地完成同样的工作。举个例子,普通模式命令一般操作当前字符或当前行,而 Ex 命令却可以在任意位置执行,这意味着我们无需移动光标就可以使用 Ex 命令做出修改。但使 Ex 命令脱颖而出的最让人赞叹的功能,是它们拥有能够在多行上同时执行的能力

技巧28 在一行或多个连续行上执行命令

很多 Ex 命令可以用 [range] 指定要操作的范围。我们可以用行号、位置标记或是查找模式来指定范围的开始位置及结束位置。

用行号作为地址

  • 示例::3p,打印第3行代码

用地址指定一个范围

  • 示例::2,5p,打印第2行到第5行代码。注意,执行完该命令后,光标会停留在第5行。
  • 范围的表达方式::{start},{end}
  • 符号.表达为当前位置。
    • 示例::.,$p,打印从当前位置到文件末尾
  • 符号%表达当前文件所有行
    • 示例::%p,打印所有行,等价:,$p`
    • 这种简写形式在和 :substitute 命令一起使用时非常普遍::%s/Practical/Pragmatic/

用高亮区指定范围

  • 示例:2G,VG'<,'>p

用模式指定范围

  • 示例::/<html>/,/<\/html>/p

用偏移对地址进行修正

  • 示例::/<html>/+1,/<\/html>/-1p
  • 偏移的一般形式是这样的::{address}+n
  • 如果 n 被省略,那么缺省偏移量为 1。 {address} 可以是一个行号、一个位置标记,或是一个查找模式。

结论

image

技巧29 使用‘:t’和‘:m’命令复制和移动行

:copy 命令(及其简写形式 :t )让我们可以把一行或多行从文档的一部分复制到另一部分,而 :move 命令则可以让我们把一行或多行移到文档的其他地方。

用‘:t’ 命令复制行

  • 命令::[range]copy {address}
  • 示例
    • :6copy.
  • :copy可以简写为:co,亦可简写为:t

image

:t. 命令会创建一个当前行副本,而另外一种做法则是用普通模式的复制和粘贴命令( yyp)来达到同样的效果。这两种复制当前行的技术有个需要关注的差别: yyp 会使用寄存器,而 :t. 则不会。因此,当我不想覆盖默认寄存器中的当前内容时,有时我会使用 :t.来复制行。

用 ‘:m’ 命令移动行

  • 命令::[range]move {address}
  • 我们可以把它简写为一个字母 :m

技巧30 在指定范围上执行普通模式命令

如果想在一系列连续行上执行一条普通模式命令,我们可以用 :normal 命令。此命令在与 .命令或宏结合使用时,我们只需花费很少的努力就能完成大量重复性任务。

返回

第6章 管理多个文件

技巧 36 缓冲区列表管理打开的文件

在一次编辑会话中,可以打开多个文件。用 Vim 的缓冲区列表可以对这些文件进行管理。

了解文件与缓冲区的区别

  • 文件是存储在磁盘上的,而缓冲区则存在于内存中。

结识缓冲区列表

  • vim *.txt: 打开所有txt扩展名文件
  • :ls 命令会列出所有被载入到内存中的缓冲区的列表
  • :bnext:缓冲切换到下一个
  • \<C-^>:快速切换缓冲区

使用缓冲区列表

  • :bprev
  • :bnext
  • :bfirst
  • :blast
  • :buffer {bufname}

Tim Pope写的插件unimparied中作了简化,稍后测试。

删除缓冲区

  • :bdelete {buffername}

技巧37 用参数列表将缓冲区分组

参数列表易于管理,适用于对一批文件进行分组,使其更容易访问。用:argdo命令可以在参数列表中的每个文件上执行一条 Ex 命令。

返回

第7章 打开及保存文件

返回