如何在vim中删除以某些特定模式开始/结束的代码块?

时间:2014-01-21 15:45:28

标签: vim

我想知道在 vim 中是否有某种方法可以删除第一行/最后一行与特定模式匹配的所有代码块。例如,我有一个带有很多#if #endif块的c ++代码我想摆脱:

#if GGSDEBUG  ---|
somecode        Block to delete
#endif        ---|

//code

#if GGSDEBUG  ---|
somecode        Block to delete
#endif        ---|

//code

#if GGSDEBUG  ---|
somecode        Block to delete
#endif        ---|

谢谢,

4 个答案:

答案 0 :(得分:6)

使用:global命令找到块的所有起始行,并在那里执行命令。

:g/^#if GGSDEBUG/ [...]

当光标位于块的第一行时,您可以通过指定以描述块结尾的模式结束的范围:delete块:

:.,/^#endif/delete

放在一起:

:g/^#if GGSDEBUG/.,/^#endif/delete

您可以调整模式(例如,将\n\zs$附加到endif以删除以下空行)。

答案 1 :(得分:3)

对于C代码,您可以使用内置匹配行为:

:g/^#if\>/normal!V%d

这可以正确处理嵌套。 (至少,它应该,并且在我的小测试中它。)对于其他语言,使用matchit并删除

:runtime macros/matchit.vim
:e foo.html
:g/^<table>/normal Vh%d

:help :normal
:help %
:help matchit-install
:helptags $VIMRUNTIME/macros
:help matchit-%

答案 2 :(得分:2)

在其中一个区块中,您可以使用Ingo答案的这种变体:

:?^#if GGSDEBUG?,/^#endif/d

:?pattern before the cursor?,/pattern after the cursor/delete

答案 3 :(得分:1)

使用此选项:它会自动删除文件中所有次出现。

它使用非贪婪的搜索\{-}(代替*)并使用\(.\|\n\)(代替简单的&#34;。&#34;)在模式中延伸多行:

:%s/^#if GGSDEBUG\(.\|\n\)\{-}#endif//g

注意:如果您有以#endif结尾的嵌套块,它将只删除直到第一个。但是,我想这将是所有解决方案的限制。