Wagomu no Akibako

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_APPNAMEto “foo” before starting will cause Nvim to look for
configuration files in $XDG_CONFIG_HOME/fooinstead of $XDG_CONFIG_HOME/nvim. $NVIM_APPNAMEmust 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_…/nvimis 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を​使った​構成を​サブの​サブ環境と​して​作ろうかなと​考えています。​ なんなら​サブ環境を​作るのが​楽しすぎて​メイン環境を​作りな​おしたくなってきました。