neovim 0.11でLSP補完が有効になった。が、枠線がなかったりプレビューが不足していたり、実用するにはあと一歩足りてない感 があった。

が、0.12でその辺に 強化が入った。

見た目的にも結構変化がわかりやすい。
0.12で入った強化
neovim docsのNews-0.12に書いてあるこの辺りがポイント。
- 補完アイテムのプレビュー
- popup menu にボーダー追加
個人的に大きいのは1つ目。プレビュー(枠線部)があることで 圧倒的に使いやすくなった。

2つ目も気分的にはだいぶアガる。枠線が何もないと見づらくて使いづらかったので、けっこう嬉しい。
(他にも色が表示されるようになったという細かい変更もあるが、個人的にはふーんって感じだ)

設定方法
基本はこれでOK。
vim.o.pumborder = 'rounded' -- ポップアップメニューに罫線を追加 vim.opt.completeopt = { 'menu', 'menuone', 'noselect', 'fuzzy', 'popup' } -- popupを入れると候補の説明がプレビューされる -- LSPの補完を自動で有効化 vim.api.nvim_create_autocmd('LspAttach', { callback = function(ev) local client = vim.lsp.get_client_by_id(ev.data.client_id) if client and client:supports_method('textDocument/completion') then vim.lsp.completion.enable(true, client.id, ev.buf, { autotrigger = true }) end end, })
ただ、これだけだと候補説明ウィンドウにはボーダーがつかない。今はオプションが未整備なので、ハックを使って無理やり罫線をつける↓
-- HACK: ドキュメントポップアップに無理やりボーダーを付ける -- 現状 winborder や completeopt=popup だけではドキュメントfloatのボーダーを制御できない -- https://github.com/neovim/neovim/issues/38248 -- 将来的に completepopup オプション等が実装されればこのワークアラウンドは不要になる local orig_complete_set = vim.api.nvim__complete_set vim.api.nvim__complete_set = function(...) local result = orig_complete_set(...) if result and result.winid then pcall(vim.api.nvim_win_set_config, result.winid, { border = 'rounded' }) end return result end
(この手法は deathbeam/autocomplete.nvim や neovim/neovim#29225 でも使われているので、そこまでダーティではない)
まとめ: もうネイティブの補完でいいかも
0.11で使えるようになったLSP補完が0.12でいよいよ実用レベルになったといえる。特段こだわりがなければもうこれで十分そうだ。
