🐼

Neovimの設定すべてをまるっと切り替えられるマルチプロファイル運用

2023/05/26に公開

この記事は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