《Vim实用技巧(第2版)》——2.3 构造可重复的修改

简介: 要想充分利用 . 命令,事先常常需要进行一番周详的考虑。如果你发现自己要在几个地方做同样的小修改,就可以尝试构造你的修改,让它们能够被 . 命令重复执行。要识别出这类机会需要进行一定的实践,不过一旦养成了使修改可重复的习惯,你就会从 Vim 这里得到“奖赏”。

本节书摘来自异步社区《Vim实用技巧(第2版)》一书中的第2章,第2.3节,作者:【英】Drew Neil(尼尔)著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.3 构造可重复的修改

Vim对重复操作进行了优化,要利用这一点,必须考虑该如何构造修改。
在Vim中,要完成一件事,总是有不止一种方式。在评估哪种方式最好时,最显而易见的指标是效率,即哪种手段需要的按键次数最少(又名VimGolf [1])。然而,在平局时该如何选择获胜者呢?

在下例中,假设光标位于行尾处的字符“h”上,而我们想要删除单词“nigh”:

normal_mode/the_end.txt

The end is nigh
反向删除
因为光标已经位于单词末尾,所以可以先反向删除该词。
screenshot
按 db 命令删除从光标起始位置到单词开头的内容,但会原封未动地留下最后一个字符 “h”,再按一下 x 键就可以删除这个捣乱的字符。这样,整个操作的 Vim高尔夫得分是3分。

正向删除
这一次,让我们尝试一下正向删除。
screenshot
先用 b 命令把光标移到单词的开头,移动好后,就可以用一个 dw 命令删掉整个单词。这一次的Vim高尔夫得分也是3分。

删除整个单词
到目前为止,已有的两种方式都要先做某种准备工作或清理工作。另外,也可以使用更为精准的 aw 文本对象(text object),而不是用动作命令(参见 :h aw screenshot)。
screenshot
可以把 daw 命令解读为“delete a word”,这样比较容易记忆。在技巧52和技巧53中将介绍更多关于文本对象的细节。

决胜局:哪种方式最具重复性?
我们尝试了3种不同的方式来删除一个词:dbx、bdw 以及 daw。每种情况的Vim高尔夫得分都是3分。那么要怎么回答这个问题:“哪种方式最好?”

还记得吗,Vim对重复操作进行了优化。让我们再回顾一下这3种方式,这一次我们跟着用一次 . 命令,看看会发生什么。我建议你自己也亲自试一下。

反向删除方案包含两步操作:db 命令删除至单词的开头,而后x 命令删除一个字符。如果我们跟着执行一次 . 命令,它会重复删除一个字符( . = = x )。我不觉得这有什么价值。

正向删除方案也包含两步。这一次,b 只是一次普通的移动,而 dw 完成修改。此时用 . 命令会重复 dw,删除从光标位置到下个单词开头的内容。不过因为我们刚好已经在行尾了,并没有“下一个单词”,所以在这个场景里 . 命令没什么用。不过,至少它代表了一个更长点的操作(. = = dw)。

最后的方案只调用一个操作:daw。这个操作不仅仅删除了该单词,它还会删除一个空格,因此光标最终会停在单词“is”的最后一个字符上。如果此时使用 . 命令,它会重复上次删除单词的命令。这一次, . 命令会做真正有用的事情(. = = daw)。

结论
daw 可以发挥 . 命令的最大威力,因此我宣布它是本轮的获胜者。

要想充分利用 . 命令,事先常常需要进行一番周详的考虑。如果你发现自己要在几个地方做同样的小修改,就可以尝试构造你的修改,让它们能够被 . 命令重复执行。要识别出这类机会需要进行一定的实践,不过一旦养成了使修改可重复的习惯,你就会从 Vim 这里得到“奖赏”。

有时,我并没有看到用 . 命令的机会,然而在做完一次修改后,我发现要做另一次同样的操作,这时候,我脑海里会浮现出 . 命令,而它也已经准备好为我效力了。每当遇到这种情况时,我都会开心地笑起来。

相关文章
|
Ubuntu 开发工具
Ubuntu修改默认编辑器为vim
Ubuntu修改默认编辑器为vim
312 0
Ubuntu修改默认编辑器为vim
|
开发工具
Vim 修改tab为4个空格
Vim 修改tab为4个空格
158 0
Vim 修改tab为4个空格
|
Linux 开发工具
Linux 技术篇-使用vim命令创建、编辑文件内容实例演示,linux修改文档方法
Linux 技术篇-使用vim命令创建、编辑文件内容实例演示,linux修改文档方法
265 0
Linux 技术篇-使用vim命令创建、编辑文件内容实例演示,linux修改文档方法
|
存储 开发工具
oeasy教您玩转vim - 6 - # 保存修改
oeasy教您玩转vim - 6 - # 保存修改
153 0
|
开发工具 搜索推荐 网络安全
《Vim实用技巧(第2版)》——导读
Vim是高度可配置的,然而定制是一件很个性化的事情,因此我试图避免建议什么应该放进你的vimrc里,什么不应该。相反,本书关注的是Vim编辑器的核心功能。不管你是通过SSH登录远端服务器工作,还是在用本地安装了插件而增添了额外功能的GVim,这些功能都永远在那儿。
1809 0
|
开发工具
《Vim实用技巧(第2版)》——2.6 双剑合璧,天下无敌
如果想用 = 命令自动缩进整个文件,可以执行 gg=G (就是说,先用 gg 跳到文件开头,然后用 =G 自动缩进从光标位置到文件结尾的所有内容)。但是如果安装了textobj-entire插件的话,简单地执行 =ae 就可以了。运行这条命令时光标在哪儿并不重要,因为它总是作用于整个文件。
2447 0
|
开发工具
《Vim实用技巧(第2版)》——2.5 能够重复,就别用次数
在处理某些特定工作时,使用次数可以使按键次数变得最少,不过并不是非得这样不可。我们需要认真考虑次数与重复各自的优缺点。根据我们的讨论,d2w 和 2dw 是相同的,在执行完两者中的任一个后,可以按 u 键撤销,这样两个被删除的单词又会回来。
2650 0
|
开发工具 前端开发
《Vim实用技巧(第2版)》——2.4 用次数做简单的算术运算
本节书摘来自异步社区《Vim实用技巧(第2版)》一书中的第2章,第2.4节,作者:【英】Drew Neil(尼尔)著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1393 0
|
开发工具
《Vim实用技巧(第2版)》——2.2 把撤销单元切成块
在不区分模式的文本编辑器中,输入一些单词后使用撤销命令,有两种可能。一种是它可能会撤销最后输入的字符;另一种做得更好点,它可能会把字符分成块,使每次撤销操作删除一个单词而不是一个字符。
1437 0