33

zkVimでは、ファイル内の前の折り畳みまたは次の折り畳みにすばやく移動したりzj、ジャンプしたりしたいと思うことがよくあります。問題は、開いているすべての折り目をスキップして、最も近い閉じている折り目にジャンプしたいということです。

これを行う方法はありますか?ヘルプに組み込みのキーマップが表示されません。

4

2 に答える 2

36

説明した動作の次の実装を提案します。

nnoremap <silent> <leader>zj :call NextClosedFold('j')<cr>
nnoremap <silent> <leader>zk :call NextClosedFold('k')<cr>

function! NextClosedFold(dir)
    let cmd = 'norm!z' . a:dir
    let view = winsaveview()
    let [l0, l, open] = [0, view.lnum, 1]
    while l != l0 && open
        exe cmd
        let [l0, l] = [l, line('.')]
        let open = foldclosed(l) < 0
    endwhile
    if open
        call winrestview(view)
    endif
endfunction

対応する動きの繰り返し回数のカウントをマッピングが受け入れることが望ましい場合は、任意のコマンドを繰り返すための単純な関数を実装できます。

function! RepeatCmd(cmd) range abort
    let n = v:count < 1 ? 1 : v:count
    while n > 0
        exe a:cmd
        let n -= 1
    endwhile
endfunction

次に、上記のマッピングを次のように再定義します。

nnoremap <silent> <leader>zj :<c-u>call RepeatCmd('call NextClosedFold("j")')<cr>
nnoremap <silent> <leader>zk :<c-u>call RepeatCmd('call NextClosedFold("k")')<cr>
于 2012-02-23T04:06:00.010 に答える
1

いいえ、私が知る限り、それを行うための組み込みメソッドはありません。しかし、興味深いアイデアです。

現時点で時間があれば、それを行う方法を見つけようとするかもしれません。残念ながら、最近は忙しいので、折り線の検出またはインクリメンタルサーチの質問(特にfoldclosed関数)そして自分で関数を作ってみてください。すべての行をチェックし、折り目が開いている場合は、スキップします…それらの行に沿って何か。

于 2012-02-23T03:06:45.070 に答える