【问题标题】:Preserve indentation in C++ comments in vim在 vim 的 C++ 注释中保留缩进
【发布时间】:2017-10-18 07:11:05
【问题描述】:

是否可以将 vim 和 cindent 配置为在重新缩进文件时不改变 c++ cmets 中的缩进 (gg=G) ?

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

例如:

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

变成:

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

我想要一种方式告诉 vim:“不要触摸 cmets 内容,而是缩进其他所有内容。”

这很重要,因为我们的项目使用 doxygen 和类似解析器的降价来生成文档,并且列表级别使用缩进。

【问题讨论】:

  • 你可能想看看:help C-indenting:help C-indenting,最后是:help indentexpr

标签: c++ vim indentation


【解决方案1】:

这样写怎么样,注释缩进独立于注释缩进:

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

【讨论】:

  • 该语法的问题在于它违反了我们的项目编码约定。此外,如何使它与不使用这种语法的现有代码一起工作?
  • @fievel 左侧的那些“墙”用于大多数文档注释样式中,专门用于分隔注释内缩进。奇怪的是,您的项目编码约定放弃了如此普遍的良好实践。 1) 更新项目编码约定 2) 更新现有代码以遵循更新后的项目编码约定
  • 我绝对同意,但我不能,这是一个大项目,我只是一个简单的开发人员。
  • 其实我验证过,它可以使用,但是我们不能通过添加这样的“墙”来改变现有的cmets。所以我会为新文件做这件事,并小心缩进现有文件(或找到一种方法来排除它,所以我不标记这个答案接受者)。
【解决方案2】:

根据评论的建议,我在此处重新发布来自vi stackexchange community 的答案:

我不相信使用'cinoptions' 可以实现这一点。

正确的解决方案可能是编写一个新的indentexpr,它将 C 缩进(可通过cindent() 函数访问)仅应用于不在 cmets 中的行。

但是,这里有几个快速而肮脏的解决方案:

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

使用函数

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

您可以使用:call IndentIgnoringComments() 运行它,或者您可以设置命令或映射。例如:

nnoremap <leader>= :call IndentIgnoringComments()<CR>

我个人定义了一个command,它调用这个函数并将它与我经常在这个项目中的文件上应用的另一个重新格式化结合起来(:%s/\s*$//g)。

感谢Richhttps://vi.stackexchange.com

原帖:https://vi.stackexchange.com/a/13962/13084

【讨论】:

    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 2021-01-09
    • 2011-03-18
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多