c++ - tutorial - ¿Cómo evitar la sangría del contenido del espacio de nombres en vim?
vim tutorial (5)
¿Cómo configurar vim para no sangrar el contenido del espacio de nombres en C ++?
namespace < identifier >
{
< statement_list > // Unwanted indentation
}
Sorprendentemente, ''cinoptions'' no proporciona una forma de editar la sangría del contenido del espacio de nombres.
Como muchos han mencionado, el estilo de Google C ++ es bastante bueno. Recomendaría instalar clang-format
que me parece mejor que los complementos recomendados, y luego instalo un complemento vim en la parte superior.
Instalar el formato de Clang
Ubuntu:
sudo apt-get install clang-format
// or for older versions:
sudo apt-get install clang-format-3.6
Mac:
brew install clang-format
Plugin Vim:
Instale usando su administrador de complementos favorito. Revisa el enlace del plugin para más opciones. El estilo predeterminado es google
, pero también hay llvm
y otros.
Una opción que podría necesitar si está utilizando una versión personalizada del comando es para
ejemplo:
let g:clang_format#command ="clang-format-3.6"
He configurado vim para no sangrar para el espacio de nombres. Estas son las líneas relevantes en mi vimrc:
autocmd Filetype cpp set shiftwidth=2
set cino=>2(0^-2g0h2
Francamente, no recuerdo cómo interpretar la declaración de cino
, pero :help cinoptions
debería ayudar a descifrarla. Una advertencia: creo que está configurado para no sangrar cuando se usa un formato como el siguiente:
namespace foo
{ // <- curly bracket on next line
...
versus
namespace foo { // <- same line
Ya que coloco el corchete en la siguiente línea exclusivamente para espacios de nombres, hace lo que quiero, pero puede que no funcione si usa ese estilo para otras declaraciones de funciones, para, etc.
No estoy seguro de cuándo se introdujo, pero mi versión instalada de vim, v7.3.353 tiene una opción cino que maneja el espacio de nombres cpp explícitamente. Actualmente estoy usando el valor de ejemplo:
cino=Ns
y según :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();
} }
El enlace que el OP publicado es para v7.3.162
Uso cpp.vim que está inspirado en la Guía de estilo de Google C ++. Entre otras cosas, ese guión hace lo que estás pidiendo.
cpp.vim resolverá su problema, pero si no desea el estilo de codificación de Google completo, simplemente eche un vistazo a la fuente del complemento y vea cómo maneja los espacios de nombres. Es 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()
En esencia, todo lo que hace es hacer coincidir la última línea que no esté en blanco con /^/s*namespace/
, y si coincide devuelve 0 (como la posición de sangría para indentexpr
); de lo contrario, devuelve el valor del mecanismo integrado de Vim.
Básicamente robé el código del complemento, eliminé todo lo que no esté relacionado con el espacio de nombres y IndentNamespace()
el nombre de la función de sangría a IndentNamespace()
. Guarde esto como ~ / .vim / indent / cpp.vim.