2016-01-21 87 views
1

我正在尝试编写一个名为Remove的自定义vim命令,它只接受一个参数,并删除文件中所有与该参数完全相同的行。例如,如果该文件是在Vim中自动缩进文件后的命令

int main() { 
    int x = 3; 
    int y = 4; 
    cout << x << endl; 
} 

,我用命令

:Remove int y = 4; 

输出将

int main() { 
    int x = 3; 
    cout << x << endl; 
} 

我可以通过定义

:command -nargs=1 Remove :%s/<args>\n//g 
八九不离十

但是用这个命令该文件不是替换后正确缩进,这要求我在之后运行gg = G.

有没有办法让gg = G作为命令的一部分自动运行?

+0

使用:normal命令。将它与以下内容结合使用:如果需要多个命令,请执行。 – Ben

回答

2

当然。您可以连接多个命令与|。如果时间太长,可以将代码分解为:function。因为=正常模式命令,而不是Ex命令:substitute,您需要通过:normal调用它; !避免映射干扰。

:command -nargs=1 Remove %s/<args>\n//g | normal! gg=G 
+0

谢谢!这对于学习如何|非常有用和正常!在vim工作。我实际上使用了yolenoyer的解决方案,因为它似乎更优雅一些,但这种回应似乎是我的问题的真正答案。 –

1

缩进是错误的,因为你的Remove命令不会删除找到的线前导空格/制表符。

而是重新缩进的所有文件,你可以修改你的命令把空格去掉以及:

:command -nargs=1 Remove %s/^\s*\V<args>\n//g 
  • ^行的开头匹配;
  • \s*与可选空格或制表符匹配;你甚至可以在\n之前再次放置\s*,以考虑最后有隐藏空间的线;
  • 我加了\V,它可以避免你的命令参数中的特殊正则表达式字符被解释。如果你不把它下面的命令:

    :Remove char *my_str = 0; 
    

    会因为*的误解。

+0

太棒了!我最终使用了这个解决方案,因为它看起来更优雅一些,尽管Karkat的解决方案在技术上是对我写的问题的更直接的回答。 –