在VIM中,如何在满足正则表达式之前删除所有行?

Ski*_*man 9 vim

我确信这已经得到了解答,但对谷歌来说查询有点过于复杂.

简而言之,我试图从一些代码中删除许多弃用的方法.所以我正在浏览文件,当我看到一个我要删除的方法时,我将删除每一行,直到我看到一行以制表符开头,然后是字符串"def".

我在想VIM应该让我创建一个简单的宏来做到这一点,但诀窍是逃避我.

这是我要删除的东西.

def Method_to_Delete(self):
    """


    @return Control ID :
    @author
    """
    results = {}
    results['xx'] = "thingy"
    results['yy'] = 'thingy2'
    return results

def Method_to_Keep(self):
    """
     This is a method that does something wonderful!!!

    @return Control ID :
    @author
    """
    results = {}
    results['xxx'] = "WhooHoo!"
    results['yyy'] = 'yippee!!'
    return results
Run Code Online (Sandbox Code Playgroud)

我希望将光标放在"def Method_to_Delete"的行上并做一些将删除但不包括"def Method_to_Keep"的内容

必须有比多个"dd"命令更好的方法.

gun*_*uns 14

Vim搜索实际上是文本对象!这意味着您可以简单地:

d/\s*def
Run Code Online (Sandbox Code Playgroud)

然后,只需.根据需要重复该命令.


Pet*_*ker 12

使用:delete带有范围的ex命令

:,/Keep/-1d
Run Code Online (Sandbox Code Playgroud)

说明

  • 完整的命令将是 :.,/Keep/-1delete
  • .,/Keep/-1delete命令行动的范围
  • . 表示当前行.
  • b/c我们正在使用一个范围,从当前位置开始.可以假设和删除
  • /Keep/ 搜索匹配"Keep"的行
  • /Keep/-1 搜索匹配的行然后减去一行
  • :delete 可以缩短为 :d

有关更多帮助请参阅

:h :range
:h :d
Run Code Online (Sandbox Code Playgroud)