Vim

动作,操作符,文本对象

动作 也就是指移动光标的操作,你肯定很熟悉 hjkl,以及 wb。但其实,/ 也是一个动作。他们都可以搭配数字使用,比如 2?the 可以将光标移动到倒数第二个 "the" 出现的位置。

以下会列出一些常用的动作。你也可以通过 :h navigation 来获取更多的帮助。

操作符 是对某个区域文本执行的操作。比如,d~gU> 都是操作符。这些操作符既可以在普通模式下使用,也可以在可视模式下使用。在普通模式中,顺序是先按操作符,再按动作指令,比如 >j。在可视模式中,选中区域后直接按操作符就可以,比如 Vjd

与动作一样,操作符也可以搭配数字使用,比如 2gUw 可以将当前单词以及下一个单词转成大写。由于动作和操作符都可以搭配数字使用,因此 2gU2w 与执行两次 gU2w 效果是相同的。

请参阅 :h operator 来查看所有的操作符。你也可以通过 :set tildeop 命令把 ~ 也变成一个操作符

值得注意的是,动作是单向的,而文本对象 是双向的。文本对象不仅作用于符号(比如括号、中括号和大括号等)标记的范围内,也作用于整个单词、整个句子等其他情况。

文本对象不能用于普通模式中移动光标的操作,因为光标还没有智能到可以向两个方向同时跳转。但这个功能可以在可视模式中实现,因为在对象的一端选中的情况下,光标只需要跳转到另一端就可以了。

文本对象操作一般用 ia 加上对象标识符操作,其中 i 表示在对象内(英文 inner)操作,a 表示对整个对象(英文 around)操作,这时开头和结尾的空格都会被考虑进来。举个例子,diw 可以删除当前单词,ci( 可以改变括号中的内容。

文本对象同样可以与数字搭配使用。比如,像 ((( ))) 这样的文本,假如光标位于最内层的括号上或最内层的括号内,那么 d2a( 将会删除从最内层开始的两对括号,以及他们之间的所有内容。其实,d2a( 这个操作等同于 2da(。在 VIM 的命令中,如果有两处都可以接收数字作为参数,那么最终结果就等同于两个数字相乘。在这里,da( 都是可以接收参数的,一个参数是 1,另一个是 2,我们可以把它们相乘然后放到最前面。

请参阅 :h text-objects 来获取更多关于文本对象的帮助。