2009-05-12 11 views
3

私は、cファイル用に非常にコンパクトなトップレベルフォールディングを作成するシンプルなVimスクリプトを作ろうとしています。それは、このコードで実行された場合には理想的には、:だから、基本的には折り畳みレベル= 1でfoldmethod =構文のようになるVimでのコンパクトCの折りたたみ

+-- x Lines: static void funca(...)---------------------- 
+-- x Lines: static void funcb(...)---------------------- 

static void funca(...) 
{ 
    ... 
} 

/* Example comment */ 
static void funcb(...) 
{ 
    ... 
} 

そして、それが閉じられたときに次のようになり折り目を作成しますただし、各折り目は1行上にさらに上がり始め、さらに下に伸びて次の空白行をすべて含むようになります。

私は(foldmethod =マニュアルを想定して)これらの折り目の1を作る方法を知っている:

/^{<cr>kVnn?^$<cr>zf 

しかし、私は、関数に入れてするかどうかはわかりません。これは私の努力です:

function Cfold() 
    set foldmethod=manual " Manual folds 
    ggzE     " Delete all folds 
    while (/^{<cr>)  " Somehow loop through each match 
    kVnn?^$<cr>zf  " This would work fine except for the last function 
    endwhile 
endfunction 
map <Leader>f :call Cfold()<cr> 

しかし、それは有効ではありませんが、私は機能の仕組みが完全にはわかりません。また、 '^ {'が再び見つからないので、ファイル内の最後の関数では機能しません。誰かがこの作業を手助けして、何らかの形でファイル内の最後の機能のケースを追加すると、私は非常に感謝しています。事前に

感謝:)

答えて

2

あなたはfoldexprfoldtextを使用してプログラム折り目を作成することができます。あなたはそれがコードの非機能部品を飲み込むしないCFoldLevelを微調整する必要があるかもしれませんが、これを試してみてください:

function! CFoldLevel(lnum) 
    let line = getline(a:lnum) 
    if line =~ '^/\*' 
    return '>1' " A new fold of level 1 starts here. 
    else 
    return '1' " This line has a foldlevel of 1. 
    endif 
endfunction 

function! CFoldText() 
    " Look through all of the folded text for the function signature. 
    let signature = '' 
    let i = v:foldstart 
    while signature == '' && i < v:foldend 
    let line = getline(i) 
    if line =~ '\w\+(.*)$' 
     let signature = line 
    endif 
    let i = i + 1 
    endwhile 

    " Return what the fold should show when folded. 
    return '+-- ' . (v:foldend - v:foldstart) . ' Lines: ' . signature . ' ' 
endfunction 

function! CFold()    
    set foldenable 
    set foldlevel=0 
    set foldmethod=expr 
    set foldexpr=CFoldLevel(v:lnum) 
    set foldtext=CFoldText() 
    set foldnestmax=1 
endfunction 

詳細は:help 'foldexpr'を参照してください。

+0

ありがとうございました:)それはまさに私が探していたものでした。それは少し変更が必要でしたが、私はそれがほしいと思う方法で働いていて、最終的に私のCプロジェクトからマーカーを取り除くことができます。 非常に高く評価されています。 –

+2

こんにちは、あなたはあなたの微調整バージョンを共有できますか?ありがとうございます –

+0

うーん...私は上記のvimコードを試してみましたが、関数の上に複数行のコメントでうまく動作しません... – chutsu