目录
- 1 认识 . 命令
- 2 不要自我重复
- 3 以退为进
- 4 执行、重复、回退
- 5 查找并手动替换
1 认识 . 命令
. 命令让我们重复上次的修改,它是Vim中最为强大的多面手。我们来练习下,如何快速的在vim进行操作,由下图形:
转成如下图形:
我们就可以用 . 命令来帮助我们快速执行,具体步骤如下:
(假设我们的光标停留在第一行)
- j (移动到第二行)
- >G (从当前行到文档末尾处进行缩进)
- j (向下继续移动一行(光标到第三行)
- . (重复上次修改 (等同于>G)
- j (向下移动一行 (光标到第四行)
- . (重复上次修改 (等同于>G)
操作完后,就得到我们想要的结果了,用好 . 命令,会让我们高效地完成我们的改动,特别是需要重复执行的操作,. 命令绝对是我们的好帮手。
2 不要自我重复
对于在行尾添加内容这样的常见操作,如添加分号,Vim提供了一个专门的命令,可以把两步操作合并为一步。还是用上面图形举例将下图每行末尾添加一个分号’;':
如何快速实现呢,记住,不要自我重复!我们按照如下操作就可以实现:
(假设我们的光标在第一行)
- A;<Esc> : A来代替 $a , $ 将光标移到行尾,a在当前光标之后添加内容,; 插入分号内容,==<Esc>==按下esc键从插入模式进入普通模式
- j (移动光标到下行)
- . (重复上次的修改插入;内容)
- j. (移动光标并且重复上次的修改)
这样,我们就快速给每行的末尾添加了一个分号(若有很多行需要添加分号,这样操作也会是否麻烦,后面还有更高效的命令操作)
如下是几个高效的单键命令用来取代两个或者多个其他命令的组合,在vim命令中会经常用到:
复合命令 | 等效的长命令 | 说明 |
---|---|---|
C | c$ | 从当前光标到行尾内容全部删除 |
s | cl | 删除一个字符 |
S | ^C | 删除整行(dd) |
I | ^i | 从当前行首进行插入 |
A | $a | 从当前行尾进行插入追加内容 |
o | A<enter> | 在当前行后进入插入模式 |
O | ko | 在当前行上面进入插入模式 |
s | xi(cl) | 删除当前光标字符再进入插入模式 |
3 以退为进
我们可以用一种常用的vim操作习惯在一个字符前后各添加一个空格,那怎么高效做呢?假设我们有一行代码如下:
上述代码将字符串连接起来不美观,所以我们需要在"+"号前后各添加一个空格,让肉眼更容易识别。接下来我们要怎么高效实现呢?操作步骤如下:
- f+ (命令让vim光标移到下一个字符+所在的位置)
- s + (先删除光标下的字符,然后进入插入模式,我们输入一个 空格+空格)
- ; (重复查找上一次f命令所查找的字符)
- . (重复上一次的修改)
- ;. (移到到+,再重复上次的修改)
- ;. (移到到+,再重复上次的修改)
这样我们很高效的达到了我们想要的效果:
4 执行、重复、回退
在面对重复性工作时,我们需要让移动动作和修改都能够重复,这样就可以达到最佳的编辑模式。我们已经看到 . 命令会重复上次的修改,由于很多操作都被当成一次修改,因此 . 命令已经证明了它的神通广大如果我们知道如何重复之前的操作,而无需每次都输入整条命令,那么就会获得更高的效率。但当不小心做过头时,知道怎么回退会很有帮助。下表中总结了vim中可重复的命令以及相应的回退方式,在多数场景,撤销(undo)都是我们想要使用的命令,难怪我键盘上的u键磨损的这么厉害😁。
目的 | 操作 | 重复 | 回退 |
---|---|---|---|
做出一个修改 | {edit} | . | u |
在行内查找下一指定字符 | f{char}或者t{char} | ; | , |
在行内查找上一指定字符 | F{char}或者T{char} | ; | , |
在文档中查找下一处匹配项 | /pattern | n | N |
在文档中查找上一处匹配项 | ?pattern | n | N |
执行一次替换 | :s \text{:s} :s/target/replacement | & | u |
执行文本全部替换 | :%s/target/replacement | u |
5 查找并手动替换
假设我们想把如下内容里单词"content"替换成"copy":
我们常用的就是用替换命令解决:
:%s/content/copy/g
但是还可以用另外一种方式,无需输入就能够查找,* 命令,此命令可以查找当前光标下的单词。当光标移到content单词,然后按下 * 命令,就会对所有的content单词高亮,并且跳转到最后一个content,如下图所示:
然后我们可以cw再输入copy进行替换,再按n跳转到下一个,然后 . 命令重复操作。