Drew Neil 所作《Practical Vim》(中译本)是被Vim核心开发者Tim Pope不吝赞美之辞的宝典。和大而全的Vim教程不一样,这本书关注的是Vim的核心功能,讲解了地道的Vim用法。
- 第1章 Vim解决问题的方式
- 第一部分 模式
- 第二部分 文件
- 第三部分 更快地移动及跳转
- 第四部分 寄存器
- 第五部分 模式
- 第六部分 工具
Drew Neil 所作《Practical Vim》(中译本)是被Vim核心开发者Tim Pope不吝赞美之辞的宝典。和大而全的Vim教程不一样,这本书关注的是Vim的核心功能,讲解了地道的Vim用法。
.
命令. 命令可以让我们重复上次的修改,它是 Vim 中最为强大的多面手。
>G
缩进了当前行至文件尾的内容;x
、dd
、>
都是普通模式中的命令,编辑亦是;.
重复之前的修改。对于在行尾添加内容这样的常见操作,如添加分号,Vim 提供了一个专门的命令,可以把两步操作合并为一步。
A
代替了 $a
,在利用.
重复时效率提升;我们可以用一种常用的 Vim 操作习惯在一个字符前后各添加一个空格。乍一看,这种方法有点古怪,不过其好处是可重复,这将使我们可以事半功倍地完成工作。
;.
来重复查找和操作本节将介绍 Vim 可以重复执行的每个操作,并学习如何回退这些命令。
*
查找当前鼠标所在位置的词;*cw copy<Esc>
查找当前鼠标所在的词,并进行修改;n.
下一个匹配并进行同样的修改。.
范式用一次按键移动,另一次按键执行,即为
.
范式。
大部分时候,我们都在普通模式下编译文档。
尽可能在输入后退回到普通模式,便于用
u
退回。
\<Esc>o
要好于<CR>
,这样便于撤销。尽可能的使修改可重复。
daw
优于bdw
;bdw
优于dbx
。略过
d7w
不如 dw......
来得直接。
操作符 + 移动命令 = 操作
g~
、``gu、
gU中
g作为前缀改变了后面按键行为。
g`使Vim进入了待决模式。commentary.vim
定义了\\
命令,\\ap
即注释整段,\\G
即注释至文件尾,\\\
即注释当前行。如果在插入模式下撰写文本时出了错,我们可以立刻对它进行更正,而无需切换模式。要迅速更正错误,除了用退格键外,我们还可以用插入模式中的其他一些命令。
在输入出现错误时,除了退格键外,还可以在不退出输入模式前提下,修改错误:
键 | 用途 |
---|---|
<C-h> | 删除前一个字符(同退格键) |
<C-w> | 删除前一个单词 |
<C-u> | 删至行首 |
上述命令在非插入式模式、bash shell 中亦可用。
插入模式只专注于做一件事,那就是输入文字,而普通模式却是我们大部分时间所使用的模式(顾名思义),因此能快速在这两种模式间切换是很重要的。本节将介绍一些技巧,可以减少模式切换所带来的损耗。
键 | 用途 |
---|---|
<Esc> | 切换到普通模式 |
<C-[> | 切换到普通模式 |
<C-o> | 切换到插入-普通模式 |
比如\<C-o>zz
可将在输入模式下临时进入普通模式,重绘屏幕,使当前行居中,然后即刻回到插入模式。
Vim 的复制和粘贴操作一般都在普通模式中执行,不过有时我们也许想不离开插入模式,就能往文档里粘贴文本。
yt,
是将逗号前的Practical Vim复制到专用寄取器中(这是技巧49中t{char}
动作命令),然后在插入模式中用\<C-r>0
把刚才复制的文本粘贴到光标所在位置。
\<C-r>{register}
表达式寄存器允许我们做一些运算,并把运算结果直接插入到文档中。在本节我们将看到一个运用此强大功能的实例。
\<C-r>=
之后会在屏幕下方显示一个提示符,输入要执行的表达式,然后回车,即可以光标处插入计算结果。如\<C-r>=6*35<CR>
得210
。
表达式寄存器远不止能做简单算术运算。我们将在技巧 70 中看到一些更高级的应用。
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/ 。
虽然 Vim 允许我们用数字编码插入任意字符,不过这既难记忆也难输入。我们也可以用二合字母(digraph)来插入非常用字符,成对的字符更容易记忆一些。
\<C-k>?I
: ¿
\<C-k><<
: »
\<C-k>>>
: «
\<C-k>12
: 1/2
在替换模式中输入会替换文档中的已有文本,除此之外,该模式与插入模式完全相同。
这里主要讲的R
命令,从普通模式切入到插入模式。
gR
触发虚拟替换模式gR
,则会输入到满制表符宽度时才替换掉制表符。可视模式允许我们选中一个文本区域并在其上操作。尽管这看起来似乎很熟悉,但对于所选中的文本,Vim 的视角却有异于其他文本编辑器。
h
,j
,k
,l
等,查找等。c
是针对选定文本做替换,其它操作命令是一样的。viw
。\<C-g>
,这种模式即类似于Windows编辑器中选择区域的行为。可视模式的 3 个子模式用于处理不同类型的文本。我们将在本节看到如何激活每种子模式,以及如何在它们之间切换。
o
当使用
.
命令重复对高亮选区所做的修改时,此修改会重复作用于相同范围的文本。在本节中,我们会对一个面向行的高亮选区做一个修改,然后使用.
命令重复此修改。
可视模式可能比 Vim 的普通模式操作起来更自然一些,但是它有一个缺点:在这个模式下
.
命令有时会有一些异常的表现。我们可以用普通模式下的操作符命令来规避此缺点。
gU
+ it
如果我们想使点命令能够重复某些有用的工作,那么最好要远离可视模式。作为一般的原则,在做一系列可重复的修改时,最好首选操作符命令,而不是其对应的可视模式命令。
在任何编辑器中,我们都能够操作以行为单位的文本,但以列为单位进行文本操作就需要更为专业的工具了。Vim 面向列块的可视模式就提供了这种能力,我们可以用它来对纯文本表格进行转换。
用列块可视模式可以同时往若干行中插入文本。列块可视模式不仅仅对表格数据有用,在编程时我们也时常受惠于此功能。
注意,只有在按了 <Esc>
返回到普通模式后,我们才看到刚才输入的文本出现在下面这两行里。
命令行模式来自于Ex编辑器。
命令行模式会提示我们输入一条 Ex 命令、一个查找模式,或一个表达式。在本节,我们将结识一些操作缓冲区中的文本的 Ex 命令,并学习一些可在此模式中使用的特殊按键映射项。
:
键时,Vim 会切换到命令行模式。/
调出查找提示符或用 <C-r>=
访问表达式寄存器时,命令行模式也会被激活。有时使用 Ex 命令,能比用普通模式命令更快地完成同样的工作。举个例子,普通模式命令一般操作当前字符或当前行,而 Ex 命令却可以在任意位置执行,这意味着我们无需移动光标就可以使用 Ex 命令做出修改。但使 Ex 命令脱颖而出的最让人赞叹的功能,是它们拥有能够在多行上同时执行的能力。
很多 Ex 命令可以用 [range] 指定要操作的范围。我们可以用行号、位置标记或是查找模式来指定范围的开始位置及结束位置。
:3p
,打印第3行代码:2,5p
,打印第2行到第5行代码。注意,执行完该命令后,光标会停留在第5行。:{start},{end}
。.
表达为当前位置。
:.,$p
,打印从当前位置到文件末尾%
表达当前文件所有行
:%p
,打印所有行,等价:
,$p`:%s/Practical/Pragmatic/
2G,VG
,'<,'>p
:/<html>/,/<\/html>/p
:/<html>/+1,/<\/html>/-1p
:{address}+n
:copy 命令(及其简写形式 :t )让我们可以把一行或多行从文档的一部分复制到另一部分,而 :move 命令则可以让我们把一行或多行移到文档的其他地方。
:[range]copy {address}
:6copy.
:copy
可以简写为:co
,亦可简写为:t
:t.
命令会创建一个当前行副本,而另外一种做法则是用普通模式的复制和粘贴命令( yyp
)来达到同样的效果。这两种复制当前行的技术有个需要关注的差别: yyp
会使用寄存器,而 :t.
则不会。因此,当我不想覆盖默认寄存器中的当前内容时,有时我会使用 :t.
来复制行。
:[range]move {address}
:m
如果想在一系列连续行上执行一条普通模式命令,我们可以用
:normal
命令。此命令在与.
命令或宏结合使用时,我们只需花费很少的努力就能完成大量重复性任务。
在一次编辑会话中,可以打开多个文件。用 Vim 的缓冲区列表可以对这些文件进行管理。
vim *.txt
: 打开所有txt扩展名文件:ls
命令会列出所有被载入到内存中的缓冲区的列表:bnext
:缓冲切换到下一个\<C-^>
:快速切换缓冲区:bprev
:bnext
:bfirst
:blast
:buffer {bufname}
在Tim Pope
写的插件unimparied
中作了简化,稍后测试。
:bdelete {buffername}
参数列表易于管理,适用于对一批文件进行分组,使其更容易访问。用
:argdo
命令可以在参数列表中的每个文件上执行一条 Ex 命令。