Vim如何针对多行C注释设置不同的textwidth?

21
在我们的C++代码库中,我们保留99列行,但79多列的多行注释。有没有一种好的策略可以自动完成这个过程?我假设模式已经被识别出来,因为智能注释行连接和前导*插入。

你可以设置自定义的 formatexprformatprg,但这需要编写一个 Vim 插件或外部格式化程序,请参阅帮助以获取详细信息。我不知道是否有任何插件可以为您完成此操作,但我也不能确定它们不存在。 - ZyX
你介意发一些示例代码或提供一个链接,以便格式化代码吗?不能保证,但我可能能够编写一个简单的格式化程序。 - Christopher Bottoms
@molecules:我不是在寻找一个格式化程序,只是想要一个能够自动识别我的文本宽度为79而不是正常的99的多行注释输入工具。 - cdleary
2个回答

17

显然,代码和注释都使用相同的textwidth选项。就我所知,唯一的技巧是动态设置此选项:

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

在这里,关键部分是检测我们是否在注释中。如果您只以这种方式格式化注释:

/*
 * my comment
 */
我的正则表达式应该能够工作……除非您的代码中有以星号(*)开头的行(我猜这可能会在 C 中发生,而在C++中不太频繁)。如果您使用像这样的注释:
// comment line 1
// comment line 2

如果你想要覆盖所有可能的情况,包括边缘情况,那么编写正则表达式会变得更加简单。嗯......我猜最好的方法是定义一个单独的检测函数,并从:autocmd中调用它,而不是使用match()函数。


+1,我本来也想发一个类似的提议,但它会和这个完全一样。 - mike3996
这对性能有什么影响?如果我正在SSH连接到服务器,这会明显增加我的延迟吗? - Keith Pinson
不会的 @Kazark,所有逻辑都在 Vim 内部执行(即服务器端)。话虽如此,如果您使用本地方式(即非通过 SSH)使用它,它将以相同的方式影响性能。 - Juan Campa

1

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

我希望我的注释可以自动换行,这样在输入时就不必担心格式化文本。这对于注释文本非常有效。但是我不想让vim格式化我的代码。所以我希望vim在x列后将所有内容都突出显示为红色。

要做到这一点,只需将以下内容添加到您的~/.vim/ftdetect/cpp.vim文件中即可。

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

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

如果您遇到问题,请确保您的formatoptions设置为:

formatoptions=croql

你可以在 vim 中运行 :set formatoptions 命令来查看。


抱歉,但不行--这是我对这个问题提出的解决方案的相同答案:https://dev59.com/53VC5IYBdhLWcg3woCjN 到处突出显示垃圾要素比我所期望的精细得多! - cdleary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接