Windows版Neovimの設定ファイルの配置場所
Windows版Neovimを使い始めると、まず「設定ファイルをどこに置けばいいのか」で迷う人が多くいます。Linux/Macとはパスの慣習が違ううえ、環境変数で変更もできるため、標準の配置場所と変更方法を整理します。
:help base-directoriesとsrc/nvim/os/stdpaths.cを根拠にしています。
目次(8項目)
標準の配置場所:%LOCALAPPDATA%\nvim
特に環境変数を変更していなければ、設定ファイルは次のパスに置きます。
%LOCALAPPDATA%\nvim\init.vim
この%LOCALAPPDATA%は、Neovimが直接読んでいる環境変数です。0.12.4のソース(src/nvim/os/stdpaths.c)では、Windowsのときに設定・データ・状態の3つの基準ディレクトリの既定値として環境変数LOCALAPPDATAをまず読み、それが定義されていないときだけ~\AppData\Localという文字列を展開する形になっています。ユーザープロファイルを既定以外のドライブに移していても、Neovimは%LOCALAPPDATA%が指す先に付いてきます。
Lua設定を使う場合は同じ場所にinit.luaを置きます。ただし置けるのはどちらか片方だけで、両方あるとNeovimは起動時に次のエラーを出します。
E5422: Conflicting configs: "…/nvim/init.lua" "…/nvim/init.vim"
手元のNVIM v0.12.4で、init.vimとinit.luaに別々のグローバル変数を書いて起動したところ、Lua側の変数だけが設定されていました。エラーは出ますが起動自体は止まらないので、init.vimが黙って読まれなくなったように見えます。:helpでも「どちらかであって両方ではない」と書かれた箇所にこのエラー番号が振られています。
パスの書き方はシェルによって違います。cmd.exeではパーセントで囲んで%LOCALAPPDATA%、PowerShellの環境変数プロバイダでは$env:LOCALAPPDATAと書きます。エクスプローラーのアドレス欄には前者がそのまま通るので、まずフォルダを開いて中身を見たいときはそちらが早いです。
# PowerShell から設定ファイルを開く
nvim $env:LOCALAPPDATA\nvim\init.lua
4つの置き場所をstdpath()で確かめる
Neovimが持っているディレクトリは設定用の1つだけではありません。よく使うのは設定・データ・状態・キャッシュの4つで、いま自分の環境でどこを指しているかはstdpath()関数が返します。手元のmacOS(NVIM v0.12.4)で環境変数を何も設定せずに実行すると次の値になりました。
:echo stdpath("config") " ~/.config/nvim
:echo stdpath("data") " ~/.local/share/nvim
:echo stdpath("state") " ~/.local/state/nvim
:echo stdpath("cache") " ~/.cache/nvim
同じ4つがWindowsでどこになるかは:help base-directoriesの表にあります。Unix系では基準ディレクトリが用途ごとに分かれているのに対し、Windowsは設定もデータも状態も%LOCALAPPDATA%が起点になっているのが読み取れます。
| 用途 | 関数 | Windowsの既定 | Unix系の既定 |
|---|---|---|---|
| 設定 | stdpath("config") | %LOCALAPPDATA%\nvim | ~/.config/nvim |
| データ | stdpath("data") | %LOCALAPPDATA%\nvim-data | ~/.local/share/nvim |
| 状態 | stdpath("state") | %LOCALAPPDATA%\nvim-data | ~/.local/state/nvim |
| キャッシュ | stdpath("cache") | %TEMP%配下 | ~/.cache/nvim |
3つ目の状態ディレクトリは、消えても作り直せるが消したくないものが入る場所です。レジスタやマークを次の起動へ持ち越すshadaファイルの既定値も、:help shada-file-nameによれば状態ディレクトリの下にあります。
Luaからはvim.fn.stdpath("data")で同じ値が取れます。プラグインマネージャの導入手順にvim.fn.stdpath("data")を連結したパスがよく出てくるのは、OSごとにパスを書き分けずに済ませるためです。
なおstdpath()はNeovim専用の関数で、Vimにはありません。素のVim 9.1でexists("*stdpath")を実行すると0が返りました。両方で使える手掛かりのほうは$MYVIMRCです。
環境変数XDG_CONFIG_HOMEで変更する
環境変数XDG_CONFIG_HOMEを設定すると、設定ファイルの配置場所を任意の場所に変更できます。ここで取り違えやすいのは、この変数が動かすのが設定ディレクトリだけだという点です。macOSでXDG_CONFIG_HOMEだけを設定して起動すると、stdpath("config")は指定した場所に変わったのに、stdpath("data")は~/.local/share/nvimのまま動きませんでした。
| 環境変数 | 動く場所 | 設定しないときのWindowsの起点 |
|---|---|---|
XDG_CONFIG_HOME | stdpath("config") | %LOCALAPPDATA% |
XDG_DATA_HOME | stdpath("data") | %LOCALAPPDATA% |
XDG_STATE_HOME | stdpath("state") | %LOCALAPPDATA% |
XDG_CACHE_HOME | stdpath("cache") | %TEMP% |
Windowsの「システム環境変数の編集」からXDG_CONFIG_HOMEを追加し、例えばホームフォルダ直下の.configフォルダを指定します。環境変数はNeovimの起動時に読まれるので、追加したあとは開きっぱなしのターミナルを閉じて開き直さないと古い値のままになります。
Linux/Macとの間でdotfilesリポジトリを共有したい場合、XDG_CONFIG_HOMEを揃えておくと同じ相対パス構成のまま設定を使い回せます。ただし4つ全部を揃える必要はありません。共有したいのはたいてい設定だけで、プラグイン本体やアンドゥ履歴はPCごとに違って構わないからです。設定用の1つだけ指定して、残りは各OSの既定に任せるのが手数としては少なく済みます。
設定を丸ごと別のセットに切り替えて試したいなら、NVIM_APPNAMEという別の入口もあります。この変数にnvim-testを指定して起動したところ、stdpath("config")もstdpath("data")も末尾がnvim-testに変わりました。kickstart.nvimやLazyVimのような設定テンプレートを既存の設定を残したまま触るときは、XDG系の変数を引っ越すよりこちらのほうが元に戻しやすくなっています。
データファイル(スワップ・アンドゥ履歴など)の場所
設定ファイルとは別に、プラグイン本体やスワップファイル、アンドゥ履歴は%LOCALAPPDATA%\nvim-dataに保存されます。手元で既定値を確認したところ、directory(スワップ)・undodir(アンドゥ履歴)・backupdirはdirectoryとundodirは状態ディレクトリ配下のswapとundoに向いていました。backupdirだけは先頭が.で、編集中のファイルと同じ場所を先に試してから状態ディレクトリへ回ります。Windowsではその状態ディレクトリもデータと同じnvim-dataなので、結果として1つのフォルダにまとまります。
なぜ-dataという接尾辞が付くのか。Windowsでは設定もデータも起点が同じ%LOCALAPPDATA%なので、どちらもフォルダ名をnvimにすると1つのフォルダに混ざってしまいます。src/nvim/os/stdpaths.cでディレクトリ名を組み立てている関数には、Windowsのときだけデータと状態のディレクトリ名に-dataを足す分岐があり、そのコメントに「設定ファイルとデータファイルを同じパスに置かないため」と理由が書かれています。Unix系は起点がそもそも別なので接尾辞は付かず、macOSで実測したstdpath("data")もnvim-dataではなくnvimで終わっていました。
この接尾辞は環境変数を設定しても外れません。ソースでは-dataを足す処理がXDG_DATA_HOMEを読んだあとに置かれているので、WindowsでXDG_DATA_HOMEをD:\nvimdataにしたときの実際の保存先はD:\nvimdata\nvim-dataになります。バックアップの対象フォルダを決めるときや、設定リポジトリの.gitignoreを書くときに引っかかりやすいところです。
Vimの設定ファイルとの違い
同じWindowsでも、Vimは置き場所の考え方がまったく違います。Vim 9.1の:help vimrcにある表では、MS-Windowsで読まれるのは$HOME/_vimrcと$HOME/vimfiles/vimrcで、どちらも無ければ$VIM/_vimrcが使われると書かれています。ドットで始まらない_vimrcという名前と、.vimではなくvimfilesというディレクトリ名が、Unix系のVimとの差です。
Vimがvimfilesの下に置くのは設定とプラグイン、それにviewdirまでです。スワップとバックアップの既定はWin32では.,$TEMP,c:\tmp,c:\temp、アンドゥは.で、いずれも編集中のファイルの隣か一時ディレクトリに向いています(:help options.txtの各既定値)。Neovimが設定とデータを別ディレクトリに分けているぶん、Windowsでは設定フォルダをそのままGitリポジトリにしても、プラグイン本体やshadaが巻き込まれません。設定側のフォルダを丸ごと管理下に置けるのは、この分離の副産物です。
起動中のNeovimがどのディレクトリを設定として見ているかはruntimepathにも出ます。XDG_CONFIG_HOMEを指定して起動して中身を見たところ、先頭が指定した設定ディレクトリ、末尾が同じディレクトリのafterになっていました。luaやpluginのような下位ディレクトリが読まれるのは、この先頭のパスが起点になっているからです。
設定ファイルが読み込まれないときの確認手順
init.vimを編集したのに変更が反映されない、というときは次の順で確認すると原因を絞り込みやすくなります。
:echo $MYVIMRCで、実際に読み込まれているパスを確認します- 何も表示されないなら、設定ファイルが1つも見つかっていないか、
-u付きで起動しています - 表示されたパスと、自分が保存したつもりのパスをエクスプローラーで見比べます
- 起動直後に
E5422が出ていないか、つまりinit.vimとinit.luaが同居していないかを見ます
$MYVIMRCが空になる条件は手元で2つ確認できました。設定ファイルがどこにも無いときと、nvim --cleanやnvim -u NONEで起動したときです。どちらの場合もstdpath("config")のほうは値を返すので、この2つは役割が違います。stdpath("config")はNeovimが探しに行く場所、$MYVIMRCは探して実際に読んだファイルです。パスが合っているのに設定が効かないなら、次に疑うのはファイルの中身の側になります。
症状の切り分けにはnvim --cleanが使えます。ユーザー設定もプラグインも読まずに起動するので、これで症状が消えるなら原因は自分の設定側、消えないならNeovim本体か端末側です。設定側だと分かったあと、どのスクリプトがどの順で読まれたかまで追うなら:scriptnamesが早いです。
最初はXDG_CONFIG_HOMEを設定すればデータの場所まで一緒に動くものだと思い込んでいて、別のPCでプラグインが1つも入っていないように見えたときに設定ファイルのほうを延々と疑いました。init.luaへ移行したときはinit.vimを消し忘れ、起動直後に一瞬出ていた赤い行を読まないまま「Luaが効かない」と数分悩んでいます。どちらもヘルプに書いてあるとおりの挙動で、外れていたのは自分の思い込みのほうでした。
まとめ
Windows版Neovimの設定ファイルは、標準では%LOCALAPPDATA%\nvimに置きます。設定・データ・状態・キャッシュがそれぞれ別の環境変数で動くことさえ押さえておけば、他のOSと揃えたいところだけを選んで指定できます。どのファイルに何を書くかという役割分担はinit.vimとginit.vimの違いに、配置したのに反映されないときの調べ方は:scriptnamesにあります。