VIM,自动格式化,代码指南,C ++

时间:2017-06-29 18:49:34

标签: c++ vim

我希望能够使用vim自动格式化以下规则的代码:

规则1):如果表达式必须用3个空格来表示。例如:

if(a &&
   b) 

(注意:b如果有相对于父级的三个空格缩进,请注意当前的vim行为为4)

规则2):由空格分隔的参数。例如:

 function_call(a, b, c);

规则3):赋值运算符之间没有空格。例如:

int a=x;

规则4):引用/解除引用运算符附加到变量名称而不是类型。例如:

int& x = b;

如果可能,我希望vim在我输入时自动执行此操作,但是如果这不可能,识别与上述规则相反的格式(通过将其标记为错误)也会有所帮助。

2 个答案:

答案 0 :(得分:2)

您可以在自定义缩进文件中设置自动缩进规则。查看“缩进”目录中的示例,例如/usr/share/vim/vim74/indent或Vim source code distribution

您可以在custom syntax file中设置错误突出显示规则。在“syntax”目录中找到示例,例如/usr/share/vim/vim74/syntax,或者再次在Vim source code distribution中找到。以下是JSON文件的示例:

" Syntax: Decimals smaller than one should begin with 0 (so .1 should be 0.1).
syn match   jsonNumError  "\:\@<=[[:blank:]\r\n]*\zs\.\d\+"

如果您想在实际使用时自动重新格式化代码,则可能需要使用vim-autoformat等特殊插件和/或ClangFormat等外部工具。

答案 1 :(得分:0)

关于缩进等,请检查选项:h 'sw':h 'cindent':h 'cinoptions' ...

关于插入空格和换行符的位置,

  • 对于已经输入的代码,clang-format确实是重新格式化代码的最佳方式。 vim有一个插件。

  • 对于片段,括号等,我最近开发了一个插件,旨在格式化其他插件插入的文本。非常灵感,我将核心插件lh-style命名为。它由mu-template(我的代码段/模板插件)和lh-brackets使用。

  • 对于其他你想要重新格式化的东西,它会更复杂一点。可能是lh风格可以帮助,我不知道,我还没有给出太多关于这个主题的信息。

    例如,外部注释和字符串,=应扩展为:

    1. 本身在[(lamdbas)之后,
    2. <BS>=<space>=之后,><!后跟空格
    3. <space>=<space>否则
    4. 编辑:我弄错了,它与你正在寻找的完全相反。

      它类似于:

      " ftplugin/c/mymappings.vim
      function! s:InsertExpr(char) abort
        let col  = col('.')
        let line = getline('.')
      
        let syn = synIDattr(synID(line('.'),col-1,1),'name')
        if syn =~? 'comment\|string\|character\|doxygen'
          return a:key
        endif
      
        let lcut = getline('.')[: col-2]
        let before =
              \   lcut =~ '[=<>!] $'       ? "\<bs>"
              \ : lcut =~ "[=<>![ \t\n]$"  ? ''
              \ :                            ' '
        let after = line[col-1] =~ "[ \t\n\\]]" ? '' : ' '
        return before.a:char.after
      endfunction
      
      inoremap <buffer> <expr> = <sid>InsertExpr('=')
      inoremap <buffer> <expr> < <sid>InsertExpr('<')
      inoremap <buffer> <expr> > <sid>InsertExpr('>')