coc.nvimの補完メニューの仕様が変わったらしい
記事を書いた背景
coc.nvim
の0.0.82
で補完メニューの仕様が変わったようです。
詳しくは以下のプロリクエスト、もしくは:h coc-completion
に詳しく書いています。
[WIP] Custom completion menu #3862
それに伴い関数名などが変更されたため、設定の一部を変更する必要があります。今後、新しいバージョンを利用する方は、過去の記事がほとんど使えなくなると思われます。8/9現在、Googleで検索したところ、日本語でこの件を扱っている記事が見当たらないため、簡単にですがまとめておこうと思いました。
しかし、筆者自身もこのアップデートを知って、1,2時間程度でこの記事を書いてるため、理解が甘いところがあるかもしれませんがご了承ください。
変更点
以下がこれまで有効だった設定です。
" Enterを押すと補完を確定する
" 元々<C-y>に割り当てられた機能
inoremap <expr><CR> pumvisible() ? "<C-y>" : "<CR>"
アップデート後、coc.nvim
の補完メニューが独自の物になりました。これにより、組み込み関数であるpumvisible
関数は、coc.nvim
の補完メニューの状態を取得できなくなりました。今後はcoc#pum#visible
関数を利用する必要があります。
以下がバージョンアップに対応した設定です。
" 以下だと動作しなかったので、直接coc#pum#confirm関数を呼んでいます。
" inoremap <silent><expr> <CR> coc#pum#visible() ? "<C-y>" : "\<CR>"
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm() : "\<CR>"
新バージョンで使用できる関数については、[WIP] Custom completion menu #3862や:h coc-completion
にまとめられています。
最後に
より詳細に書かれた記事や、間違えている点がありましたら、是非教えていただけると幸いです。
参考例として、筆者の設定を投げて終わりにしたいと思います。
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~ '\s'
endfunction
" autocomplete
inoremap <silent><expr> <C-j> coc#pum#visible() ? coc#pum#next(1) : "\<C-j>"
inoremap <silent><expr> <C-k> coc#pum#visible() ? coc#pum#prev(1) : "\<C-k>"
inoremap <silent><expr> <Enter> coc#pum#visible() ? coc#pum#confirm() : "\<Enter>"
inoremap <silent><expr> <Esc> coc#pum#visible() ? coc#pum#cancel() : "\<Esc>"
inoremap <silent><expr> <C-h> coc#pum#visible() ? coc#pum#cancel() : "\<C-h>"
" <Tab>で次、<S+Tab>で前
inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1):
\ <SID>check_back_space() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<S-TAB>" " "\<C-h>"
inoremap <silent><expr> <c-space> coc#refresh()