ZshとNeoVimの設定見直し で設定したNeoVimの設定をLuaに移行した。
TL;DR
- Neovim 0.11.5 は Lua前提なので、
init.vim + vim-plugからinit.lua + lazy.nvimへ寄せるとリターンがデカい。 - 補完は
blink.cmpが今どきの選択肢として強い。 - 0.11 の罠:
init.luaとinit.vimの同居はNG(E5422: Conflicting configs)。段階移行は工夫が要る。 - ついでに NERDTree→oil.nvim、手書き括弧→nvim-autopairs、IME→Lua autocmd、カーソル形状→
guicursor。
背景
Neovim 0.11 世代は LSP/diagnostic/周辺プラグインのエコシステムが Lua前提で進んでる。Vimscript中心で維持すると、
- 新しい設定APIの恩恵が薄い
- プラグインのサンプル/ドキュメントとの差が開く
- トラブル時の切り分けが遅くなる
みたいな「ジワジワ負け」が起きる。
0.11 の落とし穴: init.lua と init.vim は同居できない
0.11 では ~/.config/nvim/init.lua と ~/.config/nvim/init.vim が同時に存在すると、起動時に E5422: Conflicting configs で止まる。
つまり「init.lua を作って、そこから init.vim を source して段階移行」みたいな古典的プランは、そのままだと破綻する。
今回の着地は以下:
init.vimを捨てる(repo 側でも削除)- 必要な挙動は Lua に移植
- 一時退避用の
legacy.vimも最終的に ゼロ化して削除
構成
nvim/init.lua: エントリポイント(lazy bootstrap + core 読み込み)nvim/lua/plugins.lua: lazy.nvim の spec 集約nvim/lua/core/options.lua: options / guicursor / IME autocmdnvim/lua/core/keymaps.lua: keymapsnvim/lua/core/diagnostics.lua: diagnostic 設定 +LspAttach
実装の要点
1) init.lua で lazy.nvim bootstrap
- lazy.nvim が無ければ clone
core/*とpluginsを読み込む- 保存時に Lua を再読み込みする簡易ホットリロード
2) lazy.nvim で管理するプラグイン
telescope.nvimnvim-treesittercopilot.luaCopilotChat.nvimblink.cmpnvim-lspconfig(blink の capabilities を LSP に渡す)
さらに legacy ゼロ化のために:
oil.nvim(NERDTree置換)nvim-autopairs(手書き括弧補完置換)
3) 0.11 で効く設定(diagnostic/LspAttach)
vim.diagnostic.configを Lua で明示LspAttachでバッファローカル keymap(hover/definition/rename/code action/diagnostic nav/format)
4) legacy をゼロにする(Oil/Autopairs/IME/Cursor)
- NERDTree→Oil:
<C-t>を:Oilに割り当てて移行コスト0 - 括弧補完: 手書き
inoremapをやめてnvim-autopairs - カーソル形状:
t_SI/t_EIハックをやめてguicursor - IME:
im-selectを Lua autocmd で叩く(0.11 のvim.system()で非同期)
5) <Tab> 問題(Copilot vs 補完)
<Tab> は Copilot / 補完UI / pum で衝突しがち。
今回は「Copilot のゴースト提案が見えてる時だけ <Tab> で accept、それ以外は pum/通常Tabにフォールバック」という挙動に寄せた。
運用の掃除(移行後に残りがちなゴミ)
- 旧
copilot.vim(~/.config/nvim/pack/...)は削除して二重ロード回避 ~/.config/nvim/plugged/(vim-plug 残骸)も削除- 壊れた
~/.vimrcsymlink も削除(Vim 起動時のノイズ源)