写在前面
本篇开始介绍 Vim 的另一类核心操作:文本对象与宏。这是筑牢 Vim 基础后真正开始为开发者提效的一章,也是 Vim 在文本编辑领域至今没有敌手的重要原因之一。只要你还在写 HTML、还需要修改配置文件、还需要一次性变更代码块中的文本,Vim 的操作效率就会秒杀其他文本工具,不仅可以摆脱对鼠标的依赖,甚至都不用把右手移到旁边的四个方向键。这样节约的时间看似微不足道,长期积累下来就非常可观了,甚至还可以缓解因为频繁操作鼠标导致的腱鞘炎。总之,Vim 的强大,谁用谁知道。
本节演示文件:vimclass/textobjects.txt
。
Vim
中的 文本对象(Text Objects)(又叫 逻辑区域(Logical Regions))主要包括:
HTML
标签语法一:
{operator}{a}{object}
语法二:
{operator}{i}{object}
删除整个单词:
DAW:即 Delete A Word(带对象分隔符,A 表示 around
或 all
)
更改整个单词:
CIW:即 Change Inner Word(不带对象分隔符,I 表示 inner
)
此外,{object}
指代 “单词” 时(即 w
与 W
)也有大小写的区别,主要体现在 对象分隔符 的认定上:
句子(Sentence)对应的 {object}
为 s
,例如以下操作指令:
此外,对于句子中出现换行的情况,Vim
也能自动视为同一句话,一并处理。例如,对于下列三句话,如果需要删除第二句,操作前如下所示(假设光标位于单词 multiple
上):
This is a sentence comprised of many words. This is another sentence. A
paragraph is made up of multiple sentences. Just like this one!
执行操作 DAS,得到:
This is a sentence comprised of many words. This is another sentence. Just like this one!
重复上述操作,还可以使用快捷键 .。
在 Vim
中,一句话是以句点 .
结尾的;而一个段落则是用空行进行分隔的。段落对应的对象表示为 p
,即段落的英文单词 paragraph
的首字母,相关操作如下(以 d
命令为例):
中括号对应的文本对象用 [
或 ]
表示,二者含义相同,都指代中括号圈定的文字,与 A 结合表示包含括号本身,与 I 组合则仅针对其中的文本。例如:
在 Vim
中,小括号对应的文本对象用 (
或 )
表示;包含小括号用 a
,不包含则与 i
组合。例如:
同时,小括号还可以用 b
表示,意指 block
区块,同时也省去了多按一次 Shift 键的麻烦。
在 Vim
中,尖括号对应的文本对象用 <
或 >
表示,包含则用 a
,不包含与 i
组合。例如,对 作如下操作:
);html
);在 Vim
中,标签对应的文本对象为 t
(即 tag
的首字母)。包含标签与 a
组合,不包含则与 i
组合。例如,删除下列文本中 p
标签内的文字(不含 p
标签本身):
<p>This is <strong>so, so, verystrong> cool!p>
按 DIT,得到:
<p>p>
注意
当标签只存在嵌套的其他标签时,光标必须正确定位,因为
t
只对当前光标所在的最近一层的标签生效。因此,如果光标位于内,则只对
圈定的文字生效,而位于
p
内部、strong
外部的文字则不受影响。此外,对于自定义的标签(如 XML 或自定义组件标签),
at
与it
操作同样适用。
同理,大括号对应的文本对象用 {
或 }
表示,且与 a
组合表示包含大括号本身,与 i
组合表示不包含大括号。与标签的情况类似,存在嵌套时,也仅对当前光标所在的最内层大括号生效。
同时,也可以用 B
表示大括号文本对象,与小括号的 b
相对。这里也体现了 Vim
的形象化思维:小括号用小写的 b
表示(即小写的 block
区块);大括号用大写的 B
表示(对应大写的 Block
区块)。
【图 28-1:本节思维导图】
后话
不得不佩服 Vim 对各种键位的天才设计思路,与英语的自然融合几乎不用去死记硬背这些组合键。很多人被 Vim 所谓的高门槛吓退,殊不知磨刀不误砍柴工。忽视这样先难后易、掌握后终身受用的硬核技能,也就是大部分人捡芝麻丢西瓜的倒置人生的真实写照。