How to avoid namespace content indentation in vim?

前端 未结 5 649
慢半拍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条回答
  •  萌比男神i
    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.

提交回复
热议问题