在Vim中,相比针对单个字符进行操作,对于单词、句子和段落等更大范围的文本对象(text-objects )执行命令则更有效率。Vim的命令结构示例如下:
[number]<command>[text object or motion]
其中:number是指命令作用在几个文本对象之上。比如3个单词;command是指执行的具体命令。比如删除或复制;text object or motion是指具体的文本对象。比如单词、句子或段落。
文本对象的类型
iw
…inner wordaw
…a wordiW
…inner WORDaW
…a WORDis
…inner sentenceas
…a sentenceip
…inner paragraphap
…a paragraphit
…inner tagat
…a tagi(
ori)
…inner blocka(
ora)
…a blocki<
ori>
…inner blocka<
ora>
…a blocki{
ori}
…inner blocka{
ora}
…a blocki[
ori]
…inner blocka[
ora]
…a blocki"
…inner blocka"
…a blocki`
…inner blocka`
…a block
文本对象的作用范围
iw
表示inner word。如果键入viw
命令,那么首先v
将进入选择模式,然后iw
将选中当前单词。
aw
表示a word,它不但会选中当前单词,还会包含当前单词之后的空格。
以下实例中的红色 [ ] 表示作用范围:
iw | This is a [test] sentence. |
aw | This is a [test ]sentence. |
iW | This is a […test…] sentence. |
aW | This is a […test… ]sentence. |
is | …sentence. [This is a sentence.] This… |
as | …sentence. [This is a sentence. ]This… |
ip | End of previous paragraph. [This is a paragraph. It has two sentences.] The next. |
ap | End of previous paragraph. [This is a paragraph. It has two sentences. ]The next. |
i( or i) | 1 * ([2 + 3]) |
a( or a) | 1 * [(2 + 3)] |
i< or i> | The <[tag]> |
a< or i> | The [<tag>] |
i{ or i} | some {[ code block ]} |
a{ or a} | some [{ code block }] |
i[ or i] | some [[ code block ]] |
a[ or a] | some [[ code block ]] |
i" | The "[best]" |
a" | The[ “best”] |
i` | The `[best]` |
a` | The[ `best`] |
文本对象的应用实例
使用ci)
命令,可以删除括号内的所有内容,但保留括号本身。而ca)
命令,则可以删除括号内的所有内容,以及括号本身。
在某个开括号上,点击%
键,光标将可以自动移动到相对应的闭括号上。通过与编辑命令组合,c%
可以实现与ca)
相同的功能。使用%
命令,必须将光标放在括号之上;而使用a)
命令,则光标可以在括号之上或括号内的任何位置。而且%
命令,也是无法实现用i)
命令效果的。
使用cit
命令,你甚至不用将光标移动到Tag之内,就可以快速修改其中的内容。
使用ci"
命令,可以快速修改当前行内第一个双引号其中的内容。
使用ci'
命令,可以快速修改当前行内第一个单引号其中的内容。
没有评论:
发表评论