できるだけドットファイルがホームディレクトリに並ばないようにする設定 (OS X Mavericks)

Mac や Linux を使っていると、気付いたらホームディレクトリ以下がドットファイルだらけに・・・
まあ、ホームディレクトリで ls -a とかやらなければわからないんだけど。
それでも放置するのはあまり気分が良くないので、ちょっと整理してみた。

zsh 関連
---
自分の環境では、以下の zsh 関連のドットファイルが存在した。

* .zsh_history
* .zcompdump
* .zshenv
* .zshrc

まず、.zsh_history と .zcompdump は .zshrc で

```zsh:.zshrc
HISTFILE=~/.dots/zsh/history
...
autoload -U compinit
compinit -d ~/.dots/zsh/compdump
```

とすることで ~/.dots/zsh 以下に移動した。
次に、.zshrc と .zshenv も ~/.dots/zsh 以下に移動して、
ホームディレクトリに .zshenv を再度作成し、

```zsh:.zshenv
export ZDOTDIR=${HOME}/.dots/zsh
source ${ZDOTDIR}/.zshenv
```

のように記述することで、~/.dots/zsh 以下のドットファイルが読み込まれるように設定した。
なお、この ~/.zshenv はログイン時にのみ読み込まれ、
それ以降は ~/.dots/zsh/.zshenv が読み込まれることとなる。
そのため、zsh がログインシェルになっていなければならない(たぶん)。

less 関連
---
ページャとして less を使っていると、.lesshst というファイルがホームディレクトリ以下に作成される。
これは less の検索などの履歴ファイルである。
less の設定は基本的に lesskey というものを使って行うのだが、
OS X 標準の less にはこの lesskey が存在しない (´・ω・｀)
なので、homebrew でいい感じの less をインストールする。

```bash
brew tap homebrew dupes
brew install less
```

新しくインストールした方の less を使うように ~/.dots/zsh/.zshenv を修正し、
また、less の設定ファイルの場所を指定する。

```zsh:~/.dots/zsh/.zshenv
export PATH=${HOME}/bin:/usr/local/bin:${PATH}
export LESSKEY=${HOME}/.dots/less/less
```

less の設定ファイルのソースファイル lesskey を記述する。

```lesskey:~/.dots/less/lesskey
#command
#line-edit
#env
LESSHISTFILE = ~/.dots/less/lesshist
```

less を source-highlight を利用して色付けする。
source-highlight は homebrew でインストールしたものを用いる。

```lesskey:~/.dots/less/lesskey
#env
...
LESSOPEN     = | /usr/local/bin/src-hilite-lesspipe.sh %s
```

ついでにキーバインドも設定しておく。

```lesskey:~/.dots/less/lesskey
#line-edit
^B    left
^F    right
^D    delete
^H    backspace
^A    home
^E    end
^P    up
^N    down
^K    kill-line
```

更についでに、less のオプションの設定もしておく。

```lesskey:~/.dots/less/lesskey
#env
...
LESS = -i -q -x2 -N -R
```

ちなみに、それぞれのオプションの意味は、

* -i : 大文字小文字を区別しないで検索。ただし検索パターンに大文字を含む場合は区別する。
* -q : あまりアラートを鳴らさない。
* -x2: タブ幅を2にする。
* -N : 行番号を表示する。
* -R : ANSI Color のエスケープシーケンスを色表示する

less の設定ファイルは設定ファイルとしては珍しく、バイナリとなっている。
そのため lesskey をコンパイルする必要がある。

```
lesskey ~/.dots/less/lesskey
```

emacs 関連
---
.emacs.d についてはぶっちゃけこのままのほうがわかりやすいので、このままで良いものとする。
私の環境上では、emacs に関連するドットファイルは .emacs.d 以外に .recentf と .terminfo があったため、今回はこれらを移動する。

.recentf の移動は非常に簡単で、~/.emacs.d/init.el に以下の様な記述を加えるだけで良い。

