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