ubiquitous tutorial the pagina online oficial comandos c++ vim indentation auto-indent

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:

rhysd/vim-clang-format

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.