Neovim 0.11でinit.vimからinit.luaへ移行する方法と注意点

Migrating from init.vim to init.lua in Neovim 0.11: Complete Guide

* 本ページはプロモーションが含まれています

ZshとNeoVimの設定見直し で設定したNeoVimの設定をLuaに移行した。

TL;DR 

  • Neovim 0.11.5 は Lua前提なので、init.vim + vim-plug から init.lua + lazy.nvim へ寄せるとリターンがデカい。
  • 補完は blink.cmp が今どきの選択肢として強い。
  • 0.11 の罠: init.luainit.vim の同居はNGE5422: Conflicting configs)。段階移行は工夫が要る。
  • ついでに NERDTree→oil.nvim、手書き括弧→nvim-autopairs、IME→Lua autocmd、カーソル形状→guicursor

背景 

Neovim 0.11 世代は LSP/diagnostic/周辺プラグインのエコシステムが Lua前提で進んでる。Vimscript中心で維持すると、

  • 新しい設定APIの恩恵が薄い
  • プラグインのサンプル/ドキュメントとの差が開く
  • トラブル時の切り分けが遅くなる

みたいな「ジワジワ負け」が起きる。

0.11 の落とし穴: init.luainit.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 autocmd
  • nvim/lua/core/keymaps.lua: keymaps
  • nvim/lua/core/diagnostics.lua: diagnostic 設定 + LspAttach

実装の要点 

1) init.lua で lazy.nvim bootstrap 

  • lazy.nvim が無ければ clone
  • core/*plugins を読み込む
  • 保存時に Lua を再読み込みする簡易ホットリロード

2) lazy.nvim で管理するプラグイン 

  • telescope.nvim
  • nvim-treesitter
  • copilot.lua
  • CopilotChat.nvim
  • blink.cmp
  • nvim-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 残骸)も削除
  • 壊れた ~/.vimrc symlink も削除(Vim 起動時のノイズ源)

See also