Vim Global Command用法(g命令)

来源:互联网 发布:高三要有多努力 知乎 编辑:程序博客网 时间:2024/06/05 20:33

Task

删除一个文本文件中的所有带 ‘test’ 的行,以及这一行的前一行和后一行。
如何用Vim实现?

Solution

  • :g/test/-,/test/+ d

上面的命令是如何工作的呢?这你就需要了解vim的global命令(g命令)
:g就是global命令

语法:

  • :[range]g/pattern/cmd
  • :g/pattern1/, /pattern2/cmd

第一种语法会在range的范围内搜索pattern, 如果符合要求就执行cmd.
第二种语法会在/p1/, /p2/之间执行cmd

例:

  • :g/test/d
    删除所有带test的行
  • :g!/test/d
    保留带test的行
  • :g/hello/, /world/d
    删除所有hello, world之间的行

提取宏定义

有如下代码,现在要求提取出当TEST为Ture时,所定义的内容

#ifdef TESTtest1test2#elseno test#endif

可以这样写g命令

:g/#ifdef TEST/+1, /#else\|#endif/-1 t $

+1代表取下一行,-1代表取上一行, #else|#endif表示满足#else或者#endif这两个条件都可以。
用以上的命令可以成功了取得#ifdef TEST所包含的内容

但如果我们想要取不满足#ifdef TEST的内容怎么办呢,这个问题要比上面的问题复杂。我们不能直接去搜索#else, 因为它之前有可能是其它的#ifdef, 而不是#ifdef TEST,其次,不是所有的#ifdef TEST都有#else定义。
所有我们要使用try和endtry命令

:try|g/#ifdef TEST//#else/+1, /#endif/-1 t $|endtry

解释一下,先找#ifdef TEST, 找到后再找#else, 然后取下一行,再找到#endif取上一行。

0 0