輪ごむの空き箱

Neovimのサブ環境を作るという選択肢


この記事はVim駅伝2024年2月21日(水)の記事です。

前回の記事は monaqa さんの「Vim 駅伝にランキングページを追加しました」という記事でした。

次回の記事は 2月23日(金) に投稿される予定です。


はじめに

Neovimのサブ環境を作りました!!

経緯

v 0.9.0から$NVIM_APPNAMEという名前で環境変数を定義することにより、複数の環境を切替えられるようになりました。無知だった私は「$XDG_CONFIG_HOMEってlinuxとかで見る環境変数だからWindowsで使えないじゃないか…」と思っていましたが、試してみたところWindowsでも使えたため、ウキウキでサブ環境を作りこの記事を書き始めました。
この記事を書くにあたって該当機能が追加されたコミットを探したところ2023/02/16のコミットでした。試してみれば分かった話なのに1年間もWindowsでも使えることに気が付かなかったようです…

使い方

ここが本編です。
ヘルプ(:h $NVIM_APPNAME)を確認するとこのように書かれています。

NVIM*APPNAME *$NVIM_APPNAME_
The standard directories can be further configured by the $NVIM_APPNAME environment variable. This variable controls the sub-directory that Nvim will
read from (and auto-create) in each of the base directories. For example,
setting$NVIM_APPNAME to “foo” before starting will cause Nvim to look for
configuration files in $XDG_CONFIG_HOME/fooinstead of $XDG_CONFIG_HOME/nvim. $NVIM_APPNAME must be a name, such as “foo”, or a
relative path, such as “foo/bar”.

One use-case for $NVIM_APPNAME is to “isolate” Nvim applications.
Alternatively, for true isolation, on Linux you can use cgroups namespaces: >
systemd-run —user -qt -p PrivateUsers=yes -p BindPaths=/home/user/profile_xy:/home/user/.config/nvim nvim

Note: Throughout the help pages, wherever $XDG_CONFIG_…/nvim is mentioned it
is understood to mean $XDG_CONFIG_…/$NVIM_APPNAME.

$NVIM_APPNAMEを定義するとNeovimが起動したときに$XDG_CONFIG_HOME/nvimではなく$XDG_CONFIG_HOME/$NVIM_APPNAMEを標準のディレクトリにするよということです。
よって、下記のように$NVIM_APPNAME環境変数をセットした後に普段どおりnvimコマンドを実行することで別の環境としてNeovimを起動することができます。私のメイン環境であるWindowsを例として取り上げるとこのように実行します。

REM cmd.exe
$ set NVIM_APPNAME=nvim-hoge&& nvim

$NVIM_APPNAMEを使って起動していることはstadpath関数を実行することで確認できます。

:echo stdpath('cache')
C:\Users\wagomu\AppData\Local\Temp\nvim-hoge

:echo stdpath('config')
C:\Users\wagomu\AppData\Local\nvim-hoge

:echo stdpath('data')
C:\Users\wagomu\AppData\Local\nvim-hoge-data

環境変数に設定したnvim-hogeが使われていることを確認できました。

因みにzshでは、このように実行することでNVIM_APPNAMEを使えます。

# zsh
$ NVIM_APPNAME=nvim-hoge nvim

stdpath関数の実行結果は以下のようになっています。

:echo stdpath('cache')
/Users/wagomu/.cache/nvim-hoge

:echo stdpath('config')
/Users/wagomu/.config/nvim-hoge

:echo stdpath('data')
/Users/wagomu/.local/share/nvim-hoge

あとは好きなように使ってください。
私のwindows環境では、init.macros内に下記のエイリアスを設定しており、n2コマンドでサブ環境が立ち上がるようになっています。

n2=set NVIM_APPNAME=nvim-v2&&nvim $*

一点注意点としては、vim-Plugなどのインストールスクリプトを実行するときに正しいパスになっているか確認する必要があります。
こちらがvim-PlugのREADMEに記載されているインストールスクリプトですが、配置先が標準の配置先である$XDG_DATA_HOME/nvim-data以下になっています。$NVIM_APPNAMEに設定した値になっているのか確認したうえで実行するようにしてください。

iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
    ni "$(@($env:XDG_DATA_HOME, $env:LOCALAPPDATA)[$null -eq $env:XDG_DATA_HOME])/nvim-data/site/autoload/plug.vim" -Force

メイン環境とサブ環境の違いは?

メイン環境ではDark Poweredと呼ばれているShougoさんのプラグインを多く使い多くの挙動を自分で設定できる構成にしています。しかし私が闇の力にうまく適合できていないためにうまく動かないことが多々ありましたし、未だにあります。そのようなときは一部うまく動いていない状態の不完全なNeovimを使うか、涙を流しながらVSCodeを起動するという2択をせまられていました。サブ環境ではそのようなことが起こらないようにDark Powerdプラグインを採用せずにメジャーなプラグイン構成にしました

分類プラグイン名
プラグインマネージャーtani/vim-jetpack
自動補完hrsh7th/nvim-cmp
ffnvim-telescope/telescope.nvim

おわりに

複数環境を持てるようになり、自分の世界が広がりました。これによって他人のdotfilesを試すことが容易になりました。次はmini.nvimを使った構成をサブのサブ環境として作ろうかなと考えています。 なんならサブ環境を作るのが楽しすぎてメイン環境を作りなおしたくなってきました。