多行 C 注释的 Vim 不同的文本宽度?

Posted

技术标签:

【中文标题】多行 C 注释的 Vim 不同的文本宽度?【英文标题】:Vim different textwidth for multiline C comments? 【发布时间】:2011-03-29 08:27:55 【问题描述】:

在我们的 C++ 代码库中,我们保留了 99 列行,但保留了 79 个奇数列的多行 cmets。是否有一个很好的策略来自动执行此操作?我假设这些模式是已知的,因为智能注释行连接和前导 * 插入。

【问题讨论】:

您可以设置自定义formatexprformatprg,但这需要编写vim 插件或外部格式化程序,详情请参阅帮助。我不知道有任何插件可以为您执行此操作,但我不确定它们是否存在。 您介意发布示例代码或提供一些您想要格式化的代码的链接吗?没有承诺,但我也许可以编写一个简单的格式化程序。 @molecules:我不是在寻找格式化程序,只是在我在多行注释中输入时自动知道我的 textwidth 是 79 而不是正常的 99。 【参考方案1】:

我遇到了同样的问题,并认为我找到了合适的解决方案。

我希望我的 cmets 自动换行,这样我在打字时就不必担心文本格式。这适用于评论文本。但是我对使用 vim 格式化我的代码感到不舒服。所以我希望 vim 在 x 列之后用红色突出显示所有内容。

要仅使用 cpp 代码执行此操作,您需要将以下内容添加到 ~/.vim/ftdetect/cpp.vim 文件中。

set textwidth=79
match ErrorMsg '\%>99v.\+'

注意:如果文件和文件夹不存在,您可能需要创建它们。

如果您对此有疑问,请确保您将 formatoptions 设置为:

formatoptions=croql

你可以通过在 vim 中运行 :set formatoptions 来看到这一点。

【讨论】:

对不起,但不——这与我提出的这个问题的解决方案相同:***.com/questions/235439 在整个地方突出显示垃圾比我希望的要精细得多!跨度> 【参考方案2】:

显然 code 和 cmets 都使用相同的 textwidth 选项。据我所知,唯一的技巧是动态设置此选项:

 :autocmd CursorMoved,CursorMovedI * :if match(getline(.), '^\s*\*') == 0 | :setlocal textwidth=79 | :else | :setlocal textwidth=99 | :endif

这里的关键部分是检测我们何时在评论中。如果您只以这种方式格式化 cmets:

/*
 * my comment
 */

我的正则表达式应该可以工作...除非您的代码中有以* 开头的行(我猜这可能发生在C 中,在C++ 中发生的频率较低)。如果你像这样使用 cmets:

// comment line 1
// comment line 2

正则表达式更容易编写。如果您想涵盖所有可能的情况,包括极端情况,那么……我想最好的办法是定义一个单独的检测函数并从 :autocmd 而不是 match() 调用它。

【讨论】:

+1,我会发布一个类似的提议,但它会与这个相同。 这对性能有什么影响?如果我通过 SSH 连接到服务器,这会显着增加我的延迟吗? 不会@Kazark,所有逻辑都在 Vim 内部执行(即服务器端)。话虽如此,如果您在本地使用它(即不通过 SSH),它会以同样的方式影响性能

以上是关于多行 C 注释的 Vim 不同的文本宽度?的主要内容,如果未能解决你的问题,请参考以下文章

vim中多行注释 和 删除多行注释

vim中多行注释 和 删除多行注释

vim编辑器-多行加注释与去注释

[VIM] 编辑器---多行注释和取消注释及多行复制和黏贴

如何在 vi/Vim 中的多行选择的开头插入文本

vim—多行注释取消多行注释