Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1273759
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-09-02 15:58:09

首先说一句: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”表示光标前面第一个未匹配的 和与它匹配的 之间的内容,比如一个闭合的

块。这个在编辑HTML文件的时候特别好用!!

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使用不太熟练的人有些帮助,如果文中有什么错误,欢迎指出,先谢谢。如果还有其他关于文本对象的知识,也欢迎提出,也谢谢。

====


阅读(744) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~