一点废话
在图书馆偶然发现了一本关于Vim的书,查了下还是全图书馆唯一一本专门讲解Vim的书,内容十分详细,故决定写个自学笔记记录下所学。
Vim就不多做介绍了,功能强大的Linux文本编辑器,关于它的前身Vi在码农界有个名言就是“有终端的地方一定有Vi!”,我在WiFi遥控器这种十分简易的嵌入式设备上自带的Shell中也发现了它的存在。Vim作为Vi的改进版本,使用范围较Vi更为广泛。印象最深的就是“Help poor children in Uganda!”和官网的电钻哥了!详情可参考 Vim和乌干达的儿童 - csdn_kou的博客 - 优快云博客
学习Vim之前你必须知道
查看vim的版本
《Vim使用技巧》的编写是基于Vim7.3完成的,查看本机Vim的版本的命令为“:version”。
查阅Vim内置的帮助文档
帮助文档是学习Vim的一个十分重要的途径,进入帮助文档的方式为“:h”或者“:help”命令。此外,Vim官网还提供了PDF格式的中文版用户指南,在此附上传送门。
快速重复操作命令“.”
“.”命令是Vim中的重复操作命令,在Vim中输入命令“:help .”可快速查找关于该命令的说明。此处的“重复操作”可以指很多东西,包括对字符、整行甚至整个文件的修改。
*.*
. Repeat last change, with count replaced with [count].
Also repeat a yank command, when the 'y' flag is
included in 'cpoptions'. Does not repeat a
command-line command.Simple changes can be repeated with the "." command. Without a count, the
count of the last change is used. If you enter a count, it will replace the
last one. If the last change included a specification of a numbered register,
the register number will be incremented. See |redo-register| for an example
how to use this. Note that when repeating a command that used a Visual
selection, the same SIZE of area is used, see |visual-repeat|.
减少无关的移动(a, A/$, b, e, j, w )
“a”命令用于在当前光标位置之后添加内容;“A”命令用于在当前行的结尾处添加内容。使用上述两个命令均会自动进入插入模式,与“A”命令对应,若不进入插入模式,可使用命令“$”将光标跳转至行尾处。此外,若需要将光标移动至下一行,可使用“j”命令完成。
“b”命令用于将光标跳转至前一个单词的首字母处;“e”命令则用于将光标跳转至后一个单词的末尾处;“w”命令用于将光标跳转至后一个单词的开头处。
查找与替换
在vim下通常都是使用命令“/ ”或者“?”查找字符串,查找时需要添加需要查找的字符串作为目标参数。比如想搜索“test”这个单词, 可输入命令“/test”或者“?test”,两者的区别是前者是从上往下搜索,后者是从下往上搜索。该查找方式适用于光标不处于目标字符串位置的时候进行查找。完成查找之后vim会对文本中所有匹配的字符串进行高亮处理,若需要取消高亮则输入命令“noh”(no-highlight)即可。若目标字符串与光标所处位置的字符串相同,可直接使用命令“*”或者“n”(next)进行查找。
通过上述任一方式完成查找操作后,还可连续使用命令“*”或者“n”将光标定位至下一个匹配的字符串的位置。
查找操作很多时候与替换操作同时进行,若要使用字符串linux替换字符串test,可输入命令“%s/test/linux”完成。
普通模式
什么是普通模式?
启动Vim后首先进入的模式即普通模式。普通模式是Vim的缺省模式,即默认模式。其他文本编辑器大部分时间都处于类似Vim插入模式的状态中。
Vim的模式概念对于大部分初学者来说有些陌生与深奥,在此引入画家工作区作为类比。通常来说,一个画家不会花费全部的时间用于使用画笔在画布上作画且耗时的比例往往不超过一半。因为一个画家除了作画,还需要作完成一些其他的工作,包括但不限于主题构思、调配颜料等等,除此之外在作画过程往往还会休息片刻。因此Vim的普通模式就好比画家的画笔不在画布上的时候,是默认的模式。
删除
反向删除(db+x / dh)
有如下文本。
The end is nigh
若此时光标位于行尾处的字符“h”上,而我们想要删除单词“nigh”,可使用反向删除完成:首先使用“db命令”删除从光标起始位置到单词开头的内容(命令拆解d-删除;b-到单词首字母);接着使用“x”命令将剩余的字符“h”删除。关于“x”命令在帮助文档中的说明如下所示,大致功能为反向删除字符。
["x]x Delete [count] characters under and after the cursor
[into register x] (not |linewise|). Does the same as
"dl".
The <Del> key does not take a [count]. Instead, it
deletes the last character of the count.
See |:fixdel| if the <Del> key does not do what you
want. See |'whichwrap'| for deleting a line break
(join lines). {Vi does not support <Del>}
此外,使用“dh”命令可反向删除一个字符。
正向删除(b+dw)
有如下文本。
The end is nigh
若此时光标位于行尾处的字符“h”上,而我们想要删除单词“nigh”,可使用正向删除完成:使用“b”命令将光标移动至单词的开头;接着使用“dw”删除单词命令(delete-word)删除整个单词。
删除整个单词(daw)
有如下文本。
The end is nigh
若此时光标位于行尾处的字符“h”上,而我们想要删除单词“nigh”,可直接使用“daw”命令(delete-a-word)一键删除完整单词。
其他删除命令
dap | delete-a-paragraph,删除一个段落 |
dd | 删除整行 |
dl / x | 删除一个字符 |
简单的算术运算
加法与减法(Ctrl+a / Ctrl+x)
“Ctrl+a”和“Ctrl+x”命令可分别对数字执行加和减操作。在不带次数前缀执行时,它们会逐个加减(即+1和-1);若在命令中带上次数前缀,则可实现加减任意数。
例如有如下文本,光标位于字符“1”上。
.blog { background-position: 180px 200px }
执行命令“Ctrl+a”后,该行文本将会变为
.blog { background-position: 181px 200px }
即可所在的数字增加了1,且光标自动跳至个位。之后可连续执行“Ctrl+a”或者“.”命令重复操作。“Ctrl+x”命令同理。
若在命令前带上数字前缀,例如23,即执行命令“23”+"Ctrl+a"(对该命令进行剖析可知,实际是执行了23次“Ctrl”+‘“a”命令),则该行文本将会变为
.blog { background-position: 203px 100px }
若光标不处于数字字符中,上述两个命令将在当前行正向查找一个数字,若查找到则将直接对这个数字进行操作。
能够重复,就别用次数
在处理某些特定工作室,使用次数可以是按键的次数变得最少,不过我们并不是非得这样不可。我们需要认真考虑次数与重复各自的优缺点。
假设有如下文本
Delete more than one word
我们想把这段文字改为“Delete one word”,即删除“more”与“than”这两个单词。现有多种方式可以达到这一目的,包括命令“d2w”和“2dw”。使用“d2w”时,Vim先调用删除命令,然后以“2w”(2-word)为动作对象,可解读为“删除两个单词”;而“2dw”恰恰相反,次数作用于删除命令,可以将其解读为“进行两次删除单词的操作”。抛开语义不讲,无论何种方式,结果都是相同的。
此外还有一种方式为使用命令“dw.”实现删除两个单词。这种方式和前述的两个命令进行比较,有什么优缺点呢?假设我们原本希望删除3个单词,由于判断失误执行了命令“d2w”,而非“d3w”,那将无法使用“.”命令,否则将会再删除两个单词。只能使用“u”命令撤销操作或者使用命令“dw”再删除一个单词。若使用命令“dw.”,则仅需再使用一次“.”命令即可完成删除3个单词的操作,在这种情况下,命令“u”和“.”都具有了更细的粒度。当然具体使用何种操作需要根据所面临的情况的不同而决定,没有绝对的优与劣之分。
操作符 + 动作命令 = 操作
d{motion}可以对一个字符(dl)、一个完整的单词(daw)或者一整个段落(dap),删除操作的作用范围由其中的动作命令(motion)部分决定。同理,c{motion}、y{motion}以及其他一些命令也有同样的操作方式。常见的操作符如下表所示
c | 修改 |
d | 删除 |
y | 复制到寄存器 |
g~ | 反转大小写 |
gu | 转换为小写 |
gU | 转换为大写 |
> | 增加缩进 |
< | 减小缩进 |
= | 自动缩进 |
假如我们已经知道如何用“daw”删除一个单词,然后又学到“gU”命令(虽然是两个字母,但仍为一个操作符),所以我们可以使用“gUaw”把当前的单词转换为大写形式。
插入模式
由普通模式切换至插入模式
直接进入(i)
由普通模式切换至插入模式通常使用“i”指令。虽然方便直接,但缺点也是显而易见的,即需先将光标移动至需要编辑的地方。
新建一行(alt+o)
在普通模式下执行命令“alt+o”,Vim将在当前光标所在行后新建一行空白行,同时光标将会自动定位至新建行的行首,并进入插入模式。
在插入模式中可即时更正错误
在插入模式下,退格键的作用如你所愿,它删除光标前的字符。另外,我们还可以使用如下快捷键
Ctrl+h | 删除前一个字符(同退格键) |
Ctrl+w | 删除前一个单词 |
Ctrl+u | 删除至行首 |