Vim 命令后自动缩进文件

Automatically indent file after command in Vim

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

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

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

缩进是错误的,因为您的 Remove 命令没有删除找到的行中的前导 spaces/tabs。

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

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

    :Remove char *my_str = 0;
    

    会因为 *.

  • 而被误解