首先说一句:VIM真的很强大…很强大…很强大…(此处省略N万字)
自从工作以来,一直使用VIM这个长得很像记事本的文本编辑工具,尽管到现在为止我只掌握了其中的一些技巧甚至只能说是基本用法,但是已经从中获益 良多,并且越发喜欢上了这个东西。现在没事的时候我就去翻VIM的中文手册,一行一行读,总是能从中发现一些新的技巧,这些看起来很小的技巧都很实用,对 工作帮助很大。最近又发现了一个东西,那就是文本对象(text-objects),总结在这里。
首先来看什么是文本对象。比如我们现在有下面一句话:
vim is very powerful!!
如果光标位于单词’powerful’中的’w'上而你要删除’powerful’这个单词,通常你需要把光标移到该单词的开头然后用”dw”命令。但是现在我们有一种更方便的方法,那就是不用移动光标而直接用”daw”命令。
“daw”命令中的”aw”表示”a word”的意思,就是表示一个单词,它就是一个文本对象。它和其他的操作不同点在于,它把整个文本作为一个对象,而不是对起始位置到目标位置进行操作(比如”dtc”就表示删除当前光标到下一个’c'字符之前的东西)。
文本对象让我着迷的地方在于:它节省了一些位移操作。我不必非要把光标移到某个地方去操作了,只要光标在单
词”powerful”中的任一个字符上,我都可以直接用 “daw”
命令删除掉它!!不要小看这样小的一种便利,因为在写代码的时候这种操作还是很多的。下面来说一下VIM中的所有文本对象(这个列表VIM手册中没有给
出,大家可以在VIM中输入命令:”:h text-objects” 来查看,或者):
1. aw 和 aW
分别表示”a word” 和 “a WORD”, 小写的 w 和大写的 W
略有区别,这个在手册里有详细介绍,VIM中有word和WORD的概念,简单来说就是有些字符比如分号等可以算作一个
“w”,但不能算作一个”W”,它可能和前面的字符共同作为一个 “W” 。
2. iw 和 iW
分别表示 “inner word” 和 “inner WORD” 。基本上有 “ax”(x表示变量)这种文本对象,就会有相应的 “ix”文本对象,关于 “i” 和 “a” 的具体区别最后我一块表名。
3. as 和 is
分别表示”a sentence” 和 “inner sentence” 。什么是VIM中的sentence呢?这个我搞了半天才搞明白,是这么说的:
A sentence is defined as ending at a ‘.’, ‘!’ or ‘?’ followed by either the end of a line, or by a space or tab.
翻译过来就是,一个 sentence 就是以行末尾、空格或tab制表符之前的 ‘.’, ‘!’ 或 ‘?’ 结尾的文本。这句话拆开来说就是,一个 sentence 肯定是以’.', ‘!’ 或 ‘?’ 结尾的,但是 ‘.’, ‘!’ 或 ‘?’ 之后必须是行的末尾、空格或tab制表符。好吧,我承认我表达不清楚,那么我举例说明,比如有这样一段文字:
this is a samp!le text.
虽然中间出现了 ‘!’ ,但是一个sentence还是在末尾的 ‘.’ 处结束,中间的那个’!'会被当作普通字符。但是如果是这样:
this is a sample! text.
情况就不同了,因为 ‘!’ 后面出现了空格,所以之前就算一个 sentence 了。不知道我这样解释清楚了没有,呵呵。另外,VIM中 paragraph 和 section 的边界(关于paragraph 和 section我就不多说了,太罗嗦了,呵呵,大家自己去看帮助吧)也是 sentence的边界,所以遇到空行的话sentence也会结束。
4. ap 和 ip
分别表示 “a paragraph” 和 “inner paragraph”。
5. a[ (或a]) 和 i[(或 i])
分别表示 “a [ ] block” 和 “inner [ ] block” 。”[ ]” 块就是表示以 “[" 开始到和它匹配的 "]“结束之间的内容。其中 ‘a[' 和 'a]‘ 、’i[' 和 'i]‘ 作用一样。
6. ab 和 aB
分别表示 “a block” 和 “a Block”。VIM中 “block” 表示光标前面的第一个未匹配的 “(” 到后面和它匹配的 “)” 之间的内容,”Block” 表示光标前面第一个未匹配的 “{” 到后面和它匹配的 “}” 之间的内容。
7.a< (或a>) 和 i<(或 i>)
和上面的第5条类似,把里面的 ‘[ ]‘ 替换成 ‘<>’ 理解就好了。
8. at 和 it
分别表示 “a tag block” 和 “inner tag block” 。”tag
block”表示光标前面第一个未匹配的
9. a” , a’, a` 和 i”, i’, a`
表示引用符号(”, ‘, `)之间的东西,如果输入a”就表示两个匹配 “” 之间的东西,以此类推。
以上就是VIM里面的全部文本对象了。下面说一下 a 和 i 的区别:
对于那些非块级的文本对象(w,W,s,p),如果后面有空格的话,使用a 前缀就包括后面的空格,使用 i 前缀就不包括后面的空格;如果光标正好在文本对象前面的空格上的话,使用 a 前缀就包括前面的空格,而使用 i 前缀就只是对前面的空格进行操作。其它没什么区别。
对于那些块级的文本对象([ ], ( ), <, >, b, B, t, “, ‘, `),使用 a 前缀表示包含这些边界符,而使用 i 前缀就表示不包含这些边界符,比如命令 “da[" 就会将包括 "[ ]” 的文本删除,而命令 “di[" 则只会删除 "[ ]” 里面的东西,不会删除 “[" 和 "]“。
终于介绍完了,累死我了,通过打出来上面这些字我又加深了印象,希望对那些对VIM使用不太熟练的人有些帮助,如果文中有什么错误,欢迎指出,先谢谢。如果还有其他关于文本对象的知识,也欢迎提出,也谢谢。
====