2011-08-11 25 views
7

Vimにカーソルを合わせたときに自動的に折り畳みを展開できますか?Vimの折り畳みを自動的に展開する方法はありますか?

+1

なかった理由あなたはEelvexの答えを受け入れ、私のものではない?改訂履歴から明らかなように、私はこの解決法(そしてもっと優雅なバージョン、 'au CursorMoved、CursorMovedI * sil!foldo')*を提案するだけでなく、問題をより一貫して解決する方法を開発しました。 –

+0

申し訳ありません。私はなぜそれをしたのか覚えていない。一定。 – dan

答えて

4

foldopenオプションを参照してください。これは、カーソルが閉じた折り目に移動された場合に、どのグループのコマンドが につながるかを制御します。

垂直移動では閉じた折り畳みは開かないことに注意してください。さらに、 この動作を有効にするにはfoldopenに設定がありません。 horアイテムが がfoldopenオプションに設定されている場合、折りたたみを開くにはhlまたは他の 水平移動コマンドを使用できます。 にタッチするカーソルの動きが自動的に開くことが重要な場合は、下に示すように、この問題 の一部を再マッピングすることでこの問題に近づけることができます。

nnoremap <silent> j :<c-u>call MoveUpDown('j', +1, 1)<cr> 
nnoremap <silent> k :<c-u>call MoveUpDown('k', -1, 1)<cr> 
nnoremap <silent> gj :<c-u>call MoveUpDown('gj', +1, 1)<cr> 
nnoremap <silent> gk :<c-u>call MoveUpDown('gk', -1, 1)<cr> 
nnoremap <silent> <c-d> :<c-u>call MoveUpDown("\<lt>c-d>", +1, '&l:scroll')<cr> 
nnoremap <silent> <c-u> :<c-u>call MoveUpDown("\<lt>c-u>", -1, '&l:scroll')<cr> 
nnoremap <silent> <c-f> :<c-u>call MoveUpDown("\<lt>c-f>", +1, 'winheight("%")')<cr> 
nnoremap <silent> <c-b> :<c-u>call MoveUpDown("\<lt>c-b>", -1, 'winheight("%")')<cr> 
function! MoveUpDown(cmd, dir, ndef) 
    let n = v:count == 0 ? eval(a:ndef) : v:count 
    let l = line('.') + a:dir * n 
    silent! execute l . 'foldopen!' 
    execute 'norm! ' . n . a:cmd 
endfunction 

劣るが、少しthriftierソリューションは、すべての カーソル移動に折り目を開くことであろう。

autocmd CursorMoved,CursorMovedI * silent! foldopen 

残念ながら、この解決策は一般的ではありません。 カーソルの下の折り畳みを開いた後、カーソルはその折り畳みの最初の行に配置されます。 この動作が望ましくない場合は、 の垂直方向に移動し、カーソル がボトムアップに移動しているときに、折り返しの最後の行にカーソルを置きます。

autocmd CursorMoved,CursorMovedI * call OnCursorMove() 
function! OnCursorMove() 
    let l = line('.') 
    silent! foldopen 
    if exists('b:last_line') && l < b:last_line 
     norm! ]z 
    endif 
    let b:last_line = l 
endfunction 

ただし、移動が折り目の上を飛んでも折り目は開かれません。 の例の場合、折りたたみのすぐ上の行の2jは、その折り目の直後の行 にカーソルを置きます.2番目の行ではありません。

+0

'CursorMoved'ソリューションを以前のリビジョンから戻します。 –

1

:help fdoとおそらく:help fclが役に立ちます。私は自分の.vimrcに次の行を持っている:

set foldopen=block,hor,insert,jump,mark,percent,quickfix,search,tag,undo 
3
set foldopen=all 

は、あなたがやりたいようです。また、カーソル移動のための自動コマンドを作ることがあります。

のような関数を呼び出す
au CursorMoved * call AutoOpen() 

:あなたは、これはまた、挿入モードでの使用を操作したい場合は

function! AutoOpen() 
    if foldclosed(".") == line(".") 
    call feedkeys("zo") 
    endif 
endfunction 

au CursorMoved,CursorMovedI * call AutoOpen() 
+0

残念ながら、このアプローチには欠点があります(私の答えを見てください)。 –

+0

@ib:私はそれが完璧ではないことを知っていますが、私は欠点を理解していません。あなたは精緻化できますか?ありがとう。 – Eelvex

+0

それは明らかです(そして、私の答えではすでに説明しました)。閉じた折り畳みの隣の行にカーソルを移動し、1行を上に移動します(たとえば、「k」などで)。折りたたみが開かれ、カーソルは最後のものではなく論理的に(行単位の垂直移動のセマンティクスを意味する)折り畳みの最初の行に配置されます。別の欠点を見るには、閉じた折り目のすぐ上の行にカーソルを置き、 '2j'と打ちます。カーソルは折り返し全体に跳ね上がり、2行ではなく折り返しと同じ数の行が移動します。 –

関連する問題