对vim操作的积累和总结
要熟悉Vim,首先肯定要了解Vim的三种模式,分别是Normal,Insert和Visual
1.Normal:
我认为普通模式的存在是为了输入和执行命令做准备的,先说输入,第一步肯定要快速定位到想输入的位置,在之前的一段时间里,我在普通模式下一直都只用基本的hjkl来进行光标的移动,但是后来发现效率实在是太低了,重新翻了翻VIm操作手册,发现了如下很有用,并且快捷的光标移动操作:
w : 移动到下一个单词开头,这样就比单纯的使用l要好很多,快很多
e : 移动到当前单词的末尾
b : 光标向后移动一个单词,同理,比h要好
0 : 光标移动到行首(并不会忽略空格和缩进)
^ : 光标移动到当前行第一个单词的开头,这个用得比0要多
$ : 光标移动到行尾,不知道为什么,我一直觉得这个操作很麻烦,能有个其他相对简便的就好了
( : 光标移动到下个句子,也就是说移动到下一个空白行
) : 光标移动到上个句子
Ctrl + f:向下移动一屏。
Ctrl + b:向上移动一屏。
G:到文件尾
numG:移动光标到指定的行(num)。(比如 10G 就是到第 10 行)
gg:到文件首
H:移动光标到屏幕上面
M:移动光标到屏幕中间
L:移动光标到屏幕下面
*:读取光标处的字符串,并且移动光标到它再次出现的地方。
\#:和上面的类似,但是是往反方向寻找。
/text:从当前光标处开始搜索字符串 text,并且到达 text 出现的地方。必须使用回车来开始这个搜索命令。如果想重复上次的搜索的话,按 n。
?text:和上面类似,但是是反方向。
ma:在当前光标的位置标记一个书签,名字为 a。书签名只能是小写字母。你看不见书签的存在,但它确实已经在那里了。
`a:到书签 a 处。注意这个不是单引号,它一般位于大部分键盘的 1 的左边。
`.:到你上次编辑文件的地方。这个命令很有用,而且你不用自己去标记它。
VIm的关键字补全功能:
可以使用Ctrl + p或者Ctrl + n来进行自动补全,这两条命令会循环搜索当前文件的匹配的字符串。
Vim在普通模式下的替换和删除
vim中可以使用:s命令来进行替换,如:
s/vim/vi/ 表示替换当前行的第一个vim为vi
s/vim/vi/g 表示替换当前行所有的vim为vi
vim可以用d来进行删除,如:
dw可以删除到下一个单词的开头
de可以删除到本单词的末尾
dd删除整行
3dd删除3行
D从光标处删除到该行末尾
d0从光标处删除到该行开头
2.Visual:
可视的选择模式有三种,分别是:
- v : 按字符进行选择
- V : 按行进行选择
- Ctrl + v : 按块进行选择
前两种是我用的比较多的,按块进行选择一般用于多行操作,这三种选择模式都可以配合之前的光标移动操作进行选择。
选择之后可以进行剪切或者复制:
d : 剪切
y : 拷贝
c : 剪切并且粘贴时会进入插入模式
也可以不进入可视模式来进行剪切和复制,比如:
dd/yy/cc : 剪切/拷贝/剪切(并进入插入模式)当前行
Tips: 进入可视模式在进行剪切拷贝相当于先选择后操作,也可以先操作后选择,比如dw表示剪切一个单词,dj表示剪切一行等等。
3.Insert:
插入模式并没有什么好讲的,无非就是 a/A/i/I/o/O 这些常用的命令进入到插入模式而已。
4.下面记录一下平时常用的也是非常方便的一些命令组合:
dt" : 删除内容,直到碰到","可以替换成其他符号,如‘,这个常用于字符串的删除操作
ciw(change inner word) : 上面的命令是删除直到"的内容,ciw可以删除当前光标所在的单词(不管光
标处在单词的什么位置)并且进入插入模式
caw(change a word) : 与change inner word 类似,但是具体的区别我google也没有找到答案
如果各位看官知道的话麻烦在下面留言,并说明具体场景下应用的不同,多谢!
ci{(change inner {) : 同理可应用在一些被{ < " ' 包裹的代码中,如使用 ci{ 可以删除{}包裹
的内容并且进入插入模式。
ca{ : 也可使用ca{删除由{}包裹的内容以及{},非常实用!!
同理可应用到sentence, block, paragraph中, 如:
dis, das, dib, dsb, dip, dsp等等
vey vep : 替换当前单词为剪切板的单词,首先移动到单词首,然后vey复制,
然后移动到要替换的单词的开头,vep粘贴
如果光标的位置不在单词开头也可以这样:
viwy viwp : 使用operator + motion的方式来选中inner word复制以及粘贴
多行操作,如多行注释: 首先移动到要注释的行的行首,然后Ctrl+v,移动光标选择多行,I(大写的i),
输入注释符,最后esc,此时多行被注释。
多行缩进就相对比较简单,首先大写的V,然后光标选择多行,<或者>进行缩进。
但是上面缩进的方法还是不是很方便,为何不直接<i{,可以将{替换为其他符号如:( <等
还有一个很常用的相当于一般ide里面的code format功能的缩进用法,使用==,或者对多行进行缩进,
如: 10==表示从当前行开始到下面10行自动进行缩进,而且可以自动识别语言从而给出正确的缩进格式。
使用gg=G可以对整个文件进行自动排版,使其有正确的缩进格式