zkVimでは、ファイル内の前の折り畳みまたは次の折り畳みにすばやく移動したりzj、ジャンプしたりしたいと思うことがよくあります。問題は、開いているすべての折り目をスキップして、最も近い閉じている折り目にジャンプしたいということです。
これを行う方法はありますか?ヘルプに組み込みのキーマップが表示されません。
zkVimでは、ファイル内の前の折り畳みまたは次の折り畳みにすばやく移動したりzj、ジャンプしたりしたいと思うことがよくあります。問題は、開いているすべての折り目をスキップして、最も近い閉じている折り目にジャンプしたいということです。
これを行う方法はありますか?ヘルプに組み込みのキーマップが表示されません。
説明した動作の次の実装を提案します。
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>
いいえ、私が知る限り、それを行うための組み込みメソッドはありません。しかし、興味深いアイデアです。
現時点で時間があれば、それを行う方法を見つけようとするかもしれません。残念ながら、最近は忙しいので、折り線の検出またはインクリメンタルサーチの質問(特にfoldclosed
関数)そして自分で関数を作ってみてください。すべての行をチェックし、折り目が開いている場合は、スキップします…それらの行に沿って何か。