你可以尝试编写宏。首先,需要一个将“%[insert here]”转换为cout格式的宏。
:reg
"f 0f%2xmcf"f,dwdw`ci" << ^[pa << "^[
这个宏键 F 的功能是:
0f%
跳转到行首,查找第一个百分号(假设 % 没有其他用途)。
2xmc
删除 %d
部分,然后将当前位置在行中存储在标记 c 中。
f"f,
查找字符串的结尾,然后查找第一个逗号。
dwdw
删除逗号,然后删除变量名。这将使变量被存储,以便稍后粘贴。
[backtick]c
转到标记 c 中行中存储的位置。
i" << ^[
将 " <<
插入字符串并返回命令模式。
pa << "^[
粘贴存储的变量名,然后插入字符串 << "
。
所以,最终结果如下:
printf("test %d\n", var); // Before
printf("test " << var << "\n"); // After
在另一个宏键 R 上,只需重复执行宏 F 多次(比如 100 次)。如果你的变量少于 100 个,它不会完成宏,因为
f%
会失败。请注意保留 HTML 标签。
:reg
"r 100@f
因此,一个例子是:
printf("test %d %d %d %d %d\n", var, var1, var2, var3, var4); // Before
printf("test " << var << " " << var1 << " " << var2 << " " << var3 << " " << var4 << "\n"); // After
现在编写一个C宏,将开始和结束转换为C++!
:reg
"c 0trcwcout << ^[f(x$F)x
0tr
跳转到行首,并查找第一个r之前的内容。这是为了处理不同缩进级别的情况。我们将定位在printf
中的p
处。
cwcout << ^[
将printf
更改为cout <<
并切换到命令模式。
f(x
查找printf(
中的(
并删除它。
$F)x
跳转到行尾,查找最后一个)
并删除它。
这样得到:
printf("test " << var << " " << var1 << " " << var2 << " " << var3 << " " << var4 << "\n"); // Before
cout << "test " << var << " " << var1 << " " << var2 << " " << var3 << " " << var4 << "\n"; // After
为了将所有内容联系起来,创建另一个名为T的宏,该宏查找
printf
,运行宏C,然后运行宏F。按照这个顺序完成操作,以便如果早期某个部分失败,其余命令不会运行。
:reg
"t /printf^M@c@r
运行这个宏3次将会执行以下操作:
// Before
printf("test %d\n", var);
printf("test %d %d %d %d %d\n", var, var1, var2, var3, var4);
printf("test %d %d\n", var, var2);
// After
cout << "test " << var << "\n";
cout << "test " << var << " " << var1 << " " << var2 << " " << var3 << " " << var4 << "\n";
cout << "test " << var << " " << var2 << "\n";
这个解决方案并不完美,它假设在任何其他格式中都没有使用百分比,并且必须为每个printf手动重复(重复使用@@
)。���望它至少有用,并展示了vim的强大功能。
Perl
外,如果您有访问权限,您还可以使用Unixsed
或编写C宏。在这里的问题是我们需要查看所有的printf
行以帮助您解决问题。如果您需要任何printf
语句的通用解决方案,则会很麻烦。此外,vim的正则表达式也非常强大。如果您不知道Perl
或sed
,那么请打开vim的正则表达式教程并一遍又一遍地尝试。 - lllllllllll