monolithic kernel

chezmoi で同じ内容のファイルを環境に応じて違うパスに配置する

例えば Neovim の設定ファイルは、基本的には XDG Base Directory ($HOME/.config) に置くのだが、Windows だと %LOCALAPPDATA% になっている、という具合に、環境によって同じファイルを違うパスに置くケースが存在する。

chezmoi は基本的に source のディレクトリ構造をそのまま配置する仕様になっているため、上記のようなことをしようとすると、同じ内容のファイルを2つ置くか、それを避けたい場合には (よっぽど短くなければ基本避けたい) 少し工夫する必要がある。

これもドキュメントにやり方が書いてある、以上。という話ではあるのだが、どうにも面倒なやり方をしているように思えたので、少し違う方法を使うことにした。

というのも、ドキュメントに従って template を使う場合、nvim 以下の4つのファイルを配置するのに3箇所に記述する必要がある。.tmpl.chezmoitemplates のファイルを参照するだけではあるが、面倒ではある。

src
├── AppData
│   └── Local
│   └── nvim
│   ├── dein_lazy.toml.tmpl
│   ├── dein.toml.tmpl
│   ├── ginit.vim.tmpl
│   └── init.vim.tmpl
├── .chezmoiignore
├── .chezmoitemplates
│   └── nvim
│   ├── dein_lazy.toml
│   ├── dein.toml
│   ├── ginit.vim
│   └── init.vim
└── dot_config
   └── nvim
      ├── dein_lazy.toml.tmpl
      ├── dein.toml.tmpl
      ├── ginit.vim.tmpl
      └── init.vim.tmpl

template ではなく include を使うようにして、2箇所のうち片方には設定ファイルの実体、もう片方は include するだけの .tmpl としてあげれば、2箇所の記述のみで済ませられる。以下の例だと、dot_config 以下にはファイルの実体を置いていて、AppData 以下では dot_config 以下のファイルを include している。

src
├── AppData
│   └── Local
│   └── nvim
│   ├── dein_lazy.toml.tmpl
│   ├── dein.toml.tmpl
│   ├── ginit.vim.tmpl
│   └── init.vim.tmpl
├── .chezmoiignore
└── dot_config
   └── nvim
      ├── dein_lazy.toml
      ├── dein.toml
      ├── ginit.vim
      └── init.vim
dot_config/nvim/init.vim
" 普通の init.vim
set ...
...
AppData/Local/nvim/init.vim.tmpl
{{- include "dot_config/nvim/init.vim" -}}

.chezmoiignoretemplate を使う場合と同様でよい。

.chezmoiignore
{{ if eq .chezmoi.os "windows" -}}
.config/nvim
{{ else -}}
AppData
{{ end -}}

設定を配置する2箇所の記述が非対称で美しくないという人もいるかもしれないが、個人的には記述が少ないほうがうれしいかなと思っている。好みの問題といえばそうかもしれない。


Related articles