1.命令的操作范围
实际上,vim的很多命令都只在一个文本范围内进行编辑操作。一个文本范围可以是一个字符、一个字、一行或其它指定的字符范围。使用vim命令和文本范围控制键可以更好地完成编辑任务。这类命令的格式如下:
命令+操作范围
其中的命令可以为:
d:删除(delete)命令。删除制定范围的文本,并将它们保存到临时缓冲区。
y:拷贝(yank)命令。复制指定范围的文本到临时缓冲区。
p:粘贴(put)命令。将临时缓冲区的内容粘贴到当前光标处。
附:系统会在缓冲区保留最后9个被删除的行。因此,如果想恢复最后一次被删除的行则在非编辑状态下使用“"1p”命令。如果想恢复倒数第2次被删除的行则在非编辑状态下使用“"2p”命令。
c:修改(change)命令。它是删除命令与插入命令的组合。
其中的操作范围可为:
e:从光标所在位置至该字的最后一个字符。
w:从光标所在位置至下一个字的第一个字符。
b:从光标所在位置至前一个字的第一个字符。
$:从光标所在位置至该行的最后一个字符。
0:从光标所在位置至该行的第一个字符。
(:从光标所在位置至该句子的第一个字符。
):从光标所在位置至下一个句子的第一个字符。
{:从光标所在位置至该段落的第一个字符。
}:从光标所在位置至该段落的最后一个字符。
gg:移至文首
GG:移至文末
2.命令的大小写
另外还有一些基本的命令,大写形式一般是该命令的增强版本或实现相反的功能:
i(insert):插入命令,在光标的前面插入文本。
I(insert):插入命令,但在光标所在行的行首插入文本。
a(append):附加命令,在光标的后面插入文本。
A(append):附加命令,但在光标所在行的行尾插入文本。
o(open):打开命令,在所在光标的下一行增加新行,并从行首开始插入文本。
O(open):打开命令,在所在光标的上一行增加新行,并从行首开始插入文本。
x:删除光标处的字符。
X:删除光标前的字符。
d:dw删除光标所在字。dd:删除光标所在行。
D:从光标开始删除至行尾。
.:重做命令,即重复前面刚执行过的命令。
u(undo):取消刚才执行过的更改。
U(undo):把当前行恢复成编辑前的状态,不管对此行编辑了多少次。
p:将缓冲区的内容粘贴在光标所在行的下一行。
P:将缓冲区的内容粘贴在光标所在行的上一行。
c:cw:删除光标所在的字并进入输入模式。cc:删除光标所在行并进入输入模式。
r:rx用x取代光标所在位置的字符,x表示一个字符。可用nrx替换n个字符为x。
R(replace):进入替换模式,直到“ESC”为止。
n(next):查找字符串时,查找下一个。
N(next):查找字符串时,查找上一个。
3.滚动屏幕
滚动屏幕的命令:
^F 向前滚动一屏
^B 向后滚动一屏
^D 向前滚动半屏
^U 向后滚动半屏
在屏幕内移动
H 移动到起始点----屏幕首行
M 移动到屏幕的中间行
L 移动到屏幕的末行
nH 移动到屏幕首行下面的第n行
nL 移动到屏幕末上上面的第n行
4.查找和替换
- 行内搜索。
- f命令可以进行行内搜索。输入fx可以找到下一个x字符。
- F命令可以在反方向进行行内搜索,输入Fx可以找到上一个x字符。
- t命令同样是进行行内搜索,但是光标停留在符合条件的字符的前面。输入tx使光标停留在下一个x字符的前面。
- T命令可以在反方向进行行内搜索,但是光标停留在符合条件的字符的下一个字符上。输入tx使光标停留在上一个x的后面的字符上。
- %可以搜索与之匹配的对应的()[]{}。这个功能对于书写程序特别有用。
- 全文的搜索。键入/后,光标进入VIM底部的命令行,这时就可以输入以/为开始的/搜索命令了。
- 最简单的查找。输入/string就可以查找string字符串。
- 继续查找。在第一次搜索后输入n将会继续进行上一次搜索,如果输入3n那么会找到后面第三个符合的字符串。大写的N会在反方向,也就是向上进行搜索。
- 向上搜索。输入?可以向上搜索。随后的n命令将会继续向上搜索,N向下搜索,其他和/一样。
- 对大小写的匹配。
- 在命令行输入:set ignorecase可以设置搜索以忽略大小写的方式进行。输入:set noignorecase可以设置搜索以匹配大小写的方式进行。默认的,将匹配大小写。这个默认设置可以在.vimrc中修改。
- 大小写智能匹配模式。输入命令:set ignorecase smartcase可以设置为智能大小写匹配模式。在这种模式下,如果你输入的字符串中至少包含一个大写字母,那么就会以大小写敏感模式进行搜索,否则以忽略大小写模式进行搜索。
- 在搜索命令中指定大小写。在几种大小写搜索模式中进行转换总要输入长长的一串指令,如果需要不断地转换模式,确实有些麻烦。所以你可以直接在搜索命令中指定大小写匹配模式。/c表示忽略大小写,而/C表示对大小写敏感。
- 查找当前词。一个简单的方法可以让你查找下一个和当前词一样的词,你不比输入/currentword,你可以直接按下*就可以查找下一个currentword。#可以让你向上查找同一个单词。
- 调整查找后的光标位置。
- 使用/string/3会使在光标转到找到string字符串的行下面的第3行。第1行从包含string的行算起。同样可以使用/string/-2来使光标停留在包含string的行的前面2行。
- 使用/string/e可以使光标停留在string字符串的末尾而不是默认的第一个字符位置。/string/b则表示停留在string第一个字符的位置,不过默认就是如此,我们不比多此一举。但是/string/b+2却可以使光标停留在string字符串的第二个字符的位置,这里是r。在e或者b的后面+或者-数字,可以进一步调整光标的位置。
- 特殊字符。在搜索命令中, .*[]^%/?~$这10个字符有着特殊意义,所以在使用这些字符的时候要在前面加上一个反斜杠/。而/e表示<esc>;/t表示<tab>;/r表示<cr>;/b表示<bs>。
- 匹配换行或空格。使用/n可以表示一个换行;而/s表示匹配空白,注意是空白不是空格。/_s表示匹配换行或者空格;/_a表示匹配换行或者一个字母。比如:/the/nword查找以the结束并且下一行以word开始的行的位置。/the/_sword查找the和word之间以空白或者换行分割的位置。/the/_s/+word表示the和word之间可以有多个空白。/+的含义可以在后面找到。
- 限定词首或者词尾。/<可以限定找到是以指定字符串开始的单词。比如//<the可以找到以the开始在字符串,但是会忽略在单词中间包含the的字符串。而/>则是限定必须是以指定字符串结尾的单词。
- 行首和行尾。输入/^string查找以string开始的行,并且光标停留在这个string的第一个字符。输入/string$则查找以string结束的行,并将光标停留在这个string的第一个字符。这个模式不会忽略前导或者后置的空格。
- 匹配任何一个字符。句号.可以匹配任何一个字符。例如/t.e可以找到the或者tae或者tue。
- 更加复杂的匹配模式。实际上,/搜索可以使用非常复杂的匹配模式。下面列出了其中一些复杂的匹配模式。
- 可重复的字符。
- 使用*表示它前面的字符可以重复多次或者0次。比如/be*可以匹配b,be,bee,beee等等。但是这也会包含b,因为e重复0后是空。如果要匹配诸如be,bebe,bebebe的字符串可以使用/(和/)把他们包括起来,形如://(be/)*。
- 使用/+来限定为重复至少一次到无数次。如:/be/+可以匹配be,bee,bee等等。
- 重复0次或者一次。/=可以指定重复0次或者一次。/strings/=表示匹配string或者strings。这在查找单词的复数形式特别有用.
- 指定重复的次数。/{n,m}可以指定重复n到m次。比如:/be/{2,4}将会匹配bee,beee,beeee。同样可以使用/{,4}表示匹配0到4次;/{4,}表示4次到无数次;/{4}表示重复4次。
- 匹配列表中的一个。使用一个以/|分割的列表,可以表示匹配列表中任何一项。比如/one/|two表示查找one或者two;/one/|two/|three表示查找one或者two或者three。
- 一个复杂的实例:/end/(if/|while/|for/)将会查找endif,endwhile以及endfor。
- 字符列表。使用[0-9]可以表示一个0到9范围的字符。比如/string[1-5]表示查找string1,string2,string3,string4,string5。当然也可以使用[a-z]表示字符a到z中间的一个。
- 特殊的字符集合。使用/d也可以表示0到9的数字,这个选项可以代替[0-9]。/D表示非数字代替[^0-9];/x表示十六进制数代替[0-9a-fA-F];/X表示非十六进制数代替[^0-9a-fA-F];/s表示空白字符代替[ ] (<Tab> 和<Space>);/S表示非空白字符代替[^ ] (除<Tab> 和<Space>之外);/l表示小写字母代替[a-z];/L表示非小写字母代替[^a-z];/u表示大写字母代替[A-Z];/U表示非大写字母代替[^A-Z]
- 可重复的字符。
- 搜索并替换。输入:[range]s/from/to/[flags]命令可以搜索匹配的字符串并且替换为指定的字符串。这是一个稍微复杂的命令。其中[range]是一个可选项,用来指定搜索替换的范围。[flags]也是一个可选项,用来指定搜索替换的处理方式。所以这个命令的简单形式是:s/from/to/。
- 搜索替换的范围。如果没有指定范围,则只在当前行进行搜索替换。
- 在所有行进行搜索替换。范围符号%表示在所有行进行搜索替换。:%s/from/to/就是在全文查找from并替换为to。
- 在指定的行上进行搜索替换。:1,50s/from/to/表示在第1行和第50行之间(包括1和50行)进行搜索和替换。:45s/from/to/表示仅仅在第45行进行搜索和替换。而"1,$"行号范围和“%“是等价的。
- 处理方式。我现在使用的VIM默认的方式是无须确认。不过好像不同版本的默认的处理方式是不同的。
- 无须确认。方式符号g表示直接替换无须进行确认。:%s/from/to/g表示在全文中查找from并且直接全部替换为to。
- 列印。处理方式符号p表示在替换时列出每个被改变的行。手册中这么说,但是实际效果却让我很迷惑。
- 确认后处理。处理方式符号c表示在进行替换前需要用户进行确认。这时你可以选择(y/n/a/q/1/^E/^Y):y表示同意当前替换;n表示不同意当前替换;a表示替换当前和后面的并且不再确认;q表示立即结束替换操作;1表示把当前的替换后结束替换操作;^E向上滚屏^Y向下滚屏,用来帮助查看前后内容以决定进行操作。
- 搜索替换的范围。如果没有指定范围,则只在当前行进行搜索替换。
5.others
~:大小写转换。在非编辑状态下,将光标移至某个字符,使用~命令,那么小写的字母会变成大写,大写的字母会变成小写。