2011-11-09 5 views
13

vimをC++ 11ラムダ関数で使用するのは実際には貧弱です。インデントは機能しません。大量の括弧は誤ったものとしてマークされています。vimとC++ 11ラムダ:自動インデント

私が知っているように、cとC++のインデントとシンタックスハイライトは、c [...] .vimファイルではなく、内部的にプログラムされています。 C++ 11のためにvimを設定する機会はありますか?特にラムダ関数を使ったソースコードはありますか?たぶん誰かが、内部のvim構文チェックでラムダ解析を追加する方法と場所をヒントとして与えることができますか?

EDIT:(コメントからの要求に応じて、例えばコード)

コードは、次の例のようになりますが、単一の列にフォーマットされます。

MyLoop([](int a, int b){ 
     {  
      ::i++; 
      for (;;) 
      { 
       SomeFunc(); 
      } 
      cout << "Result: " << a*b<<endl; 
     }  
    });  

のvim 7.4の更新: は今vimの長いエラーとしてラムダ式を処理しませんでしたが、それはまだラムダ式内の任意のインデントをしなかったので、それはもう、まだC++には使用できません: - (

はところで:誰キーを押すと、外部書式設定を行うように、vimの環境に追加することができます良い自動書式設定ツールがあり

+1

http://stackoverflow.com/questions/2977174/is-there-a-c0x-syntax-file-for-vim – u0b34a0f6ae

+0

インデントの方法とインデントする方法の例を追加できますか? – Alex

答えて

11

"Indent Java匿名クラス"に対して、Vim 7.4ではjNのcinoptionが追加されました。 (:help java-cinoptions)これにより、C++ 11のラムダのインデント動作が改善されます。

setlocal cindent cino=j1,(0,ws,Ws 

そして、私は(それ以外の場合はクレイジーだ)同じラインにループのオープニングブレースのためにあなたを移動した場合:(あなたの〜/て.vim /後/ ftplugin/cpp.vimに入れて)これらのオプションでは

vimはあなたのコードを次のように字下げします:

MyLoop([](int a, int b){ 
    {  
     ::i++; 
     for (;;) { 
      SomeFunc(); 
     } 
     cout << "Result: " << a*b<<endl; 
    }  
}); 

これは欲しいぶら下げインデントも与えません。あなたが最初の開口部をそれ自身の線で支えて動かすならば、望むぶら下げインデントが得られます。

すべてのオプションについては、:help cinoptions-valuesを参照してください。


あなたがそう=ipは、現在の段落をインデントしますClangFormatを使用するように賢くインデントプログラム、this user recommendsset equalprg=clang-formatにしたい場合。これは、入力時にvimを正しくインデントすることはありません(indentexprをセットアップする必要がありますが、それはかなり複雑です)。

equalplgを設定するのと同じように見えるが、より多くのコードを持つa vim pluginもある。それがもっと良いか分からない。それはclang-format.py(Cyprian Guerraの答えから)の代わりになるはずです。

+0

Nice〜/ .vim/after/ftplugin/cpp.vimファイルを作成したくない場合は、次の行に.vimrcを追加することもできます。 'autocmd BufEnter * .cpp:setlocal cindent cino = j1、 (0、ws、Ws' – jmmk

1

使用

:let c_no_curly_error = 1 

これをあなたのvimrcに入れることができます。

あなたの前提としては間違っています。 c.vim構文ファイル(vimランタイム)があります。参照番号は:help c.vimで、実装はvimのランタイムパス(:echo &rtp)で参照できます。

+0

この解決策は、私が好むものではない誤って配置されたカッコからマークを削除します。インデントはまだ間違っています。 – Klaus

+1

Cの構文ファイルがありますが、インデントは内部的に行われ、これはOPのポストで重要な問題と思われました。 –

1

Michael Smallがthisプロジェクトです。私はまだそれを試していないが、おそらくそれはあなたが探しているものです。

+1

これらの新しい構文ファイルをインストールしても、私は誤った中括弧がなくなりましたが、lambdasのインデントは間違っています。 – Klaus

0

セット

が次にあなたがvimの中で上記のコードを入力smartindentオートインデントは、あなたは右のインデントを取得します。あなたは上記のコードGG = Gまたは含まれているコマンド「=」を再インデントを使用している場合

しかしは、インデントはまだ間違っています。

+0

gg = Gはこの機能の重要な部分です:-)また、赤いマークのついた括弧もあまり美しくありません。上記のように、間違った括弧の警告をすべて抑制することができますが、これも役に立ちません。私は本当に誰もvimの正しい字下げファイルを実装していないのだろうと思っています。私は実際には本当に愚かな外部フォーマッタだけを実行する! vimが古くなっているのですか、またはC++ 11が頻繁に使用されていませんか?問題の修正なしで2年が経過しました... BTW:初期化リストもvimで壊れています:-( – Klaus

0

あなたが探しているように見えることはLLVMの連中からclang-format.pyまたはLinda_pp別名rhysd(後者の感謝idbriiを)からvim-clang-formatである - の両方がゆえの両方clangを使用するC++ 11の新しい構造のすべてをサポートし、あなたがそれを実行することができます次のように:

:pyf ~/src/llvm.git/tools/clang/tools/clang-format/clang-format.py 

または :ClangFormatを(他の機能の中で)、それはルール「すべての環境で同じ動作のための1つの設定ファイル」に従うことを可能にするよう

後者は、より良いと思われる場合は特に、あなたをVIMアドオンマネージャ(VAMなど)を使用します。

+1

[vim-clang-format](https://github.com/rhysd/vim-clang-format )は、[clang-format.py](http://clang.llvm.org/docs/ClangFormat.html#vim-integration)の優れた代替手段であると主張しています。どちらもどちらもequalprgより優れています。 – idbrii

+0

clang-format changesインデントに無関係な大量の書式設定ですが、これは必ずしも望ましいものではありません。 – pavon

0

私はちょうど数日間この問題に苦しんでいましたが、Cindentを使ってsmartindentを切り替えるように見えて、C++ 11でlambdaインデントを手伝ってくれました。

〜/。vimrc

set cindent 
set smartindent 

これはうまくいきます。

+0

ラムダ式内のすべてのインデントが壊れていますすべての中括弧が1つの列に移動しています。 ? – Klaus

関連する問題