Как избежать отступов содержимого пространства имен в vim?
Как установить vim для неинтенсивного пространства имен в С++?
namespace < identifier >
{
< statement_list > // Unwanted indentation
}
Удивительно, что 'cinoptions' не предоставляет способ редактирования отступов содержимого пространства имен.
Ответы
Ответ 1
Не уверен, когда он был введен, но моя установленная версия vim, v7.3.353 имеет параметр cino, который явно обрабатывает пространство имен cpp. В настоящее время я использую значение примера:
cino=N-s
и согласно :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();
} }
Ссылка, опубликованная OP для v7.3.162
Ответ 2
cpp.vim решит вашу проблему, но если вы не хотите полномасштабного стиля кодирования Google, просто загляните в источник плагина и посмотреть, как он обрабатывает пространства имен. Это супер просто:
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()
В сущности, все, что вы делаете, соответствует последней непустой строке против /^\s*namespace/
, и если оно соответствует возврату 0 (как позиция отступа для indentexpr
); в противном случае возвращаем значение Vim для встроенного механизма.
Я по существу украл код из плагина, разделил все, что не связано с пространством имен, и переименовал функцию отступа в IndentNamespace()
. Сохраните это как ~/.vim/indent/cpp.vim.
Ответ 3
Я использую cpp.vim, который вдохновлен Руководством по стилю Google С++. Помимо всего прочего, script делает то, что вы просите.
Ответ 4
Я настроил vim, чтобы не было отступа для пространства имен. Это соответствующие строки в моем vimrc:
autocmd Filetype cpp set shiftwidth=2
set cino=>2(0^-2g0h2
Честно говоря, я не помню, как интерпретировать оператор cino
, но :help cinoptions
должен помочь в его расшифровке. Одно предостережение: я думаю, что он настроен не на отступ при использовании такого формата:
namespace foo
{ // <- curly bracket on next line
...
против
namespace foo { // <- same line
Поскольку я помещаю фигурку в следующую строку исключительно для пространств имен, она делает то, что я хочу, но она может не работать, если вы используете этот стиль для других объявлений функций, и т.д.
Ответ 5
Как уже упоминалось, стиль Google С++ довольно хорош.
Я рекомендую установить clang-format
, который я нахожу его лучше рекомендованных плагинов, а затем устанавливаю плагин vim сверху.
Установить 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:
rhysd/vim-clang-format
Установите с помощью вашего любимого менеджера плагинов.
Оформить ссылку плагина для получения дополнительных параметров. Стиль по умолчанию google
, но есть также llvm
и другие.
Один вариант, который вам может понадобиться, если вы используете пользовательскую версию команды для
Пример:
let g:clang_format#command ="clang-format-3.6"