How to avoid namespace content indentation in vim?

前端 未结 5 506
慢半拍i
慢半拍i 2020-12-24 11:57

How to set vim to not indent namespace content in C++?

namespace < identifier >
{
    < statement_list > // Unwanted indentation
}
相关标签:
5条回答
  • 2020-12-24 12:41

    cpp.vim will solve your problem, but if you don't want the full-blown Google coding style then just take a peek at the plugin source and see how it handles namespaces. It's super simple:

    function! IndentNamespace()
      let l:cline_num = line('.')
      let l:pline_num = prevnonblank(l:cline_num - 1)
      let l:pline = getline(l:pline_num)
      let l:retv = cindent('.')
      while l:pline =~# '\(^\s*{\s*\|^\s*//\|^\s*/\*\|\*/\s*$\)'
        let l:pline_num = prevnonblank(l:pline_num - 1)
        let l:pline = getline(l:pline_num)
      endwhile
      if l:pline =~# '^\s*namespace.*'
        let l:retv = 0
      endif
      return l:retv
    endfunction
    
    setlocal indentexpr=IndentNamespace()
    

    In essence all you do is match the last non-blank line against /^\s*namespace/, and if it matches return 0 (as the indent position for indentexpr); otherwise return Vim's builtin cindent mechanism's value.

    I essentially stole the code from the plugin, stripped anything that isn't namespace-related and renamed the indent function to IndentNamespace(). Save this as ~/.vim/indent/cpp.vim.

    0 讨论(0)
  • 2020-12-24 12:44

    As many have mentioned Google C++ style is quite good. I 'd recommend to install clang-format which I find it better than the recommended plugins, and then install a vim plugin on top.

    Install clang-format

    Ubuntu:

    sudo apt-get install clang-format
    // or for older versions:
    sudo apt-get install clang-format-3.6
    

    Mac:

    brew install clang-format
    

    Vim plugin:

    rhysd/vim-clang-format

    Install using your favorite plugin manager. Checkout the plugin's link for more options. The default style is google, but there is also llvm and others.

    One option you might need if you are using a custom version of the command is for

    example:

    let g:clang_format#command ="clang-format-3.6"
    
    0 讨论(0)
  • 2020-12-24 12:47

    I use cpp.vim which is inspired by the Google C++ Style Guide. Among other things, that script does what you're asking.

    0 讨论(0)
  • 2020-12-24 12:51

    I've configured vim to not indent for the namespace. These are the relevant lines in my vimrc:

    autocmd Filetype cpp set shiftwidth=2
    set cino=>2(0^-2g0h2
    

    Frankly, I don't remember how to interpet the cino statement, but :help cinoptions should help in deciphering it. One caveat: I think it's configured to not indent when using a format like so:

    namespace foo 
    { // <- curly bracket on next line
    ...
    

    versus

    namespace foo { // <- same line
    

    Since I put the curly bracket on the next line exclusively for namespaces, it does what I want, but it might not work if you use that style for other function declarations, for, etc.

    0 讨论(0)
  • 2020-12-24 12:53

    Not sure when it was introduced but my installed version of vim, v7.3.353 has a cino option that handles cpp namespace explicitly. I am currently using the example value:

    cino=N-s

    and as per :help cinoptions-values

    NN    Indent inside C++ namespace N characters extra compared to a
      normal block.  (default 0).
    
    cino=                      cino=N-s 
      namespace {                namespace {
          void function();       void function();
      }                          }
    
      namespace my               namespace my
      {                          {
          void function();       void function();
      }                          }
    

    The link the OP posted is for v7.3.162

    0 讨论(0)
提交回复
热议问题