2010-03-24 38 views
31

我對VIM比較陌生。我有一些源代碼,這是一團糟。乍一看,我希望至少得到一個清晰和有組織的代碼視圖,所以我喜歡將它正確地格式化,我的意思是縮進取決於函數的深度等等。是否可以使用VIM格式化C++代碼?

我不知道VIM是否可以完成,否則您可以推薦哪些其他命令行工具。

感謝

回答

58

而VIM是一個真正的瑞士小刀我還是比較喜歡的外部工具進行一些工作。與使用內置的等價物相比,這種方法有時更直觀,更易於記憶。

在縮進的情況下,我通過astyle過濾整個文件緩衝區。在幾分鐘內,astyle參數更容易掌握,特別是如果您不是vim大師。此外,astyle提供更多的靈活性來微調輸出。

首先安裝的astyle:
# apt-get install astyle

內部VIM

然後:
:%!astyle(簡單的情況 - 的astyle缺省模式是C/C++)

:%!astyle --mode=c --style=ansi -s2(ANSI C++風格,使用每個縮進層次的兩個空間)

:1,40!astyle --mode=c --style=ansi(ANSI C++風格,濾波器只線1-40)

+4

哇,這真的太棒了,非常感謝 – flow 2010-03-24 10:56:31

+0

是否有可能將此映射到像ctrl + shift + F這樣的組合鍵? – 2014-03-27 12:00:55

+4

您也可以通過將'equalprg'設置爲astyle(例如:'set equalprg =〜/ astyle \ --style = google')來覆蓋Vim的縮進運算符('=')來使用Astyle – Parsa 2014-08-03 14:56:11

26

,你可以做到以下幾點:

gg=G 
+1

爲了說明,[運動]縮進了運動所包含的區域。 gg移動到文件的開頭,G移動到文件的末尾。 – Sarah 2010-03-24 10:54:15

+1

或以'V'開始進入視覺線模式,然後用'j'向下移動以選擇所有想要格式化的線,然後點擊'=' – hasen 2010-03-26 07:40:42

+1

我不喜歡'gg = G'。爲什麼?因爲當你用逗號(參數列表,長布爾值)打破長列表時,它會打破手動對齊。 – Benoit 2011-02-10 09:17:32

4

的Vim一定會做到這一點,雖然結果可能不是完美的:

  1. 首先,選擇在視覺整個文件模式:ggVG
  2. 然後點擊=重新開始一切。

您可以瞭解更多的平等命令::help =

1

沿着m000的想法提出的通用解決方案是使用UniversalIndentGUI作爲外部工具。

+0

感謝您的信息,但我更喜歡VIM,因爲我必須在遠程機器上調試代碼 – flow 2010-03-24 21:12:00

4

有一個vim插件,可以在vim中對你的代碼進行格式化。這就是所謂的VIM,自動套用格式,你可以在這裏下載:

https://github.com/Chiel92/vim-autoformat

它外部代碼格式化程序集成到VIM。例如,如果要格式化C,C++,C#或Java代碼,則需要安裝程序astyle,vim會自動將其設置爲格式化程序。

2

我不寫C++代碼,但我寫了一些Java代碼。

相反,Vim支持一些常用語言的格式。 我已經爲我設置了一個捷徑來格式化緩衝區中的整個代碼。 它會回到我剛纔編輯的行:)

" format the file 
map <leader>fm gg=G'. 
0

就必須解決這一確切的問題,所以我想我會有助於挽救他人一段時間。

您可以使用gg=G縮進您的代碼。但是當你想調整自動縮進的方式時,事情就變得很難理解了。因此,如果你只關心錯誤的空白被刪除,並且不關心格式化風格,gg=G是最快捷的方法,因爲它的內置。

如果您確實想要控制樣式(例如,您試圖使代碼符合a style guide),那麼您將需要一個外部工具來處理您的文件。您可以從vim中調用該工具::%!<toolname> <options>。這通過工具管理文件並重新加載處理後的結果。 (你可以明顯地用它來做任何你想對你的文件做的事情)

所以下一個問題是,你應該選擇什麼外部工具?無論如何,該方法是相同的:

  1. 安裝的首選工具
  2. 確保它在你的路徑
  3. 添加一行創建一個快捷鍵使用,因此節省您的時間
  4. vimrc文件
  5. 使用它。

現在,您使用的工具取決於您嘗試複製的樣式。如果你想複製廣泛使用的風格,那麼很有可能你需要astyle

如果你想複製自定義樣式,那麼您將需要兩件事情:

  1. UniversalIndentGui - 前端,讓你與各種選項和現場預覽其效果源玩耍文件
  2. 一組安裝源代碼格式化工具,並在您的路徑

之間uncrustifygreatcode,你應該能夠完全複製你想要的風格。

其實我撒謊了。還有另外一種方法,它叫clang-format。然而,你會想要閱讀它的文檔,它仍然處於早期階段,所以一些選項不能很好地工作。這是一個漂亮的工具(絕對是最聰明的,因爲它構造了代碼的AST),它甚至可以用於Windows。

如果您要花時間閱讀本手冊,您還需要查看GNU Indent

當然,還有最後一種方法,它實際上是花時間學習vim的縮進規則併爲您的風格編寫一個規則。這將需要時間,但它將與gg=G一起使用。

的astyle上的一些注意事項VS uncrustify VS greatcode:

  1. 的astyle好於一般的格式,但不能做的事情一樣排列的變量和重新風格的註釋的聲明非常好。
  2. Uncrustify可以做很多astyle不能做的事情,但要準備花一個小時玩耍,直到找到所需選項的正確組合。 (或者如果你覺得浪費了很多時間,使用遺傳算法找出你的風格的選擇的最佳組合,當你分享代碼並給我一個鏈接,所以我也可以使用它:))

請注意,您不必選擇一個工具。使用vim,你可以映射一個按鍵來連續執行幾個命令,因此理論上你可以結合使用這些工具來獲得你正在尋找的東西。

最後但並非最不重要的,這裏是從我的.vimrc文件中,在那裏我有映射F12調用的astyle有一些選項的摘錄:

"A2 = attached brackets 
"-s8 indent 8 spaces 
"-xc attached braces to class declarations 
"-xj remove braces for single statement ifs and elses 
"-c convert tabs to spaces in the non-indentation part of the line 
map <F12> :%!astyle -A2 -s8 -xc -xj -c<CR> 

不要評判我的風格。只需使用該工具重現你想要的。

13

現在我強烈推薦clang格式。它允許鐺格式的簡單集成到Vim中,一旦安裝了鏗鏘格式:

http://clang.llvm.org/docs/ClangFormat.html#vim-integration

這是唯一的代碼美化真正瞭解你的C++代碼,它是真正的智能美化代碼更像是一個人而不是一臺機器。例如:

void TestFunction(int argument1, int argument2, 
        int argument3); 
void TestFunctionVeryLongName(int argument1, 
           int argument2, 
           int argument3); 
void TestFunctionWithRidiculouslyLongName(
    int argument1, int argument2, int argument3); 
+1

在clang格式手冊中建議的鍵綁定的另一種方法是在vim中使用'equalprg'綁定。這允許你用'G = gg'或其他'='縮進選項調用'clang-format'。 只需在你的'.vimrc'文件中加入以下內容: 'autocmd FileType c,cpp setlocal equalprg = clang-format' – Daniel 2016-10-27 02:24:46