Подтвердить что ты не робот

Как избежать отступов содержимого пространства имен в vim?

Как установить vim для неинтенсивного пространства имен в С++?

namespace < identifier >
{
    < statement_list > // Unwanted indentation
}

Удивительно, что 'cinoptions' не предоставляет способ редактирования отступов содержимого пространства имен.

4b9b3361

Ответ 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"