2011-06-29 113 views
6

我已經在互聯網上看到了部分解決方案,但沒有一個真的讓我滿意:我必須將什麼放入我的.vimrc中(理想情況下,我不希望碰巧語法/ *。vim文件),這樣在我打開的所有.c/cpp/h文件中,我會自動摺疊#ifdef ... #endif部分?Autofold #ifdef ..#endif in vim via .vimrc

+0

您使用的是什麼foldmethod?語法摺疊? –

+0

是的,語法摺疊(但我想我可以這樣做,如果這減輕了自動摺疊) – dcn

回答

6

如果你想摺疊的唯一類型是#ifdef部分,最簡單的方法是創建一個文件~/.vim/after/ftplugin/c.vim(您可能還需要爲此在cpp.vim,我不知道),內容如下:

set foldmarker=#ifdef,#endif 
set foldmethod=marker 

如果你真想把它.vimrc,而不是使用~/.vim/after/結構,你可以做這樣的事情:

autocmd FileType *.[ch]{,pp} call FoldPreprocessor() 
function! FoldPreprocessor() 
    set foldmarker=#ifdef,#endif 
    set foldmethod=marker 
endfunction 

您可能還需要考慮ü唱:

set foldmarker=#if,#endif 

因爲這將趕上#if defined(...)#ifdef#ifndef#if 0等以及#ifdef

這樣做與語法摺疊更具挑戰性,因爲你不得不改變語法規範,因爲它不支持這個標準。

+2

vim已經有一個C語法摺疊,但它不折疊#x。如何將此添加到自動C語法摺疊? – orezvani

+0

'*。[ch] {,pp}'模式在'cpp'文件上不適用於我,'* .cpp'也不適用。當我使用'*'時,它就可以工作。任何想法是什麼問題? – oarfish

6

您知道,您可以使用鍵導航預處理器條件塊嗎?

另外,[#]#向上/向下導航。

所以,你可以去一個條件塊的開始(也許/^#輸入),然後

zf%    -- fold to next conditional directive 
v2]#zf   -- fold to second next directive (e.g. #else... #endif) 

zd砸折。

也許你可以圍繞這個概念設計一個小腳本。我不太確定是否會出現(不利的)與常規語法摺疊的交互,因爲我不習慣使用它。我通常使用這種手動摺疊操作縮進摺疊。