vim 如何在C++中的两个注解之间注解掉代码

1dkrff03  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(115)

如果我有几个代码段,看起来像:

// XXX DEBUG
printf("example code");
int y = 6;
// XXX END DEBUG

我想在Vim中运行一个命令来注解掉XXX DEBUGXXX END DEBUG之间的位:

// XXX DEBUG
// printf("example code");
// int y = 6;
// XXX END DEBUG

我试过使用:g和交换机

:g#^.*// XXX DEBUG#.,#^.*// XXX END DEBUG#normal I//

但这只是我的土地错误消息E492: Not an editor command: .,#^.*// XXX END DEBUG#normal I//

7gcisfzg

7gcisfzg1#

不能在范围中使用替代分隔符。一个很好的理由是,当你执行<whatever>foo<whatever>时,很难知道你指的是/foo/还是?foo?。在:help :g:help :s中使用替代分隔符是可能的,因为在这种情况下不可能出现这种混淆。
因此,您可以保留“:global“部分的# s,但您需要在:normal的范围内转义//

:g#^.*// XXX DEBUG#.,/^.*\/\/ XXX END DEBUG/normal I// <-- space here

或者使用\v来改变图案的“魔力”:

:g#^.*// XXX DEBUG#.,/\v^.*// XXX END DEBUG/normal I// <-- space here

现在,这工作:

// // XXX DEBUG
// printf("example code");
// int y = 6;
// // XXX END DEBUG

算是吧
照原样,您将//前置到匹配行 * 之间 * 的行,但由于缺少偏移量,也前置到匹配行本身:

here -+             and here -+
                   |                       |
                   V                       V
:g#^.*// XXX DEBUG#.,/\v^.*// XXX END DEBUG/normal I// <-- space here

在下面的固定版本中,

  • :normal的范围必须从匹配行下面的行开始,所以你可以使用.+或简单的+
  • 并且它必须在搜索匹配项上方的行上结束,所以你可以使用/re/-

它应该是这样的:

:g#^.*// XXX DEBUG#.+,/\v^.*// XXX END DEBUG/-normal I// <-- space here

相关问题