Comment éviter indentation du contenu de l'espace de noms dans vim?
-
23-09-2019 - |
Question
Comment définir vim ne se contente pas d'espace de noms tiret en C ++?
namespace < identifier >
{
< statement_list > // Unwanted indentation
}
Étonnamment, 'cinoptions ne fournit pas un moyen de modifier indentation contenu d'espace de noms.
La solution
Je ne sais pas quand il a été introduit, mais ma version installée de vim, v7.3.353 a une option Cino qui gère l'espace de noms de cpp explicitement. Je suis actuellement en utilisant la valeur par exemple:
cino=N-s
et comme par :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();
} }
Le lien OP est affiché pour v7.3.162
Autres conseils
cpp.vim va résoudre votre problème, mais si vous ne « t veulent que le style de codage Google complet alors il suffit de prendre un coup d'oeil à la source de plug-in et voir comment il gère les espaces de noms. Il est 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()
Essentiellement tout ce que vous faites est correspondre à la dernière ligne non vide contre /^\s*namespace/
, et si elle correspond à 0 retour (comme position tiret pour indentexpr
); sinon retour builtin cindent valeur du mécanisme de Vim.
Je essentiellement volé le code du plug-in, quoi que ce soit dépouillé qui est l'espace de noms liés et renommé pas la fonction de retrait à IndentNamespace()
. Enregistrer ce que ~ / .vim / indent / cpp.vim.
J'utilise cpp.vim qui est inspiré par Google C ++ Guide de style. Entre autres choses, ce script fait ce que vous demandez.
Comme beaucoup l'ont mentionné le style Google C ++ est assez bonne.
Je d recommande d'installer clang-format
que je trouve mieux que les plugins recommandés, puis installer un plugin vim sur le dessus.
Installer 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
plug-in Vim:
Installation à l'aide de votre gestionnaire de plug-in favori.
Passer la commande lien du plugin pour plus d'options. Le style par défaut est google
, mais il est llvm
aussi et d'autres.
Une option que vous pourriez avoir besoin si vous utilisez une version personnalisée de la commande est pour
exemple:
let g:clang_format#command ="clang-format-3.6"
J'ai configuré vim à ne pas tiret pour l'espace de noms. Ce sont les lignes pertinentes dans mon vimrc:
autocmd Filetype cpp set shiftwidth=2
set cino=>2(0^-2g0h2
Franchement, je ne me souviens pas comment Interpet la déclaration de cino
, mais :help cinoptions
devrait aider à déchiffrer. Une mise en garde: Je pense qu'il est configuré pour ne pas tiret lors de l'utilisation d'un format comme ceci:
namespace foo
{ // <- curly bracket on next line
...
contre
namespace foo { // <- same line
Depuis que je mets la accolade sur la ligne suivante exclusivement pour les espaces de noms, il fait ce que je veux, mais il pourrait ne pas fonctionner si vous utilisez ce style pour d'autres déclarations de fonctions, pour, etc.