33

C++で名前空間のコンテンツをインデントしないようにvimを設定するには?

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

驚いたことに、'cinoptions'は名前空間の内容のインデントを編集する方法を提供していません。

4

5 に答える 5

36

いつ導入されたかはわかりませんが、インストールしたバージョンのvim、v7.3.353には、cpp名前空間を明示的に処理するcinoオプションがあります。私は現在、例の値を使用しています:

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用です

于 2011-11-14T16:56:51.337 に答える
11

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 の組み込み cindent メカニズムの値を返します。

基本的に、プラグインからコードを盗み、名前空間に関連しないものをすべて取り除き、インデント関数の名前を に変更しましたIndentNamespace()。これを ~/.vim/indent/cpp.vim として保存します。

于 2010-03-30T22:42:16.757 に答える
2

多くの人が言及しているように、Google C++ スタイルは非常に優れています。clang-format推奨プラグインよりも優れていると思われるものをインストールし、その上にvimプラグインをインストールすることをお勧めします。

clang-format をインストールする

Ubuntu:

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

マック:

brew install clang-format

Vim プラグイン:

rhysd/vim-clang-format

お気に入りのプラグイン マネージャーを使用してインストールします。その他のオプションについては、プラグインのリンクを確認してください。デフォルトのスタイルは ですが、他googleにもllvmあります。

コマンドのカスタム バージョンを使用している場合に必要になる可能性のあるオプションの 1 つは、

例:

let g:clang_format#command ="clang-format-3.6"
于 2016-05-06T10:54:28.677 に答える
1

私はGoogleC ++スタイルガイドに触発されたcpp.vimを使用しています。とりわけ、そのスクリプトはあなたが求めていることを実行します。

于 2010-03-30T22:23:30.580 に答える
0

名前空間に対してインデントしないようにvimを構成しました。これらは私のvimrcの関連する行です:

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

cino率直に言って、このステートメントを解釈する方法を覚えていませんが:help cinoptions、解読には役立つはずです。1 つの注意点: 次のような形式を使用する場合、インデントしないように構成されていると思います。

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

namespace foo { // <- same line

名前空間専用に次の行に中括弧を置いたので、それは私が望むことを行いますが、そのスタイルを他の関数宣言、for などに使用すると機能しない可能性があります.

于 2010-03-31T00:52:28.927 に答える