Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

neovim 0.12からはネイティブの補完で十分そう

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

0.11の補完画面

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

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でいよいよ実用レベルになったといえる。特段こだわりがなければもうこれで十分そうだ。