XDG Base Directory 利用ノート

このページは他のツール系ノートからの参照されることを想定して執筆するものだ。

目的

Linux, WSL, Cygwin, MSYS2, MinGW 等のホームディレクトリー $HOME に散らかる各種アプリケーションのドットファイルを単一のリポジトリーに集約して Git などでバージョン管理したい。$HOME 直下をリポジトリーにするわけには一般的にはいかないが、[XDGSpec] に準拠しているアプリケーションのドットファイルに限定すれば、実現可能だ。

本稿の目標は、$HOME にあるドットファイル群を可能な限り専用ディレクトリーに再配置し、バージョン管理対象にすることだ。理想的には、$HOME 直下からドットファイルが一掃されるようになりたい。

概要

UNIX またはそれを祖先に持つ計算機では、ユーザー固有のアプリケーション構成はファイル名が . で始まるテキストファイルに定義され保存される伝統がある。この手のテキストファイルを ドットファイル と呼ぶ。アプリケーションによってはファイルではなくディレクトリーであることもある(そこに構成ファイルが複数収まる)。

昔はドットファイルを収めるサブディレクトリーを一つ作成し、$HOME 直下にそれらを参照するシンボリックリンクを作成して管理するふりをしていた。[XDGSpec] はその不便を解消する仕様とも考えられる。そのサブディレクトリーのほうを標準化すればいいという着想だ。

[XDGSpec] ではサブディレクトリーの直下にアプリケーションごとに専用のサブディレクトリーを置くことを許し、そこに関係ドットファイルを集約させる方針だ。ありがちなのは、環境変数 XDG_CONFIG_HOME に対して、ディレクトリー $XDG_CONFIG_HOME/appname 以下にアプリケーション appname に関するユーザー固有のドットファイル置かれるという状況だ。ここで、appname はアプリケーションが独自に定義する文字列であり、環境変数 XDG_CONFIG_HOME ユーザーがアクセスを許されるような絶対パスとする。

再配置作業

XDG 環境変数を定義する

上述の環境変数を対話シェルの初期化時に定義する。Bash ならファイル .bashrc のなるべく先頭に近い行に次のように記す:

export XDG_DATA_HOME=$HOME/.local/share
export XDG_CONFIG_HOME=$HOME/.config
export XDG_STATE_HOME=$HOME/.local/state
export XDG_CACHE_HOME=$HOME/.cache

上記のサブディレクトリー群が存在しなければ、それを mkdir -p する。

Note

簡単のため、本稿では XDG_CONFIG_HOME を中心に記し、他の XDG 変数についてはほとんど触れないことにする。詳しくは [XDGWiki] の関連記述を参照しろ。

既存のドットファイルを再配置する

[XDGWiki] の 2.2 節を眺めながら [XDGSpec] に対応しているアプリケーションのドットファイルを $HOME から $XDG_CONFIG_HOME のサブディレクトリーに順次再配置する。例えば Git のドットファイル $HOME/.gitconfig に対する手順は次のようなものだ:

$ cd
$ mkdir -p ./.config/git
$ mv .gitignore ./.config/git/config

上述資料の表にあるアプリケーションすべてに対応したとしても $HOME 直下にドットファイルがいくつか残る。[XDGWiki] 2.3 節にある項目については少々手間をかけて $XDG_CONFIG_HOME に順次移す。アプリケーション固有の環境変数を XDG 変数で定義するパターンが多い。その export は上述のシェル初期化ファイルで実行する。例えば Readline については:

export INPUTRC="$XDG_CONFIG_HOME"/readline/inputrc

.bashrc に記述しておき、ドットファイル .inputrc をサブディレクトリーに名前を変えたうえで再配置する:

$ cd
$ mkdir readline
$ mv .inputrc readline/inputrc

[XDGWiki] 2.4 節にあるアプリケーションは直接対応はしていないので、工夫できるものはそうするという態度だ。まったくお手上げのアプリケーションもあるが、オープンソースプロジェクトで開発しているものならば、XDG 対応を開発陣に依頼するという手もある。

バージョン管理を始める

$XDG_CONFIG_HOME 以下をまるごとバージョン管理する。バージョン管理というよりバックアップと復旧に対応するという意味が強い。Git を用いるならば GitHub などのリポジトリーホストにリモートリポジトリーを構築して同期させればよい。

上級者は計算機を複数使用するので、ドットファイルの集合をそれらで共有する目的でも使うようだ。

余談:自作プログラム

自分でプログラムを設計するときには、設定ファイルの仕様を [XDGSpec] に準拠することを誓う。ドットファイルを $HOME に直接置かせようものなら、プログラム使用者に不便をかける時代だ。

資料

当初は [XDGSpec] の読書ノートを執筆するつもりでいたが、[XDGWiki] で十分要約されているのでその必要がなくなった。本稿では具体的な作業内容に絞ることができた。