【问题标题】:Automatically indent file after command in VimVim 中的命令后自动缩进文件
【发布时间】:2016-01-21 16:09:38
【问题描述】:

我正在尝试编写一个名为 Remove 的自定义 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 作为命令的一部分自动运行?

【问题讨论】:

  • 使用 :normal 命令。如果您需要多个命令,请将其与 :execute 结合使用。

标签: vim command indentation


【解决方案1】:

当然。您可以使用| 连接多个命令。如果这变得太长,您可以将代码分解为:function。因为=是普通模式命令,而不是像:substitute那样的Ex命令,所以需要通过:normal调用它; ! 避免了映射干扰。

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

【讨论】:

  • 谢谢!这非常适合学习如何 |和正常!在 vim 中工作。我实际上使用了 yolenoyer 的解决方案,因为它看起来更优雅一些,但这个回答似乎是我问题的真正答案。
【解决方案2】:

缩进是错误的,因为您的 Remove 命令没有删除找到的行中的前导空格/制表符。

您可以修改命令以删除空格,而不是重新缩进所有文件:

:command -nargs=1 Remove %s/^\s*\V<args>\n//g
  • ^ 匹配行首;
  • \s* 匹配可选的空格或制表符;您甚至可以在 \n 之前再次放置 \s*,以考虑末尾带有隐藏空格的行;
  • 我添加了\V,这样可以避免解释命令参数中的特殊正则表达式字符。不放的话,如下命令:

    :Remove char *my_str = 0;
    

    会因为*而被误解。

【讨论】:

  • 太棒了!我最终使用了这个解决方案,因为它看起来更优雅一些,尽管 Karkat 的解决方案在技术上是我所写问题的更直接的答案。
猜你喜欢
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多