2011-11-09 96 views
13

使用vim與C++ 11 lambda函數實際上很差。縮進不起作用,很多括號被標記爲錯誤。vim和C++ 11 lambda:自動縮進

據我所知,c和C++的縮進和語法突出顯示內部編程,而不是通過c [v] vim文件編程。有沒有機會爲C++ 11設置vim,尤其是使用lambda函數的源代碼?也許有人可以給出一個提示如何以及在哪裏添加lambda解析在內部vim語法檢查?

編輯:(例如代碼從註釋請求)

代碼應如下所示的例子,但被格式化爲單個列。

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

更新VIM 7.4: 現在Vim並沒有再處理Lambda表達式作爲一個錯誤,但它仍然沒有做任何壓痕在lambda表達式,所以它仍然沒有對C可用++了: - (

BTW:有沒有人一個良好的自動格式化工具,它可以被添加到VIM環境,使按一個鍵外做格式化

+1

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

+0

你可以添加一個它如何縮進以及如何縮進的例子嗎? – Alex

回答

11

Vim 7.4現在有一個jN cinoption用於「正確縮進Java匿名類」。 (:help java-cinoptions)這改進了C++ 11的lambda表達式的縮進行爲。

通過這些選項(放到你的〜/ vim的/後/文件類型插件/ cpp.vim裏):

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

如果我移動你的for循環的左括號的同一行(否則它的瘋狂)那麼vim就像這樣縮進你的代碼:

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

它不會給你想要的懸掛縮進。如果您將最初的開放式支架移動到其自己的線上,那麼您可以獲得所需的垂直縮進。

有關所有選項,請參閱:help cinoptions-values


如果你想聰明縮進程序,this user recommendsset equalprg=clang-format使用ClangFormat所以=ip會縮進當前段落。這不會使vim在輸入時正確縮進(您需要爲此設置indentexpr,這非常複雜)。

還有a vim plugin似乎與設置equalprg相同,但代碼更多。不知道它是否更好。它應該是clang-format.py的替代品(來自Cyprian Guerra的回答)。

+0

不錯如果你不想創建〜/ .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

安裝了這些新的語法文件後,我再也找不到錯誤的大括號了,但是lambda表達式的縮進依然是錯誤的。 – Klaus

0

集smartindent自動縮進

然後你在vim上面的代碼類型,您將得到正確的縮進。

但是,如果使用gg = G或包含「=」的命令重新縮進上面的代碼,則縮進仍然是錯誤的。

+0

gg = G是該功能的重要組成部分:-)而且紅色標記的大括號不是很漂亮。好的,正如上面提到的,我可以將所有警告壓制成錯誤的大括號,但這也沒有幫助。我真的很奇怪爲什麼沒有人爲vim實現正確的縮進文件。我實際上只運行了非常愚蠢的外部格式化程序! vim是過時的還是C++ 11不經常使用?現在有2年沒有解決這個問題...順便說一句:初始化列表也被打破了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

後者似乎更好,因爲它(除其他功能)允許遵循規則「對每一個環境相同的行爲一個配置文件」,尤其是當你使用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更改與縮進不相關的大量格式化,這並不總是可取的 – pavon

0

我剛剛爲此奮鬥了幾天,看起來像在cindent啓用smartindent切換幫助我與它在lambda indentation C++ 11。

在你的〜/。vimrc

set cindent 
set smartindent 

希望這有助於窺視。

+0

我看不到任何改變,lambda表達式中的所有縮進仍然被打破,所有的大括號都被移動到了一個單獨的列中。 ? – Klaus