我想知道在 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 ---|
谢谢,
答案 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结尾的嵌套块,它将只删除直到第一个。但是,我想这将是所有解决方案的限制。