Jak uniknąć wcięcia zawartości przestrzeni nazw w Vimie?

Jak ustawić zawartość przestrzeni nazw w Vimie, aby nie wciskała w C++?

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

Co zaskakujące, 'cinoptions' nie zapewnia sposobu na edycję wcięcia zawartości przestrzeni nazw.

Author: freitass, 2010-03-31

5 answers

Nie wiem, kiedy został wprowadzony, ale moja zainstalowana wersja Vima, v7.3.353 ma opcję cino, która jawnie obsługuje przestrzeń nazw cpp. Obecnie używam przykładowej wartości:

cino=N-s

I zgodnie z :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();
  }                          }

Link zamieszczony przez OP jest dla v7.3.162

 30
Author: mmlb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 20:24:26

Cpp.vim rozwiąże twój problem, ale jeśli nie chcesz pełnego stylu kodowania Google, po prostu Zerknij na źródło wtyczki i zobacz, jak obsługuje przestrzenie nazw. To jest super proste:

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()

W zasadzie wszystko, co robisz, to dopasowanie ostatniej niepustej linii do /^\s*namespace/, a jeśli pasuje, zwróć 0 (jako pozycję wcięcie dla indentexpr); w przeciwnym razie zwróć wartość wbudowanego mechanizmu cindent Vima.

W zasadzie wykradłem kod z wtyczki, rozebrałem wszystko co nie jest przestrzeń nazw związana z funkcją indent i przemianowana na IndentNamespace(). Zapisz to jako~/.vim / indent / cpp.vim.

 11
Author: wilhelmtell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-31 18:44:39

Używam cpp.vim, który jest inspirowany przez Google C++ Style Guide. Między innymi, Ten scenariusz robi to, o co prosisz.

 1
Author: E.M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-30 22:23:30

Jak wielu wspomniało styl Google C++ jest całkiem dobry. Polecam zainstalować clang-format który uważam za lepszy niż zalecane wtyczki, a następnie zainstalować wtyczkę vim na górze.

Install 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 plugin:

Rhysd / vim-clang-format

Zainstaluj za pomocą swojego ulubionego menedżera wtyczek. Sprawdź link wtyczki, aby uzyskać więcej opcji. Domyślnym stylem jest google, ale jest też llvm i i inni

Jedną z opcji, której możesz potrzebować, jeśli używasz niestandardowej wersji polecenia, jest

Przykład:

let g:clang_format#command ="clang-format-3.6"
 1
Author: Paschalis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-06 10:54:28

Skonfigurowałem Vima tak, aby nie wcinał przestrzeni nazw. Są to odpowiednie linie w moim vimrc:

autocmd Filetype cpp set shiftwidth=2
set cino=>2(0^-2g0h2

Szczerze mówiąc, nie pamiętam, jak interpetować cino oświadczenie, ale :help cinoptions powinno pomóc w jego rozszyfrowaniu. Jedno zastrzeżenie: myślę, że jest skonfigurowany tak, aby nie wciąć podczas korzystania z takiego formatu:

namespace foo 
{ // <- curly bracket on next line
...

Kontra

namespace foo { // <- same line

Ponieważ umieściłem nawias klamrowy w następnej linii wyłącznie dla przestrzeni nazw, robi to, co chcę, ale może nie działać, jeśli użyjesz tego stylu dla innych deklaracje funkcji, dla, itp.

 0
Author: dimatura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-31 00:52:28