dotfilesマネージャdotの紹介

dotfilesについて
================

*nix系のOSでは、例えば`~/.vimrc`や`~/.bashrc`のように、いくつかのアプリケーションのユーザーごとの設定ファイルはホームディレクトリ直下に隠しファイルとして置いておくことが多いです。
これらを`dotfiles`と呼ぶことが多いですが、これらをGitHubなどで管理すること自体は珍しいことではないかもしれません。

Qiitaの中にも[たくさんの記事](http://qiita.com/search?q=dotfiles)が上がっており、どれも参考になると思います。
GitHubで「dotfiles」で検索を掛けると[たくさんのリポジトリ](https://github.com/search?q=dotfiles)が引っかかり、よく眺めるとおもしろい発見が多いと思います。



dotfileの管理について
=====================

dotfilesリポジトリを作って中にファイルを放り込むだけではなく、これを他のPCに移った際などにも再利用しやすくする必要があります。具体的には、リポジトリ内の特定のファイルのシンボリックリンクを、`$HOME`以下に張っていく必要があります。

多くの方がこれを自動化するために自分でスクリプト等を書いているのですが、新たにファイルを追加する手間などもあって、この部分が障壁になっているようにも感じられます。

そこで、拙作ですが以下のdotfilesマネージャを紹介します。

* [ssh0/dot](https://github.com/ssh0/dot/blob/master/README_ja.md)

実は[前にも紹介した](http://qiita.com/ssh0/items/c1c74cce46bbc09e8004)のですが、あまりにも投げっぱなしで説明不足だったので、再度宣伝を兼ねて紹介します。

特徴
====

このスクリプトを使用すると何が嬉しいかというと、他のdotfiles管理フレームワークとの比較で言えば

1. シェルスクリプトで書かれており、**環境依存度が低い**
1. 導入コストが低い(gitにのみ依存: 1と関連)
1. GitHub上での**ディレクトリ構造や名前は任意**のものにできる(対応関係をテキストファイルに書き起こしているため)
1. dotfiles以外のファイルも対象に出来る(つまり**プライベートなファイルだけDropboxで管理**，みたいなことができる)

でしょうか。

インストール
==========

適当な場所にクローンしてきて、`bashrc`や`zshrc`からsourceすることによって使用できます。
`zsh`の場合、`$fpath`に追加することで補完機能も有効になります。

* ~/.bashrc

```bash:~/.bashrc
source ~/.bash/plugins/dot/dot.sh
```

* ~/.zshrc

```zsh:~/.zshrc
source ~/.zsh/plugins/dot/dot.sh

fpath=(~/.zsh/plugins/dot $fpath)
# autoload -U compinit
# compinit
```

[zgen](https://github.com/tarjoilija/zgen)や[zplug](https://github.com/b4b4r07/zplug)などのzshプラグインマネージャを使っていれば、さらに簡単にインストールできます。

* zgen

```zsh:~/.zshrc
zgen load ssh0/dot
```

* zplug

```zsh:~/.zshrc
zplug "ssh0/dot", use:"*.sh"
```

詳しくは[README](https://github.com/ssh0/dot/blob/master/README_ja.md)を参照してください。



使う前の設定
-----------

`~/.bashrc`や`~/.zshrc`に、以下のように自分のdotfilesリポジトリのURLと、そのリポジトリをクローンしてきたディレクトリ名を設定します。

```bash:shellrc
export DOT_REPO="https://github.com/your_username/dotfiles.git"
export DOT_DIR="$HOME/.dotfiles" # <- デフォルト値
```

使い方
======

## 既に自分のdotfilesリポジトリを持っている人がdotを使いはじめる場合

今dotfilesをGitHubで管理していて、ホームディレクトリ以下にはシンボリックリンクがすでに貼ってある人の場合、

```shell-session
dot edit
```

を実行すると、`$DOT_DIR`で指定したディレクトリに`dotlink`という名前のファイルが生成されます。

あとはこのファイルにリンクの対応関係を書くだけで大丈夫です。
既にdotfilesを管理している人であれば、この対応表を作ることは簡単だと思います。

あるいは、

```shell-session
dot add LINK1 LINK2 LINK3
```

のように、シンボリックリンクを引数に取ると(複数指定可)、その参照先との対応関係が`dotlink`に追記されていきます。

`dotlink`の書き方についてですが、","で区切られた左側がシンボリックリンクではなく実体のファイルのあるパス、右側がシンボリックリンクを張られる先となっています。

例えば

```bash:dotlink
vimfiles/vimrc,.vimrc
```

は、`$DOT_DIR/vimfiles/vimrc`というファイルから`$HOME/.vimrc`へリンクが張られるべきであることを記述しています。

"/"で始まるパスを指定した時には絶対パスとして扱われ、これが省略されているものは、頭に`$DOT_DIR/`や`$HOME/`が付いたものとして解釈されます。

また、環境変数は展開されて解釈されるので、

```bash:dotlink
$HOME/Dropbox/conf/netrc,.netrc
```

としたり、OSごとに変わる環境変数(例では`$OS`)によってディレクトリを分けておいて、

```bash:dotlink
vimfiles/${OS}/vimrc,.vimrc
```

のような使い方もできます。

また、

```shell-session
dot check
```

で`dotlink`で記述されている対応関係になっているかどうかが確認できます。

参考までに自分のdotlinkはこんな感じ。

* [dotfiles/dotlink at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/blob/master/dotlink)

## 新しい環境で自分の設定を復元する場合

1. git, dotのインストール
2. 以下の環境変数を自分のリポジトリにあわせて設定

```bash
export DOT_REPO="https://github.com/your_username/dotfiles.git"
export DOT_DIR="$HOME/.dotfiles"
```

その後、以下のコマンドを実行すれば完了です。

```shell-session
dot clone && dot set -v
```

## 新しいファイルをdotfilesとして管理したい場合

新たにdotfilesに追加したいファイルがあるときには、

```shell-session
dot add FILE $DOT_DIR/path/to/store/the/file
```

としてやれば、大雑把に言えば

```shell-session
mv FILE $DOT_DIR/path/to/store/the/file
ln -s $DOT_DIR/path/to/store/the/file FILE
```

をしたことと同じになり、この対応関係が`dotlink`ファイルに以下のように追記されます。

```bash:dotlink
path/to/store/the/file,
```

## 複数のPC間で設定を共有する場合

複数のPC間で、自分の設定を共有させたい場合にも、当然便利に使えます。`dot`を使って管理していれば、`dot update`でdotfilesを最新の状態に更新することができ、新しく追加したいファイルがあれば`dot add`したあと、gitリポジトリとしてcommit,pushすれば良いです。

ここでは詳しく書きませんが、[README](https://github.com/ssh0/dot/blob/master/README_ja.md)で書かれているように、ローカルな設定ファイルを読み込むこともできるので、PCごとに違うファイルが読み込まれるように設定することもできます。

また、GitHubリポジトリの中では好きなディレクトリ構成にできるので、機能毎にまとめたり、OSごとの設定でディレクトリをまとめたり(前述しました)と、ファイルの数が多くなりすぎて見通しが立たない、ということが少なくなります。

## プライベートな情報を含むファイルを管理したい時

`~/.netrc`や、ログイン情報・APIキーの書かれたファイルはGitHubのpublicリポジトリにあげることができませんが、このスクリプトを使えばdotfilesリポジトリ以外のファイルも管理対象にすることができるので、Dropboxに対象となるファイルを保存し、複数のPC間で設定を共有することができます。

例:

```bash:dotlink
$HOME/Dropbox/conf/netrc,.netrc
```

## あるファイルをdotfilesの管理から外したい時

今使っている環境では別の設定ファイルに切り替えたい時には

```shell-session
dot unlink FILE
```

とすれば、

```shell-session
unlink FILE
cp $DOT_DIR/path/to/FILE FILE
```

が実行されます。unlinkしたあとに元ファイルを探す手間が省けます。

リポジトリ自体から消したい場合には、普通に

```shell-session
cd $DOT_DIR
git rm path/to/FILE
```

してから`dot edit`で該当行を削除してください。

## 読み込む設定ファイルを指定したい場合

オプション`-c, --config`を使えば，指定したファイルを設定ファイルとして読み込んでコマンドを実行できます。

**想定しているシチュエーション**

* 各アプリケーション毎の設定ファイルを違うリポジトリで管理している場合
* 他の人のdotfilesの一部を引用してくる場合
* など ...

具体的に他の人のdotfilesを使用する場合，以下のようなファイルを作成しておきます(このファイル自体を自分のdotfilesリポジトリ内で管理しておくと便利かもしれません)。

ファイル名: `~/.config/dot/dotrc-someone`

```bash:~/.config/dot/dotrc-someone
clone_repository=https://github.com/someone/dotfiles.git
dotdir=$HOME/.dotfiles-someone
dotlink=$HOME/.config/dot/dotlink-someone
linkfiles=("$HOME/.config/dot/dotlink-someone")
```

`bashrc`や`zshrc`などに以下のように書いておき，`dot-someone`コマンドを実行すると上に書いた設定ファイルが読み込まれるようにしておくと便利です。

```bash:shellrc
alias dot-someone="dot -c $HOME/.config/dot/dotrc-someone"
```

あとは通常の`dot`コマンドと同じように使うことができます。

`dot-someone edit`を実行してシンボリックリンクの対応を書き，`dot-someone set`を実行して実際にシンボリックリンクを張ってください。

`set`コマンドや`pull`コマンドなど，すべての設定ファイルをそれぞれ読み込んで実行したい場合もあると思うので，以下のような関数を用意すると便利かもしれません。

```bash:shellrc
dotconfigs=("file1" "file2" "file3")

dotall() {
  for dotconfig in ${dotconfigs[@]}; do
    dot -c "${dotconfig}" "$@"
  done
}

```

zshで補完を有効にするには

```zsh:~/.zshrc
compdef dotall=dot_main
```

の行を追加することを忘れないようにしてください。

まとめ
======

dotfilesの管理用ツール[dot](https://github.com/ssh0/dot/blob/master/README_ja.md)を紹介しました。

GitHubでdotfilesを管理するというのは、PCがぶっ壊れたときの保険となるだけでなく、変更履歴が残り、それがコミットメッセージという形でコメントをつけて保存していくことが出来るという点ですぐれていると感じます。

また、Gitの使い方自体に慣れるという側面もあるように感じています。

もし『dotfilesをGitHubで管理しようと思っているけれど、自動化スクリプト書くのメンドイ・・・』という方は、ぜひ使ってみてください。

番外編
======

僕のdotfilesです。
使っているOSはGNU/Linux Ubuntu 14.04です。

* [ssh0/dotfiles](https://github.com/ssh0/dotfiles)

![ssh0/dotfiles/screenshots/screenshot.png](https://raw.githubusercontent.com/ssh0/dotfiles/master/screenshots/screenshot.png)

内容としては、

* タイル型ウィンドウマネージャ[XMonad](http://xmonad.org/)
    * [xmonad.hs](https://github.com/ssh0/dotfiles/blob/master/xmonad/xmonad.hs)
* zsh
    - [zshrc](https://github.com/ssh0/dotfiles/blob/master/zshfiles/zshrc)
    - [補完関数たち](https://github.com/ssh0/dotfiles/tree/master/zshfiles/completions)
    - [べんり関数たち](https://github.com/ssh0/dotfiles/tree/master/zshfiles/functions)
* vim
    * [vimrc](https://github.com/ssh0/dotfiles/blob/master/vimfiles/vimrc)
* tmux
    * [tmux.conf](https://github.com/ssh0/dotfiles/blob/master/rcfiles/tmux.conf)

などの他、[シェルスクリプト](https://github.com/ssh0/dotfiles/tree/master/bin)やその他の雑多な設定が入っています。

cmus,compton,ipython,luakit,mpv,mutt,neovim,pandoc,peco,pyradio,ranger,tmuxinator,turses,tig,latexmk,tudu,...