cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

zkで折り畳みを移動する時、折り畳み尻ではなく折り畳み頭にジャンプする関数

Vimのバインドzj zkで次の折り畳み、前の折り畳みにジャンプすることができるが、zjはまだ良いとして、zkは折り畳みの末尾にジャンプする。
これではもし移動先の折り畳みが折り畳まれていた場合、一体どこにジャンプしたのか分からない。
尻ではなく頭にジャンプしてほしい。
そんなわけで、カーソルより前の折り畳みの頭に跳ぶ関数作った。

nnoremap zk   :<C-u> call ZkJump_to_foldhead()<CR>


function! ZkJump_to_foldhead() "{{{
  mark '
  for i in range(v:count1)
    call s:__zkJump_to_foldhead_go()
  endfor
  mark '
endfunction
"}}}
function! s:__zkJump_to_foldhead_go() "{{{
  let start_lv = foldlevel('.')
  keepj norm! zk

  if start_lv > 1 && foldlevel('.') < start_lv "自分の親を飛び越している可能性
    keepj norm! zj
  else
    let fc_head = foldclosed('.')
    if fc_head != -1 "ジャンプ先がclosed_foldingの場合
      exe fc_head
    else
      exe s:__jumpto_last_innerfoldhead()
    endif
  endif
endfunction
"}}}
function! s:__jumpto_last_innerfoldhead() "{{{
  let foldtail = line('.')
  keepj norm! [z
  let fh = line('.')
  while fh < foldtail
    keepj norm! zj
    let old_fh = fh
    let fh = line('.')
  endwhile
  return old_fh
endfunction
"}}}