WindowsにNeovimを入れてプラグインが動くまで(dein.vimの今)
WindowsにNeovimを入れる作業は、本体を落として終わりではありません。素のNeovimは最低限の編集ができるだけで、実用的に使うにはプラグインマネージャと、必要ならPython連携の準備が要ります。このページでは本体のインストールから、実際にプラグインが入って動く状態になるまでを通しで扱います。あわせて、かつてWindowsでの定番だったdein.vimが今どうなっているのかも整理します。
検証環境:lazy.nvimのブートストラップとPython連携の確認は、macOS + Neovim 0.12.4で実際に動かしています。wingetのコマンドとWindows固有のパスは公式ドキュメントに沿った記述で、Windows実機では未検証です。
前提:Neovim本体のインストール
Windows 10/11なら、標準で入っているwingetで本体が入ります。PowerShellでもコマンドプロンプトでも構いません。
winget install -e --id Neovim.Neovim
インストールが終わったら、いったんターミナルを開き直してから確認します。nvimにPATHが通っていれば、次のようにバージョンが表示されます。
nvim --version
ここで「コマンドが見つかりません」と出る場合は、ターミナルを開き直していないか、PATHが通っていないかのどちらかです。GUIクライアント(nvim-qtやNeovide)の選び方や、zipを展開する手動インストールの手順は別記事にまとめています。この記事では、ここから先の「プラグインが動く状態にする」部分を扱います。
Python連携を使うなら
一部のプラグインはPython3連携(pynvim)を前提にしています。使う予定があるなら、Pythonを入れたうえで次を実行しておきます。
winget install -e --id Python.Python.3.12
pip install pynvim
Neovimがどのpython実行ファイルを見ているかは:checkhealth providerで確認できます。pynvimが入っていない状態で実行すると、次のように「import neovimできるPythonが見つからない」と警告が出ます。手元のNeovim 0.12.4での実際の出力です。
Python 3 provider (optional)
- ⚠ WARNING No Python executable found that can `import neovim`.
Using the first available executable for diagnostics.
- ⚠ WARNING Could not load Python :
/usr/bin/python3 does not have the "neovim" module.
この警告はPython連携を使わないなら無視して構いません(optionalと書かれているとおりです)。使う場合はpip install pynvimを、Neovimが見ているPythonに対して実行する必要があります。複数のPythonが入っていて狙ったものが使われない場合の対処は別記事にまとめています。なおNeovim 0.12では診断結果の見出しがvim.providerという名前に変わっていますが、:checkhealth providerという書き方は今も通ります。
設定ファイルの置き場所
詳しい配置場所は別記事にまとめていますが、要点だけ書くと次のパスにinit.luaを置きます。
%LOCALAPPDATA%\nvim\init.lua
フォルダが無ければ作成します。設定言語はVim scriptでも書けますが(init.vim)、新しく始めるなら素直にLuaのinit.luaから始めたほうが、この後のプラグインマネージャとの相性がよくなります。
プラグインマネージャを入れる
かつてはdein.vimやNeoBundleが定番でしたが、今はLua製のlazy.nvimが事実上の標準になっています。init.luaの先頭に、公式のインストール手順にあるブートストラップコードを置いておけば、環境を作り直すたびに再クローンする必要がなくなります。
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
local out = vim.fn.system({
"git", "clone", "--filter=blob:none",
"--branch=stable", lazyrepo, lazypath,
})
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo({
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
{ out, "WarningMsg" },
{ "\nPress any key to exit..." },
}, true, {})
vim.fn.getchar()
os.exit(1)
end
end
vim.opt.rtp:prepend(lazypath)
require("lazy").setup({
-- ここにプラグインを追加していく
})
起動後の使い方
このコードを保存してNeovimを起動すると、lazy.nvim自体が自動でクローンされます。以降はrequire("lazy").setup({...})の中にプラグイン名を追加していくだけで管理できます。
vim.uvとvim.loopの互換性
ブートストラップコードでvim.uv or vim.loopと書いているのは、バージョンによって存在するAPIが違うためです。
| Neovimバージョン | 使えるAPI |
|---|---|
| 0.10未満 | vim.loopのみ |
| 0.10以降 | vim.uvが正式。vim.loopは非推奨 |
非推奨とはいえ、vim.loopがすぐ消えるわけではありません。手元のNeovim 0.12.4で確認したところ、vim.loopもvim.uvも両方とも存在していました。公式のヘルプではdeprecated.txtに「vim.loop:代わりにvim.uvを使うこと」と載っている段階です。ただ、いつ削除されてもおかしくない状態なので、これから書くコードはvim.uv側に寄せておくのが無難です。ブートストラップコードがvim.uv or vim.loopと両対応で書かれているのは、古いNeovimでも新しいNeovimでも同じ設定ファイルが動くようにするためです。
dein.vimはどうなったのか
WindowsでNeovimを入れる記事では、長らくdein.vimが定番のプラグインマネージャでした。今もgit cloneしてruntimepathに足せば動きます。ただ、作者自身がREADMEで開発の終了を明言しています。
Active developement on dein.vim has stopped. The only future changes will be bug fixes.
後継として案内されているのは、同じ作者によるdpp.vimです。dein.vim自体が動かなくなったわけではなく、バグ修正は続くとされているので、今の設定が動いている人が慌てて移す必要はありません。動作要件はVim 8.2以上、Neovim 0.8.0以上、Git 2.4.11以上です。
| 状況 | 選ぶもの |
|---|---|
| これから始める | lazy.nvim |
| dein.vimの設定が手元にあり、動いている | そのままでも困らない(急いで移す理由は薄い) |
| 作者の系譜を追いたい | dpp.vim |
dein.vimの設定をlazy.nvimに移すとき
書き方の対応はおおよそ次のようになります。Vim scriptの関数呼び出しが、Luaのテーブルに置き換わると考えると分かりやすいです。
| dein.vim | lazy.nvim |
|---|---|
call dein#add('user/repo') | { "user/repo" } |
dein#begin()〜dein#end()で囲む | require("lazy").setup({ ... })の中に並べる |
set runtimepath+=で手動追加 | ブートストラップのvim.opt.rtp:prepend(lazypath) |
dein#check_install()/dein#install() | 起動時に自動で入る。手動なら:LazyのUIから実行 |
設定ファイルの言語もinit.vimからinit.luaへ移ることになります。移行の途中で両方を置いたままにすると、Neovimは起動時に次のエラーを出して設定を読み込みません。手元で両方を配置して再現しました。
E5422: Conflicting configs: "~/.config/nvim/init.lua" "~/.config/nvim/init.vim"
片方を消すか、拡張子を変えて退避させてから起動してください。
要点:pynvimが必要なプラグインを使うなら先にPython3を入れておきます。プラグインマネージャは新規ならlazy.nvimを選び、公式のブートストラップコードをそのまま使えばvim.loopの非推奨化にも引っかかりません。
以前は手動でzipを解凍してPATHを通す手順に慣れきっていたので、wingetに切り替えたときは拍子抜けするくらい早く終わりました。dein.vimからlazy.nvimに乗り換えたときも、設定の書き方は変わりましたが移行作業自体は数十分で済み、身構えていたより軽く感じました。
まとめ
本体のインストールはwingetの1行で終わり、そこから実際にプラグインが動く状態まで持っていくのに必要なのは、init.luaの配置とlazy.nvimのブートストラップコードだけです。Python連携は使うプラグインが要求したときに足せば十分で、:checkhealthの警告は使わないうちは無視して構いません。dein.vimの手順で来た人向けに補足すると、dein.vimは開発が止まってバグ修正のみになっています。今動いている設定を慌てて捨てる必要はありませんが、これから作るならlazy.nvimを選んでおくほうが情報も見つけやすくなります。