使用 VIM 做小的修改
我们通常使用 x 命令来删除一个字符。实际上,我们可以选择更加好用的 d 命令来完成删除操作。
d 命令(类似的还有 c、y 等命令)
d 命令是一个特殊的命令,后面需要接上动作(motion),使用实例:
- dw
- I am a boy.
光标位于 b 上时,输入 dw 将删除 boy 这个词。如果需要删除多个词,例如,删除 4 个词,可以使用 d4w。
这里的 w 或者 4w 就是动作(motion) - d$ 和 d0
$ 的含义是移动到句尾,那么 d$ 的含义就是删除从光标处到句尾的所有字符。
0 的含义是移动到句首,那么 d0 的含义就是删除从光标处到行首的所有字符(不包括光标下的字符)。 - dnh、dnj、dnk、dnl(这里 n 为计数)
d4h 表示向左删除 4 个字符
d4j 表示向下删除 4 个字符
d4k 表示向上删除 4 个字符
d4l 表示向右删除 4 个字符 - dG 和 dgg
我们用 dG 来删除从此行到文件尾的所有字符。
我们用 dgg 来删除从此行到文件头的所有字符。 - dfx(这里 x 为一个字符)
我们知道 fx(x 为一个字符)用于找到 x 字符,那么 dfx 表示删除从此处到 x 字符处的所有字符(包括 x 字符)
c 命令
c 命令和 d 命令非常相似,也是用来删除字符,只是执行完 c 命令后会进入到插入模式,等同于 d 命令执行完之后输入 a(append)。例如:
cgg 用于删除从此行到文件头的所有字符,删除后进入插入模式。
y 命令
y 命令的含义和 c 命令以及 d 命令相差甚远,但是它们的用法相似,后面都需要加上一个动作,y 命令用于复制字符(p 命令用于粘贴字符)。例如:
- I am a boy.
假定光标位于 b 上,输入 yw(或者 yfy)那么单词 boy 将被复制。
yy dd 和 cc
yy 命令用于复制一行(包括行尾的换行)
dd 命令用于删除一行(包括行尾的换行)
cc 命令用于删除一行后进入插入模式(不包括行尾的换行)
快捷键
dl —— x(小写)—— 删除光标下的一个字符
cl —— s(小写)—— 删除光标下的一个字符然后进入插入模式
dh —— X(大写)—— 删除光标左的一个字符
cc —— S(大写)—— 删除一整行并进入插入模式
d$ —— D —— 删除到行尾
c$ —— C —— 删除到行尾(而不是整行)并进入插入模式
yy —— Y —— 复制一整行
替换单个字符
r 命令用于替换单个字符,在你需要替换的字符上,敲击 r 然后输入需要替换的字符。要注意的是,r 命令后面只能接上一个字符。r 命令可以有计数前缀,例如:
- hello
假定光标在 h 上,输入 4rx 后,hello 变成了 xxxxo
重复一个修改
. 命令用于重复最后一次的修改操作(仅仅是修改操作)
删除就是一种修改操作,例如,我们现在想删除 <a> 和 </a> 那么我们可以在字符 < 上敲入 df> 删除 <a>,然后把光标移动到 </a> 的 < 字符上,然后敲入 . 命令
使用可视模式
在普通模式下,输入 v 可以进入可视模式。
可视模式可以使得我们方便的复制和删除字符串。首先,我们输入 v 进入可视模式,然后移动光标,那么移过的字符将会高亮显示,这时如果输入 y 那么被选择的高亮字符将被复制,如果输入 d(或者 c)那么被选择的高亮字符将被删除。
- hello boy.
假定光标在 h 上,我们在普通模式下敲入 vlllllld,那么 hello 和后面的空格将被删除掉。
如果使用 V 命令也可以进入可视模式,这个时候整行都被选中了,这个时候,只能进行上下移动,左右移动将无效,每次上移或者下移都会选中一行。例如 Vjj 那么你会选择 3 行。
可视模式下,使用 0 命令可以移动光标到被选择的文字的另一端。
使用 Ctrl-v(Windows 下是 Ctrl-q)进入可视模式,这个时候是以列块为单位(非常有用)。例如:
- aaa 1
- aaa 2
- aaa 3
现在想修改为
- bbb 1
- bbb 2
- bbb 3
这时候就可以使用 Ctrl-v 进入可视模式,然后选中三列 aaa,输入 c 命令用于删除 aaa 并插入 bbb。
关于粘贴的更多内容
命令 P 和命令 p 一样用于粘贴,只是命令 P 会把粘贴的内容粘贴在光标前。
删除字符后,能够使用 p 来粘贴被删除的字符,例如:
- hello.
我们在 hello 所在行输入 dd,删除这一行,那么这个时候可以使用 p 来粘贴这一行(无需先复制),因此我们在复制的时候需要注意,如果出现了删除操作,那么复制的内容将发生变换。
- hlelo.
如果我们输入 hello 成了 hlelo,我们需要修改 l 和 e 的位置,这个时候,我们只需要把光标移动到 l 上,然后敲入 xp。
使用剪贴板
我们使用命令 y 等复制的内容并不会放入剪贴板,如果需要把复制的内容放入剪贴板,那么可以在复制命令前面加上 “*(寄存器 *),对于粘贴也一样,如果需要粘贴来自剪贴板的字符,使用 “*p
用宏来消除重复的动作
通常情况下使用 . 命令就可以解决很多重复的改变,但有些情况比较特殊,例如连结两行时常常使用 Jx(用 x 删除连结之后的空格),这个时候,. 命令不起作用了,因为它会记录上一次的改变,既是 x 造成的删除,这里 Jx 是两个命令而非一个。因此,我们可以使用宏来解决问题。
使用 qa 开始录制宏到寄存器 a,这时候我们输入 Jx,然后输入 q 表示录制完成,之后我们就可以使用 @a 来表示 Jx 了
命令行相关操作
我们敲击 : 后可以在命令行中进行输入。我们敲击:
- Ctrl+r Ctrl+w
把处于光标下的 word 放入命令行中 - Ctrl+r Ctrl+a
把处于光标下的 word 放入命令行中,word 中可以包含标点符号 - Ctrl+r Reg
把寄存器 Reg 中的内容放入命令行中,例如:Ctrl+R+”
我们使用 y 命令复制的内容被存放于寄存器 0 中
在多个文件中查找
我们之前谈过了在某个文件进行查找的方法,如果希望在多个文件中进行查找,那么可以使用 vimgrep(vim)命令。其用法如下:
- vim[grep][!] /{pattern}/[g][j] {file} ...
我们在 pattern 后接上 \c 表示查找时忽略大小写,接上 \C 表示不忽略大小写。默认的时候是否匹配大小写受到 ignorecase 控制(而 smartcase 则不被使用)。我们看一些例子:
- :vimgrep /an error/ *.c
- :vimgrep /\<FileName\>/ *.h include/*
- :vimgrep /myfunc/ **/*.c
这里 ** 表示递归查找。
使用跳转列表(Jump list)
- 使用 Ctrl-o 用于跳转到前一个位置
- 使用 Ctrl-i 用于跳转到下一个位置
Insert mode completion(插入模式补全)
在插入和替换模式下,有很多的命令用来补全正在输入的一个关键词(keyword)或者一行:
- CTRL-X CTRL-N
使用当前文件中的关键词来进行补全 - CTRL-X CTRL-I
使用当前文件中的或者包含文件(include files)中的关键词来进行补全。例如:
现在存在一个 C 头文件 test.h,其中包含字符串 hello,而源文件 test.c 内容如下:- #include <test.h>
这时候输入 he CTRL-X CTRL-I 就可以进行补全
- CTRL-X CTRL-D
使用当前文件中的或者包含文件中的定义(或者宏)的名字进行补全 - CTRL-N 或者 CTRL-P(N 的含义为搜索下一个,P 的含义为搜索前一个)
关键词补全,在何处查找关键词,取决于 complete 选项的设置。complete 的值可以为(这里未全部列举):- . 表示搜索当前的 buffer
- w 表示搜索其他窗口的 buffer
- b 表示搜索其他的被载入的 buffers(在 buffer list 中)
- u 表示搜索未被载入的 buffers(在 buffer list 中)
- U 表示搜索 buffers(不在 buffer list 中)
- k 表示搜索由 dictionary 选项指定的文件
- k{dict} 表示搜索文件 {dict},例如:set cpt=k/usr/dict/*
- s 表示搜索由 thesaurus 选择指定的文件
- s{tsr} 表示搜索文件 {tsr}
- i 表示搜索当前和包含的文件
- d 表示搜索当前和包含的文件中的定义(或者宏)的名字
- ] 或者 t 表示 tag 补全
我们使用 “,” 来分隔各个值,默认的情况下,complete 的值为:
“.,w,b,u,t,i”
这里并没有完全列举所有的补全方式,详细请参考 Vim 帮助文档:
- :help ins-completion