Как избежать отступов содержимого пространства имен в vim? - PullRequest
29 голосов
/ 31 марта 2010

Как настроить vim, чтобы не делать отступ для содержимого пространства имен в C ++?

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

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

Ответы [ 5 ]

32 голосов
/ 14 ноября 2011

Не уверен, когда он был представлен, но моя установленная версия 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();
  }                          }

Ссылка, опубликованная ОП для v7.3.162

11 голосов
/ 31 марта 2010

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); в противном случае возвращает значение встроенного механизма Cindent Vim.

По сути, я украл код из плагина, удалил все, что не связано с пространством имен, и переименовал функцию отступа в IndentNamespace(). Сохраните это как ~ / .vim / indent / cpp.vim.

1 голос
/ 06 мая 2016

Как уже упоминалось, стиль Google C ++ довольно хорош. Я бы порекомендовал установить clang-format, что мне кажется лучше, чем рекомендуемые плагины, а затем установить плагин vim сверху.

Установить 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

Плагин Vim:

rhysd / ВИМ-лязг формате

Установите, используя ваш любимый менеджер плагинов. Проверьте ссылку на плагин для получения дополнительной информации. По умолчанию используется стиль google, но есть также llvm и другие.

Одна опция, которая может вам понадобиться, если вы используете пользовательскую версию команды, предназначена для

пример:

let g:clang_format#command ="clang-format-3.6"
1 голос
/ 31 марта 2010

Я использую cpp.vim , которая основана на Руководстве по стилю Google C ++. Помимо прочего, этот скрипт выполняет то, что вы просите.

0 голосов
/ 31 марта 2010

Я настроил 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

Поскольку я помещаю фигурную скобку на следующей строке исключительно для пространств имен, она делает то, что я хочу, но она может не работать, если вы используете этот стиль для других объявлений функций, для и т. Д.

...