在vim中保留C++注释的缩进

4

是否有可能配置vim和cindent,在重新缩进文件(gg=G)时不更改C++注释中的缩进?

我在注释中有一些格式化列表,用4个空格对齐,但vim将其解释为错误的缩进并重新排列所有内容。

例如:

/**
    my list:
         * item 1
         * item 2
 */

成为:

/**
    my list:
    * item 1
    * item 2
*/

我希望找到一种方法告诉vim:“不要动注释内容,但缩进其他所有内容。”
这很重要,因为我们的项目使用类似markdown的解析器doxygen来生成文档,并且缩进被用于列表级别。

1
你可以查看一下:help C-indenting:help C-indenting以及最后的:help indentexpr - merlin2011
2个回答

3

您觉得这样写如何,以便于在评论缩进与注释缩进相互独立:

/**
*    my list:
*        * item 1
*        * item 2
*/

1
那种语法的问题在于它违反了我们项目的编码规范。此外,如何使其与不使用这种语法的现有代码兼容? - fievel
@fievel 左侧的那些“墙壁”在大多数文档注释样式中都用于分隔注释缩进。你的项目编码规范放弃了这样一个常见的好习惯,这很奇怪。1)更新项目编码规范 2)更新现有代码以遵循更新后的项目编码规范。 - user7860670
我完全同意,但我不能这样做,因为这是一个大项目,而我只是一名普通的开发者。 - fievel
事实上,我验证过了,它可以使用,但我们不能通过添加“墙”来更改现有的注释。因此,我将为新文件执行此操作,并注意现有文件的缩进(或找到一种排除它的方法,以便我不标记此答案为接受者)。 - fievel

1

根据评论的建议,我在这里重新发布一篇答案,并附上vi stackexchange community社区的答案:

我不认为使用'cinoptions'可以实现这个目标。

正确的解决方案可能是编写一个新的indentexpr,仅将C-indenting(通过cindent()函数访问)应用于不在注释内的行。

然而,以下是一些快速而肮脏的解决方案:

我跳过了第一个解决方案,因为我没有使用它,所以它不是答案。您仍然可以在原始帖子中看到它。

Using a Function

function! IndentIgnoringComments()
 let in_comment = 0
  for i in range(1, line('$'))
    if !in_comment
      " Check if this line starts a comment
      if getline(i) =~# '^\s*/\*\*'
        let in_comment = 1
      else
        " Indent line 'i'
        execute i . "normal =="
      endif
    else
      " Check if this line ends the comment
      if getline(i) =~# '\*\/\s*$'
        let in_comment = 0
      endif
    endif
  endfor
endfunction

You can run this with :call IndentIgnoringComments() or you could set up a command or a mapping. e.g.:

nnoremap <leader>= :call IndentIgnoringComments()<CR>
我个人定义了一个命令command,调用此函数并将其与此项目中经常应用于文件的另一种重新格式化方式(:%s/\s*$//g)结合使用。
感谢Richhttps://vi.stackexchange.com上的帮助。
原始帖子:https://vi.stackexchange.com/a/13962/13084

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