```el:~/.emacs.d/init.el
(setq recentf-save-file "~/.dots/recentf")
(recentf-mode 1)
```

.terminfo は ansi-term や multi-term 上で zsh を動かすと、プロンプトの前に 4m という文字が出てしまう症状を直すのに必要なファイルである。
このファイルを検索するディレクトリは TERMINFO 環境変数で指定される。
そのため作成した terminfo を .dots 以下に置き、適切に環境変数を設定すれば良い。

```zsh:~/.dots/zsh/.zshrc
if [ "$EMACS" ];then
  export TERM=xterm-256color
  export TERMINFO=~/.dots/terminfo
fi
```

しかしよく考えれば、わざわざ terminfo を作成したりせずともこれでよかった気がする。

```zsh:~/.dots/zsh/.zshrc
if [ "$EMACS" ];then
  export TERM=xterm-256color
  export TERMINFO=/usr/share/terminfo
fi
```

sbt 関連
---
一念発起して sbt を使ってみようかと思い、インストール & 実行してみたら、こいつも複数のドットファイルを参照する事が判明。具体的には、

* .sbtconfig
* .sbt/
* .ivy2/

このうち、.sbt と .ivy2 については .sbtconfig から変更することが可能であった。

```bash:.sbtconfig
# ヒープ・スタック領域
heap_max="-Xmx1536M"
heap_default="-Xms512M"
max_perm_size="-XX:MaxPermSize=384M"
stack_size="-Xss1M"

# 設定ファイル等の場所
settings_dir="-Dsbt.global.base=${HOME}/.dots/sbt"
boot_dir="-Dsbt.boot.directory=${HOME}/.dots/sbt/boot"
repos_dir="-Dsbt.repository.config=${HOME}/.dots/sbt/repos"
ivy_repos="-Dsbt.ivy.home=${HOME}/.dots/ivy2"

# その他
encoding="-Dfile.encoding=UTF-8"
unload_enable="-XX:+CMSClassUnloadingEnabled"

export SBT_OPTS="${heap_max} ${heap_default} ${max_perm_size} ${stack_size} ${encoding} ${settings_dir} ${boot_dir} ${repos_dir} ${ivy_repos} ${unload_enable}"
```

.sbtconfig の場所を変えられないかどうかチェックしようと思い、sbt の実行スクリプトを見てみたところ、
以下のような非常に単純なシェルスクリプトであった。

```bash:/usr/local/bin/sbt
#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.13.1/libexec/sbt-launch.jar "$@"
```

なので、これをラップした単純なシェルスクリプトを書いて、~/bin 以下に配置することで強引に .sbtconfig の位置を無理矢理変えてみた。(あまりおすすめできない方法だが)

```bash:~/bin/sbt
#!/bin/bash
test -f ~/.dots/sbt/config && . ~/.dots/sbt/config
exec /usr/local/bin/sbt
```

かなり強引な方法 (あまりよい方法ではない)
---
一部のドットファイルは正攻法ではどうにもならなかった。
例えば、.latexmkrc は latexmk の設定ファイルだが、これは latexmk のソースコードにパスが直書きされているため、設定ファイルの場所を置き換えることができない。

そのため、latexmk をラップしたシェルスクリプトを作り、そこで一時的に設定ファイルへのシンボリックリンクをホームディレクトリ以下に作って終了時に削除することで、強引にドットファイルを .dots 以下に移動させた。

```bash:~/bin/latexmk
#!/bin/bash
if [ ! -r ${HOME}/.latexmkrc ] ; then
  ln -s ${HOME}/.dots/latex/latexmkrc ${HOME}/.latexmkrc
  trap "rm ${HOME}/.latexmkrc" EXIT
  /usr/texbin/latexmk $@
else
  /usr/texbin/latexmk $@
fi
```

trap を利用することで、abort したときなどでもシンボリックリンクが消えるようになっている。

ちなみに、latexmk の場合は設定を設定ファイルに書かずに、それらの設定をオプションとして記述したものを latexmk のエイリアスにするという手法も存在する。