3

私は、cファイルの非常にコンパクトなトップレベルのフォールドを作成する単純なVimスクリプトを作成しようとしています。理想的には、このコードで実行された場合:

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

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

次に、閉じたときに次のように見える折り目を作成します。

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

したがって、基本的にはfoldmethod = syntax with foldlevel = 1のようになりますが、各折り畳みは1行上から始まり、さらに下に伸びて後続のすべての空白行が含まれる点が異なります。

私はこれらの折り畳みの1つを作る方法を知っています(foldmethod = manualと仮定して):

/^{<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>

しかし、それは有効ではありません。関数がどのように機能するか完全にはわかりません。また、ファイル内の最後の関数では「^ {」が再度検出されないため、機能しません。誰かが私がこれを機能させるのを手伝ってくれて、どういうわけかファイルの最後の関数のケースを追加してくれたら、私は非常に感謝しています。

前もって感謝します :)

4

1 に答える 1

3

foldexprおよびを使用して、プログラムでフォールドを作成できますfoldtext。これを試してください。ただし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'してください。

于 2009-05-13T06:25:57.990 に答える