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;
会因为 *
.
而被误解
我正在尝试编写一个名为 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;
会因为
*
. 而被误解