Vim 实用技巧(持续更新中!)
转载请注明出处:https://blog.csdn.net/jpch89/article/details/85273813
最后更新于:2018.12.31
文章目录
1. 认识 .
命令
.
命令作用
- 重复上次修改。(参见
:h .
)
应用举例
-
x
命令会 删除光标下的字符,使用.
会让 重复删除光标下的字符。
多次输入u
撤销上述修改。 -
dd
命令删除一整行,使用.
命令会 重复删除当前行。 -
>G
增加从当前行到文档末尾处的缩进层级,使用.
会重复该操作。 -
每次
i
进入插入模式的那一刻,到返回普通模式为止,Vim
会记录每一个按键操作,做出这样一个修改再用.
命令,它会重新执行所有这些按键操作。
.
命令是一个微型的宏macro
2. 不要自我重复
var foo = 1
var bar = 'a'
var foobar = foo + bar
在行尾添加分号:
- 先
$
移动到行尾,然后a
编辑,输入分号,Esc
完成修改 - 对剩下的两行可以使用两次
j$.
.
意味着a;<Esc>
,一个键顶三个键
有没有改进的余地?
- 可以使用
A
代替$a
。A
把$a
封装成了一个按键操作。 - 然后输入分号,按
Esc
。 - 之后就可以使用
j.
来重复操作了。
一箭双雕
复合命令 | 等效的长命令 | 作用 |
---|---|---|
C | c$ | 删除到行尾并进入插入模式 |
s | cl | 删除当前字符并进入插入模式 |
S | ^C | 删除当前行内容并进入插入模式 |
3. 以退为进
需求:把 JavaScript
的字符串拼接的加号前后都加上空格。
var foo = "method("+argument1+","+argument2+")";
要改成:
var foo = "method(" + argument1 + "," + argument2 + ")";
f+
查找加号
注:f{char}
查找下一处指定字符出现的位置s空格+空格<Esc>
进行修改;
重复查找上次f
查找的字符.
重复上次修改;.
;.
注意:不用输入 4
次 f+
,用 ;
重复查找即可。
;.
重复查找 + 重复修改
4. 执行、重复、回退
重复很有用,但有时候多次按 .
或者 ;
的时候,容易出现多按的错误。
- 如果多按了
.
可以使用u
撤销上次修改。 - 如果多按了
;
可以使用,
跳转回去,因为,
会反向查找上次f{char}
所查找的字符
目的 | 操作 | 重复 | 回退 |
---|---|---|---|
做出一个修改 | {修改} | . | u |
在行内查找下一指定字符 | f{字符} / t{字符} | ; | , |
在行内查找上一指定字符 | F{字符} / T{字符} | ; | , |
在文档中查找下一处匹配项 | /pattern回车 | n | N |
在文档中查找上一处匹配项 | ?pattern回车 | n | N |
执行替换 | :s/target/replacement | & | u |
执行一系列修改 | qx{修改}q | @x | u |
注意:t{字符}
的在查找的字符前面停下来,而 T{字符}
在查找的字符后面停下来。
5. 查找并手动替换
需求
把文本中的 content
替换成 copy
。
...We're waiting for content before the site can go live...
...If you are content with this, let's go ahead with it...
...We'll launch as soon as we have the content...
:substitute
命令专门用于查找替换任务。
偷懒的办法:无需输入就可以进行查找
作者云:.
命令是我最喜爱的 Vim
单键命令,排在第二的是 *
命令,此命令 可以查找当前光标下的单词。
/content
:查找到content
单词
或者直接把光标移动到这个单词上*
:查找该单词cw
copy<Esc>
:修改content
为copy
n
:找到下一个.
:重复修改n.n.n.
:完成所有修改- 如果不想修改,不按
.
直接按n
跳转到下一个即可
移动光标到 content
上,然后按 *
,会产生两个结果:
- 光标跳到下一个匹配项上
- 所有出现这个词的地方都被高亮显示
如果没有高亮,试着运行:set hls
6. 认识 .
范式
.
范式是最理想的编辑模式,用一键移动,另一键执行。
- 只需要按一次键就能把光标移到下一个目标上
- 都利用
.
命令重复上次修改
普通模式 normal mode
是 Vim
的默认状态。
7. 停顿时请移开画笔
画家在休息时不会把画笔放在画布上。
普通模式就是 Vim
的自然放松状态,其名字已经寓示了这一点。
8. 把撤销单元切成块
u
键会触发撤销命令,它会撤销最新的修改。
在 Vim
中,我们自己可以控制撤销命令的粒度。
从进入插入模式开始,直到返回普通模式为止,在此期间输入或删除的任何内容都被当成一次修改。
因此,只要控制好 <Esc>
键的使用,就可使撤销命令作用于单词、句子或段落。
多久离开一次插入模式?
作者喜欢让每个 “可撤销块” 对应一次思考过程。
不管停顿的时间有多短,每次停顿都是一个自然的中断点,提示作者该退出插入模式了。
当处于插入模式中,另起一行最快的方式是按 <CR>
。
但是有时作者更喜欢按 <Esc>o
,这是因为作者有预感,也许在撤销时作者想拥有更细的粒度。
一般来讲,如果你停顿的时间长到足以问 “我应该退出插入模式吗?” 这个问题,就退出吧。
在插入模式中使用方向键移动光标会重置修改状态
如果在插入模式中使用了 <Up>
、<Down>
、<Left>
、<Right>
这些光标键,将会产生一个新的撤销快。
你可以把这想象为先切换回普通模式,然后用 h
、j
、k
、l
命令对光标进行了移动,但是没有退出插入模式。
这会对 .
命令的操作产生影响。
9. 构造可重复的修改
在 Vim
中,评估哪种方式最好时,最显而易见的指标是效率,即哪种手段需要的按键次数最少(又名 VimGolf
)。
VimGolf
http://vimgolf.com/
然而在平局时如何选择胜者呢?
需求
The end is nigh
光标位于 h
,现在要删除单词 nigh
。
反向删除:Vim
高尔夫得分 3
db
删除从光标起始位置到单词开头的内容x
删除h
正向删除:Vim
高尔夫得分 3
b
移动到单词开头dw
删除整个单词
删除整个单词:Vim
高尔夫得分 3
使用 aw
文本对象 text object
daw
删除一个单词(可以解读为delete a word
)
决胜局:哪种方式最具重复性?
看哪种方式可以发挥 .
命令的最大威力。
反向删除 .
== x
正向删除 .
== dw
删除整个单词 .
== daw
所以 daw
胜出!