Vim中文件的一部分快照:隐藏注释和空白行

noj*_*han 6 c c++ vim comments

如何临时显示文件的快照,同时隐藏注释和空白行?

目的是在密集页面格式化中获取C++函数(例如)的捕获.

这样做的方法是使用全局命令过滤掉注释行

:g!/\/\/
Run Code Online (Sandbox Code Playgroud)

但随后语法高亮和移动控件消失.

Vim的折叠功能是一种完成这项工作的方法,但它只会将几个连续的注释减少到视觉上侵入的单行.

无论如何,折叠对于隐藏长C类注释仍然很有用,例如:

:set foldmethod=marker
:set foldmarker=/*,*/
Run Code Online (Sandbox Code Playgroud)

但是我没有设法在一个命令中轻松地折叠C(/ ... /)和C++(// ...)注释.

理想的伎俩是:

  • 隐藏(不只是折叠在一行)评论和空白行,
  • 也许在第一列上标明带有字符的隐藏线,
  • 处理C和C++注释,
  • 同时保留语法高亮,
  • 理想情况下,浏览代码的能力,
  • 允许轻松恢复返回"评论"视图.

以便转换以下代码:

/** Let say hello
* and do not forget anybody
*/
void hello( int arg )
{
  // OMG an hello world!
  std::cout << "hello" << std::endl;

} // where is the world?
Run Code Online (Sandbox Code Playgroud)

进入以下缓冲区:

void hello( int arg )
{
  std::cout << "hello" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

cle*_*oux 4

可以使用以下命令从源中删除所有注释:
:%s/\/\*\_.\{-}\*\/\n\{,1}\|^\s*\/\/.*\n\|\s*\/\/.*//

然后可以使用该命令撤消此u操作(假设没有其他操作可撤消)。

由于 vi 正则表达式可能非常神秘,下面是每个部分的解释。整个正则表达式分为三个部分,由 OR 运算符 ( \|) 分隔。

\/\*\_.\{-}\*\/\n\{,1}
这是为了匹配表单的块注释/* ... */。它匹配字符串“/*”( \/\*),后跟零个或多个任意字符,包括换行符,但匹配尽可能少的字符 ( \_.\{-}),后跟零个或一个换行符 ( \n\{,1})。它匹配零个或一个新行的原因是为了处理与注释在同一行上有代码的情况以及注释本身在一行上的情况。

^\s*\/\/.*\n//...这是为了匹配注释单独占一行 的形式的注释。它匹配零个或多个以行首 ( ) 开头的空白字符,^\s*后跟字符串“//”( \/\/),然后是零个或多个任意字符 ( .*),最后以新行 ( \n) 结尾。

\s*\/\/.* 这与注释跟随代码的形式的注释匹配//...。它匹配任意数量的空格 ( \s*),后跟字符串//( \/\/),然后是任意数量的非换行符 ( .*)。

这是我目前能想到的最好的办法,如果我能想出一种方法来隐藏而不是删除评论,我会更新这篇文章。

更新:简单地“隐藏”评论的一种可能方法是将它们的颜色设置为与背景相同。这将使他们隐形。然而,我目前不知道这个想法的可行性如何,也不知道它的推广效果如何。我对 vim 中的颜色了解不够,无法编写脚本来完成此任务。