文本操作无非就是增、删、改、查。那vim怎么快速有效增、删、改、查呢?
增
这里 增 指的是从vim命令模式切换到输入模式的方法。( 通过 [Esc] 键切换到命令模式 )
如当前打开的文本如下:
[V]im is a highly configurable text editor for efficiently creating
and changing any kind of text.
( 方括号表示光标所在位置)
i 光标左侧输入
I 光标所在行的行首输入(等效组合键:0 + i )
a 光标右侧输入
A 光标所在行的行尾输入(等效组合键:$ + a)
o 在光标所在行的下一行增添新行,光标位于新行的行首
O 在光标所在行的上一行增添新行,光标位于新行的行首
那问题来了? 如果在光标所在行的下一行不添加新行,而是把光标移动到旧行的行首,怎么操作呢?这时需要组合键 j + I (光标移动到下一行的行首),同样 k + I (光标移动到上一行的行首)
小写 i 表示 insert,大写 I 可以记为小写的 i 的夸张动作,i 在光标左侧输入,I 则在光标所在行最左侧输入。小写 a 表示 append,大写 A 可以记为小写 a 的夸张动作,a 在光标右侧输入,A 则在光标所在行最右侧输入。
大写命令可以记为小写命令的夸张动作(如 a 和 A)或反向动作(如 o 和 O)
w + i 光标所在单词的下一个单词的词首输入(w 表示 word,向右移动一个word)
b + i 光标所在单词的上一个单词的词首输入 (b 是 w的反向动作backward,向左移动一个word)
e + a 光标所在单词的词尾输入 (e 表示 end,向右移动到词尾)
删
dd 删除光标所在行
ndd n 是数字,删除光标所在行和向下 n 行
d0 删除光标所在处到所在行的行首
d$ 删除光标所在处到所在行的行尾 (等效命令 D )
dG 删除当前行到末行之间的所有数据
d1G 删除当前行到首行之间的所有数据
dw,de 删除光标所在位置至词尾, 区别是光标删除后停留位置。dw光标停留在下一个单词的词首,de光标停留在向右数第一个空格
改
cc 删除光标所在行,并切换到输入模式
cw 删除光标位置至单词词尾,并切换到输入模式
C 删除光标位置至本行末尾,并切换到输入模式 (大写 C)
替换
:s/cerr/cout 把当前行第一次出现的 cerr 替换为 cout (s 表示 substitute 替换)
:s/cerr/cout/g 把当前行所有出现的 cerr 全部替换为 cout (g global全局)
:50,100s/cerr/cout/g 把第50行至100行的所有 cerr 替换为 cout
:1,$s/cerr/cout/g 整个文件中的 cerr 替换为cout (% 等价于 1,$。所以还可以写成:%s/cerr/cout/g)
在替换命令尾部加上c (confirm 用于确认),在替换每一个old前都会提示并确认:
:%s/cerr/cout/gc 替换前提示?y表示替换,n表示放弃
查
字符查询
f + [字符] 在光标所在行向右搜索第一个相同字符
如vim内容如下;
[v]im is interesting and fun.
(方括号表示光标所在位置)
在命令模式下输入 ft 光标移动至 t 字符
vim is in[t]eresting and fun.
字符串查询
/pattern + [Enter]
pattern 为所有查询字符串,Enter键后被匹配字符串高亮显示,小写 n 查找下一个匹配项,大写 N 查找上一个匹配项
统计字符串出现次数
:%s/pattern//gn
(% 表示 1,$
s 表示 substitute 替换
/pattern所要查询字符串
// 替代文本应该放在这里,两个斜杠中间没有任何字符表示无替代文本
g 全局内替换,没有这个参数,只在每行第一个匹配进行替换。Replace all occurences in the line. Without this argument, replacement occurs only for the first occurence in each line.
n 计数,统计)