Neovimの設定すべてをまるっと切り替えられるマルチプロファイル運用
この記事はVim駅伝の2023-05-26向け記事です
tl;dr
- Neovim v0.9は
NVIM_APPNAME
という環境変数で設定やキャッシュなどの在処をコントロールできる - 設定や環境のスイッチングが簡単にできて便利
- 補題:WezTermからNeovimを直接呼び出すときの設定を紹介
背景にあった課題と解決の契機
Neovimを重課金(設定のために時間を大量に投入)している人ほど、
今の設定ではなく、まったく別の環境を試してみたい
と思うも腰の重くなるシーンは多々あることでしょう。たとえば
- Neovimの設定をゼロから見直して大掃除したい
- 設定が何かの拍子に壊れたので、どこにミスがあるのか探索したい
- プラグインが何かの拍子に壊れたので、ミニマムな再現環境を構築したい
- あの人のDotfiles、面白そうだから体験してみたい
etc, etc...
私たちが自身のためだけに築きあげた設定たちは、そう易々と破壊できるとは限りません。
普段から空気のようにそこにあるテキストエディタを破壊してしまえば、呼吸もままならなくなるのです。
そして最近、Neovimの v0.9(2023-04-07))において、
NVIM_APPNAME
という環境変数を利用する変更が加えられました。
この変更が、先の課題を解決できる手段の1つたりえたので、どう活用できたのかを紹介していきます。
NVIM_APPNAME
を使ってみる
とりあえず試す
実際に環境変数をセットして、Neovimを起動してみます。
$ export NVIM_APPNAME=nvim-test
$ nvim
無事、デフォルトのNeovimが立ち上がりました。
既存の設定はすべて無視されていることでしょう。
何が起きているのか
NVIM_APPNAME
をセットすることで何が起きてるかは、Neovimのヘルプに記載があります。
NVIM_APPNAME
$NVIM_APPNAME
The XDG directories used by Nvim can be further configured by setting the
$NVIM_APPNAME
environment variable. This variable controls the directory
Neovim will look for (and auto-create) in the various XDG parent directories.
For example, setting$NVIM_APPNAME
to "neovim" before running Neovim will
result in Neovim looking for configuration files in$XDG_CONFIG_HOME/neovim
instead of$XDG_CONFIG_HOME/nvim
.Note: Similarly to the $XDG environment variables, when
$XDG_CONFIG_HOME/nvim
is mentioned, it should be understood as
$XDG_CONFIG_HOME/$NVIM_APPNAME
.
つまり、
- デフォルトでは
XDG_CONFIG_HOME
配下のnvim/
ディレクトリを設定ファイルの置き場所として探索する -
NVIM_APPNAME
に値をセットすることで、指定した名前を(nvim
の代わりに使用して)探索するディレクトリ名とする
という動きをします。
ちなみに、CONFIG DIRECTORYについてのみ言及されていますが、DATA, RUN, STATEと言ったファイル群についてもその置き場所をNVIM_APPNAME
で変更できます。
XDG某やその手のファイルの役割についてはNeovimのヘルプ(:help base-directories
)を見ましょう。
NVIM_APPNAME
に合わせて設定を作る
新しい何が起きているのかが分かれば、新しい設定を作るのは難しくありません。
普段から設定しているとおり、nvim/init.(vim|lua)
の代わりに $NVIM_APPNAME/init.(vim|lua)
を設定するだけです。
例:
set shiftwidth=3
新しい設定の中身を初期化する
試行錯誤のため、検証のための環境をNVIM_APPNAME
で作る場合、作った環境をゼロからやり直したいシーンは多々あります。
その場合、:help base-directories
に相当するNVIM_APPNAME
で指定した名前のディレクトリを消しておきましょう。
Unix系環境でXDGの環境変数をいじってない場合の例:
$ echo $NVIM_APPNAME
nvim-test
$ rm -rf ~/.config/nvim-test
$ rm -rf ~/.local/share/nvim-test
$ rm -rf ~/.local/state/nvim-test
何が嬉しいのか
設定の切り替え自体は、様々な方法で実現可能でしょう。
ではNVIM_APPNAME
で切り替えられると何が嬉しいんでしょう。
ひとつに「cacheやdata、stateが既存の設定のものと切り離せる」という点が挙げられます。
各種プラグインは、cacheやdataといったディレクトリの下に変更を加えがちです。
これごと切り替えることで、既存の設定の影響を完全に排除して新しい設定を試すことができます。
XDG_CONFIG_HOME
などを切り替えれば良いのでは?
XDGの各種環境変数を設定すれば、Neovimの各種base-directoriesを変更できます。
ただし、環境変数の影響はNeovim以外にも及びます。
Neovimはいろいろな他のプログラムを呼び出して利用しています。
- Grep
- Linter
- Formatter
- Fuzzy Finder
- Language Server
- etc, etc...
それらもXDGの各種環境変数を参照して挙動を変えていることがままあります。
XDGの環境変数を変更すると、Neovimから利用されているそれらのディレクトリについても同様にコピーしておく必要が生じます。
NVIM_APPNAME
利用時の注意点
NVIM_APPNAME
に指定する名前は、nvim-
という接頭辞を付けるなど、それがNeovimであることを分かるようなものにしましょう。
XDGの各ディレクトリはNeovim以外でも利用するものですから、他の利用者と名前が重複してしまったり、
整理する際などに他と紛れる事態を防止できます。
補題:WezTermからNeovimを直接呼び出すときの設定を紹介
私はWezTermを立ち上げると、常にWSL上でNeovimが起動される設定にしています。
local default_prog = { "wsl.exe", "--distribution", "Ubuntu", "--cd", "~", "--exec", "/bin/zsh", "-l", "-c", "nvim" }
ターミナルはNeovim内の:termianl
を使って生活するスタイルです。
この場合、Neovimを起動する前に環境変数を設定する隙がありません。
困りましたね。
WezTermの場合、launch_menu
を使用すると、起動時に呼び出すプログラムを切り替えることができます。
launch_menu = {
{
label = "Neovim",
args = default_prog,
},
{
label = "Neovim for test",
args = { "wsl.exe", "--distribution", "Ubuntu", "--cd", "~", "--exec", "/bin/zsh", "-l", "-c", "NVIM_APPNAME=nvim-test nvim" },
},
},
launch_menu
を表示するためのkeysとともに設定しておくと良いでしょう。
keys = {
{
key = "t",
mods = "ALT",
action = wezterm.action.ShowLauncherArgs({ flags = "FUZZY|LAUNCH_MENU_ITEMS" }),
},
},
便利。
Discussion