🦍

coc.nvimでウィンドウ分割して定義ジャンプしたい

2021/12/13に公開

初めに

普段coc.nvimを使ってよく定義ジャンプしていますが、たまに画面分割して定義ジャンプしたいことがあります。
coc.nvimがデフォルトで用意している<Plug>(coc-definition)ではそれができないので、ちょっとだけ手を入れる必要があります。

やり方

vimrcに次の設定を追加して、<C-t>で定義ジャンプする再のウィンドウの開き方を指定できます。

" [
"   {"text": "(e)dit", "value": "edit"}
"   {"text": "(n)ew", "value": "new"}
" ]
" NOTE: text must contains '()' to detect input and its must be 1 character
function! ChoseAction(actions) abort
  echo join(map(copy(a:actions), { _, v -> v.text }), ", ") .. ": "
  let result = getcharstr()
  let result = filter(a:actions, { _, v -> v.text =~# printf(".*\(%s\).*", result)})
  return len(result) ? result[0].value : ""
endfunction

function! CocJumpAction() abort
  let actions = [
        \ {"text": "(s)plit", "value": "split"},
        \ {"text": "(v)slit", "value": "vsplit"},
        \ {"text": "(t)ab", "value": "tabedit"},
        \ ]
  return ChoseAction(actions)
endfunction

nnoremap <silent> <C-t> :<C-u>call CocActionAsync('jumpDefinition', CocJumpAction())<CR>

1ポイント解説

getcharstr()は入力から一文字を取得する関数で、キーを入力するまで待ちが発生します。
vまたはsを入力するとそれに応じてvalueを返し、それをjumpDefinitionの第1引数で指定するとウィンドウの開き方を変更できます。

最後に

Happy Vimming!!

Discussion