dotfilesマネージャdotの紹介


dotfilesについて

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

Qiitaの中にもたくさんの記事が上がっており、どれも参考になると思います。
GitHubで「dotfiles」で検索を掛けるとたくさんのリポジトリが引っかかり、よく眺めるとおもしろい発見が多いと思います。

dotfileの管理について

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

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

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

実は前にも紹介したのですが、あまりにも投げっぱなしで説明不足だったので、再度宣伝を兼ねて紹介します。

特徴

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

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

でしょうか。

インストール

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

  • ~/.bashrc
~/.bashrc
source ~/.bash/plugins/dot/dot.sh
  • ~/.zshrc
~/.zshrc
source ~/.zsh/plugins/dot/dot.sh

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

zgenzplugなどのzshプラグインマネージャを使っていれば、さらに簡単にインストールできます。

  • zgen
~/.zshrc
zgen load ssh0/dot
  • zplug
~/.zshrc
zplug "ssh0/dot", use:"*.sh"

詳しくはREADMEを参照してください。

使う前の設定

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

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

使い方

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

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

dot edit

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

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

あるいは、

dot add LINK1 LINK2 LINK3

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

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

例えば

dotlink
vimfiles/vimrc,.vimrc

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

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

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

dotlink
$HOME/Dropbox/conf/netrc,.netrc

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

dotlink
vimfiles/${OS}/vimrc,.vimrc

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

また、

dot check

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

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

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

  1. git, dotのインストール
  2. 以下の環境変数を自分のリポジトリにあわせて設定
export DOT_REPO="https://github.com/your_username/dotfiles.git"
export DOT_DIR="$HOME/.dotfiles"

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

dot clone && dot set -v

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

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

dot add FILE $DOT_DIR/path/to/store/the/file

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

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

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

dotlink
path/to/store/the/file,

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

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

ここでは詳しく書きませんが、READMEで書かれているように、ローカルな設定ファイルを読み込むこともできるので、PCごとに違うファイルが読み込まれるように設定することもできます。

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

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

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

例:

dotlink
$HOME/Dropbox/conf/netrc,.netrc

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

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

dot unlink FILE

とすれば、

unlink FILE
cp $DOT_DIR/path/to/FILE FILE

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

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

cd $DOT_DIR
git rm path/to/FILE

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

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

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

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

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

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

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

~/.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")

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

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

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

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

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

shellrc
dotconfigs=("file1" "file2" "file3")

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

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

~/.zshrc
compdef dotall=dot_main

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

まとめ

dotfilesの管理用ツールdotを紹介しました。

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

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

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

番外編

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

内容としては、

などの他、シェルスクリプトやその他の雑多な設定が入っています。

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