UNIX 系の OS で、ちょっと悩ましいのは $HOME(ホームディレクトリ)にドットファイルが増えてしまうことです。
ls -a
すると表示されるリストの8割以上がドットファイルとか、もう許して下さいな感じです。
% ls -a
. .aliases~ .dbus .hgignore .profile .xinitrc .zshrc~ __pycache__
.. .bash_history .dir_colors .hgignore~ .python_history .xprofile Desktop bin
.ICEauthority .bash_logout .dmrc .hgrc .ssh .xsession-errors Documents build
.Xauthority .bash_profile .esd_auth .hgrc~ .texlive .xsession-errors.old Downloads work
.Xclients .bashrc .gem .lesshst .thumbnails .zcompdump Music
.Xmodmap .cache .gkrellm2 .local .thunderbird .zsh Pictures
.Xmodmap.orig .chrome-remote-desktop-session .gnupg .mozc .vim .zshenv Public
.Xmodmap~ .chrome-remote-desktop-session~ .gvimrc .mozilla .vimrc .zshenv~ Templates
.aliases .config .hg .pki .wget-hsts .zshrc Videos
編集した結果バックアップファイルやらコピーを残してるのやらありますが、まあざっとこんな感じ。もうちょっと整理して数を減らしたいところです。
このときに頼りになるのが
XDG Base Directory Specification。それを規格から実装に照らして説明してくれているのが
こちら。
なので一つ一つやっていきます。環境は Manjaro Linux XFCE 版なので、他のディストロは適当に読み替えてください。
システム
システム側であらかじめ設定されているのは以下の環境変数です。
XDG_SESSION_ID=c5
XDG_RUNTIME_DIR=/run/user/1000
XDG_SESSION_TYPE=tty
XDG_SESSION_CLASS=user
また、ユーザ側で設定しておきたいのは以下の環境変数です。
XDG_CONFIG_HOME=$HOME/.config
XDG_CACHE_HOME=$HOME/.cache
XDG_DATA_HOME=$HOME/.local/share
XDG_RUNTIME_DIR はユーザごとに設定される /var/run みたいなものです。デフォルトではユーザIDが振られています。必要なら設定すればよいでしょう。
それとは別に、
/etc/xdg
に設定ファイルがいくつか置かれています。ただしこれらは ssh ログイン時などには読み込まれないようなので、ここでは置いておきます。
ここでは、お仕着せでシステムワイドに設定する方向で進めていきます。
bash
まずは標準の shell の bash。Manjaro の場合には、次の順序で読み込まれるようです。
bash -l -v
で確認しました。つまりログインシェルの場合。
- /etc/profile
- /etc/profile.d/*.sh
/etc/profile から呼ばれる。アルファベット順に読み込まれる。アプリケーションごとに必要な設定はここ。ロケールもここ。
- /etc/bash.bashrc
/etc/profile から呼ばれる。システムワイドの bash 設定を行う。プロンプトや $TERM の設定はここ。
- /usr/share/bash-completion/bash_completion
もしあれば読み込まれる。Manjaro にはない。
- $HOME/.bash_profile
$HOME/.bashrc を source しているだけ。
- $HOME/.bashrc
ユーザの環境変数とか alias とかいろいろと設定する。
- プロンプトが表示されて bash 起動完了。
- $HOME/.bash_logout
ログアウト時に読み込まれる。何もしていない。
- /etc/bash.bash_logout
ログアウト時に読み込まれる。何もしていない。
bash の場合にはユーザごとのドットファイルはハードコードされているようなので、ドットファイル類を
.config/bash
に移動することは(現状では)できません。ただ、他のアプリケーションのための設定は必要なので、ここでは /etc/profile.d/xdgenv.sh あたりで XDG ユーザ変数を設定するようにすればよいでしょう。そうすることで他の shell からも source することができます。
/etc/profile.d/xdgenv.sh:
# Set user variables based on XDG Base Directory Specification.
#
export XDG_CONFIG_HOME=$HOME/.config
export XDG_CACHE_HOME=$HOME/.cache
export XDG_DATA_HOME=$HOME/.local/share
zsh
zsh では環境変数 ZDOTDIR が設定されているとそこを見に行きます。
- /etc/zsh/zshenv
本来は /etc/zshenv を読みにいく(manページの説明)ようだが、Manjaro では /etc/zsh/zshenv を読みにいく。
- $ZDOTDIR/.zshenv
環境変数 ZDOTDIR が指定されていれば $ZDOTDIR/.zshenv を、指定されていなければ $HOME/.zshenv を読む。
- /etc/zsh/zprofile
Manjaro では /etc/zsh/zprofile の中身は emulate sh -c 'source /etc/profile'
となっていて、/etc/profile を読み込む。/etc/profile の読み込むものは bash と同じ。
- $ZDOTDIR/.zprofile
ZDOTDIR が指定されていなければ $HOME/.zprofile を読み込む。
- /etc/zsh/zshrc
- $ZDOTDIR/.zshrc
- /etc/zsh/zlogin
ログインシェルの場合に読み込まれる。
- $ZDOTDIR/.zlogin
ログインシェルの場合に読み込まれる。
- プロンプトが表示されて bash 起動完了。
- $ZDOTDIR/.zlogout
ログアウト時に読み込まれる。何もしていない。
- /etc/zsh/zlogout
ログアウト時に読み込まれる。何もしていない。
ということなので、bash のところで /etc/profile.d/xdgenv.sh を作成していれば、XDG* はそこで設定されます。また、/etc/zsh/zshenv があれば一番最初に読み込まれるので、ZDOTDIR をそこで設定すればいいのですが、
ZDOTDIR=$XDG_CONFIG_HOME/zsh
とする必要があるため、二重に読み込むことになりますが以下のようにします。
# /etc/zsh/zshenv
# set ZDOTDIR respecting XDG Base Directory Specification
#
emulate sh -c 'source /etc/profile'
export ZDOTDIR=$XDG_CONFIG_HOME/zsh
また、標準ではコマンドヒストリは $HOME/.zsh/histfile に保存されますが、これを $XDG_CACHE_HOME/zsh/history に変更します。コマンドヒストリはユーザ設定なので、これは $XDG_CONFIG_HOME/zsh/.zshrc で設定し直します。
$XDG_CONFIG_HOME/zsh/.zshrc:
HISTFILE=$XDG_CACHE_HOME/zsh/hisotry
zstyle :compinstall filename '$ZDOTDIR/.zshrc'
これで $HOME から zsh 関連のドットファイルは削除できます。
git
0d94427eから XDG_CONFIG_HOME に対応しているので、$XDG_CONFIG_HOME/git/config を使います。
Neovim
Neovim は最初から XDG Base Directory Specification に沿うように作られているので、$XDG_CONFIG_HOME/nvim を利用すれば問題ありません。
ここで、vim からも同じ設定を使えるように init.vim などを記述しておくと、nvim でも vim でも同じように使えます。
vim
vimはちょっとややこしいです。前述の ArchLinux の Wiki に書いてあるように、.vimrc などは基本的にハードコードされています。が、別途
VIMINIT=":source $XDG_CONFIG_HOME"/vim/vimrc
を shell の設定時に行っておけば、vim の起動時に $VIMINIT を参照してくれます。
なので $ZDOTDIR/.zshenv に設定しておきます。ここでは vim と nvim の設定を共通にすることを考えているので、あえて $XDG_CONFIG_HOME/nvim/vimrc にします。ただし、undodir などが一緒になると問題があるかもしれないので、そこは別にしておきます。Manjaro の場合には vim は標準ではインストールされていなくて、ex および vi が標準なので、あえて vim をインストールせずに
alias vim=nvim
するのもアリかもしれません。
# .zshenv
PATH1=$HOME/bin
export PATH=$PATH:$PATH1
export QT_SELECT=5
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx
# better yaourt colors
export YAOURT_COLORS="nb=1:pkg=1:ver=1;32:lver=1;45:installed=1;42:grp=1;34:od=1;41;
5:votes=1;44:dsc=0:other=1;35"
# env for locate updatedb for local files.
export PRUNEPATHS="`echo $HOME/.cache/[a-ce-z]*`"
export PRUNEPATHS="`find $HOME -name \".hg\" -printf \"%p \"` $PRUNEPATHS"
export PRUNEPATHS="$HOME/.mozilla $HOME/.dbus $HOME/.thumbnails $HOME/.thunderbird $
PRUNEPATHS"
export LOCATE_PATH=$XDG_CACHE_HOME/mlocate.db
export VIMINIT=":source $XDG_CONFIG_HOME"/nvim/vimrc
また、vimrc は以下の内容にします。
" vim:set et ts=2 sts=2 sw=2 tw=0 fenc=utf-8:
" _vimrc : initialization file for Vim.
" just source init.vim for commonnization.
"
" Modified: 9 Apr 2018
"
source $XDG_CONFIG_HOME/nvim/init.vim
" mswin.vim maps those keys when gui=yes.
" this is terrible and should be unmapped.
if has('gui')
unmap <C-f>
iunmap <C-f>
cunmap <C-f>
unmap <C-h>
iunmap <C-h>
cunmap <C-h>
endif
mercurial
$HOME/.hgrc は $XDG_CONFIG_HOME/hg/hgrc に移動することができます。が、.hgignore はそのディレクトリ以下の ignore ファイルを指定しているため、移動できません。また .hg ディレクトリはリポジトリのため、移動できません。
その他
.ICEauthority
libice が作成するファイルですが、
Use XDG base directory instead of $HOME for .ICEauthorityで議論され、パッチがあげられ、2019年3月25日に push されているので、いずれマージされるでしょう。
それまでは触らないでおくか、
export ICEAUTHORITY="$XDG_RUNTIME_DIR"/ICEauthority
を /etc/zsh/zshenv あたりに入れておけばよいでしょう。ただ、環境変数がやたら増えるのも困りものですから、ここでは放置しておきます。
.Xauthority
同上です。
export XAUTHORITY="$XDG_RUNTIME_DIR"/Xauthority
.Xmodmap
対応策はなさそうです。
.dircolors
source "$(dircolors "$XDG_CONFIG_HOME"/dircolors)"
を $ZDOTDIR/.zshenv あたりに入れておきます。bash のほうは $HOME/.bashrc のdircolors に関する部分の変更が必要です。
.mozc
移動できません。ソースを見ましたが、XDG_CONFIG_HOME を参照している部分はありませんでした。
.mozilla(firefox)
$XDG_CONFIG_HOME/mozilla と $XDG_CACHE_HOME/mozilla と $XDG_DATA_HOME/mozilla がある場合にはそちらを使うようです。
なので、以下のようにします。
$ mkdir .config/mozilla
$ mkdir .cache/mozilla
$ mkdir .local/share/mozilla
$ chmod 700 .config/mozilla .cache/mozilla .local/share/mozilla
.python_history
Python がインタラクティブモードで起動されると readlline が作成するようです。今のところ移動できません。
.texlive
ハードコードされているようで変更できません。
.thumbnails
$XDG_CACHE_HOME/thumbnails/ があればそちらを使うようです。
.thunderbird
ハードコードされているようで変更できません。
.xinitrc
基本的には DesktopManager(lightdmやgdmなど)を使っていれば xinit を呼ぶことはないので不要なはずですが、
export XINITRC="$XDG_CONFIG_HOME"/X11/xinitrc
を指定することで xinit は参照してくれます。
.gnupg
export GNUPGHOME="$XDG_CONFIG_HOME"/gnupg
することで参照してくれます。