2013-05-06 67 views
2

我發現縮進(無論有沒有選擇)並不總是有效,它似乎是因爲這些設置。
從我可以告訴它的代碼是有效和正確縮進時,但它不會發生在任何地方。除了下面的例子,我還沒有找到一個模式。Vim中使用smartindent或filetype縮進的奇數縮進行爲

set filetype plugin indent on 
set smartindent 

採取例如該C++代碼:

#include <iostream> 
#include <sstream> 

int main(void) { 
    std::string move; 
    int x, y; 
    char c; 

    while(true) { 
     std::cout << "Enter move (x,y): "; 
     std::getline(std::cin, move); 

     std::stringstream ss(move); 
     ss >> x; ss >> c; ss >> y; 

     std::cout << "x: " << x << "\n"; 
     std::cout << "y: " << y << "\n" << std::endl; 
    } 
} 

縮進:

  • 任何正確的代碼除了#include,例如:
    • < <>>std::getline(std::cin, move);
    • VIB <std::cout << "Enter move (x,y): ";,由此縮進塊
  • >>>>如果#include是不正當縮進
  • 如果#被移除從包括,使代碼不正確,>>作品

不縮進:

  • >>#include <iostream>
  • VIP>:1,從而選擇包括並試圖縮進他們

如果縮進失敗,文件仍然標記爲已更改,即使沒有通道字符實際上已經改變。

  1. 這是正確的行爲?
  2. 爲什麼Vim會區分正確的代碼?
  3. 我想保留smartindent功能,但即使Vim認爲它是正確的,仍然可以手動縮進代碼。

我的Vim configuration如果需要。

+1

我建議不要使用Vim內置的C++等複雜語言的代碼縮進方法。將外部格式化工具與Vim集成會更好。例如,** [Uncrustify](https://github.com/bengardner/uncrustify)**,看看** [我的其他答案](http://stackoverflow.com/questions/12374200/using- uncrustify-with-vim/15513829#15513829)**瞭解如何做到這一點,如果你有興趣。 – 2013-05-06 14:23:52

+0

@Haroogan謝謝你的建議,但我寧願不必使用一些第三方工具。除了Vim以外,我還沒有遇到任何Vim處理C++的麻煩。出於好奇,你面臨什麼問題? – timss 2013-05-06 14:31:14

+0

從頭頂難以記住。但是當你更多地使用它時,你會不時發現一些惱人的怪癖,修復這些幾乎是不可能的,因爲Vim沒有全功能的C++分析器。縮進只能用正則表達式來完成,這對於簡單的語言(比如Python)來說很好,但對於C++來說卻不是。此外,您一定希望能夠根據自己的口味(或團隊慣例)調整格式化風格,而這對於內置的壓頭並不可行,而Uncrustify則提供超過1K的選項。 – 2013-05-06 14:37:05

回答

2

根據smartindent的文檔,您所看到的行爲是正確的。下面是關於#縮進

當輸入「#」作爲一個新行的第一個字符的相關部分,用於 該行的縮進被刪除,「#」被放到第一列。下一行將恢復縮進 。如果你不想要這個,使用映射:「:inoremap#X^H#」,其中^ H是用CTRL-V CTRL-H輸入的。 使用「>>」命令時,以'#'開頭的行不會右移 。

手動移動它的一種方法是更改​​cinkeys。此選項默認爲"0{,0},0),:,0#,!^F,o,O,e",其中第五個選項爲0#。根據幫助表格here更改#縮進的行爲。 (注意:您需要滾動起來段落)

Vim把一個行1列,如果: - 它以「#」(預處理指令),並且「cinkeys」包含「#」。

cinkeys刪除此你可以把你的vimrc

set cinkeys-=0# 

你也應該可能是從indentkeys刪除它太以下。

set indentkeys-=0# 
+0

似乎刪除'set smartindent'並添加'set cinkeys- = 0#'是我想要的。據我所知,除非我需要,否則沒有什麼大的理由要添加'smartindent',並且一切都沒有它。刪除它也有額外的好處,可以修復Python中錯誤的'#'自動縮進。謝謝! – timss 2013-05-06 16:21:52

+0

'smartindent'不是那麼聰明的AFAIK。 'cindent'對C和C++來說更好(默認情況下啓用),大多數主流語言都有自己的'indentexpr'(PHP,Python,Ruby ...)或者使用'cindent'和各種選項(Java,JavaScript ...)。 )。 – romainl 2013-05-06 18:30:09