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

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

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

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


person freitass    schedule 30.03.2010    source источник


Ответы (5)


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

Ссылка, опубликованная ОП, предназначена для версии 7.3.162.

person mmlb    schedule 14.11.2011
comment
Я использовал v7.2 vim, и у него действительно не было этой опции (в то время я дважды проверял это, а сейчас я только что «тройно проверил»). Я получаю v7.3 сейчас. Спасибо! - person freitass; 25.11.2012
comment
Это эквивалентно cino=N0? - person nn0p; 12.08.2019

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.

person wilhelmtell    schedule 30.03.2010
comment
Поскольку я помещаю открывающую фигурную скобку в строку ниже объявления пространства имен, этот код не работает. Он находит { в предыдущей непустой строке. Тем не менее, это отличное решение. - person freitass; 31.03.2010
comment
Ах, ты прав. Я думаю, что я слишком много обрезал форму плагина. :s Попробуйте еще раз. Исправление игнорирует любые комментарии или фигурные скобки после строки пространства имен. - person wilhelmtell; 31.03.2010
comment
Извините, что так долго не отвечал. Только что попробовал ваше новое решение, но оно все равно не сработало. Предложенный вами полноценный скрипт стиля кодирования Google также не работал. Я пока не знаю, почему. - person freitass; 29.04.2010

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

Установить clang-формат

Убунту:

sudo apt-get install clang-format
// or for older versions:
sudo apt-get install clang-format-3.6

Мак:

brew install clang-format

Вим-плагин:

формат rhysd/vim-clang

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

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

пример:

let g:clang_format#command ="clang-format-3.6"
person Paschalis    schedule 06.05.2016

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

person E.M.    schedule 30.03.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

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

person dimatura    schedule 31.03.2010
comment
Как я уже сказал, «cinoptions» (длинное слово «cino») по своей сути не годится. Из вставленных строк '^-2' в сочетании с 'shiftwidth=2' удаляет отступ содержимого пространства имен, но также удаляет отступ каждого блока с помощью открывающей фигурной скобки в столбце 0. - person freitass; 31.03.2010
comment
Да, это так. Решение cpp.vim выглядит лучше, и я только что включил его в свою конфигурацию vim :) - person dimatura; 31.03.2010