dotfilesについて
*nix系のOSでは、例えば~/.vimrc
や~/.bashrc
のように、いくつかのアプリケーションのユーザーごとの設定ファイルはホームディレクトリ直下に隠しファイルとして置いておくことが多いです。
これらをdotfiles
と呼ぶことが多いですが、これらをGitHubなどで管理すること自体は珍しいことではないかもしれません。
Qiitaの中にもたくさんの記事が上がっており、どれも参考になると思います。
GitHubで「dotfiles」で検索を掛けるとたくさんのリポジトリが引っかかり、よく眺めるとおもしろい発見が多いと思います。
dotfileの管理について
dotfilesリポジトリを作って中にファイルを放り込むだけではなく、これを他のPCに移った際などにも再利用しやすくする必要があります。具体的には、リポジトリ内の特定のファイルのシンボリックリンクを、$HOME
以下に張っていく必要があります。
多くの方がこれを自動化するために自分でスクリプト等を書いているのですが、新たにファイルを追加する手間などもあって、この部分が障壁になっているようにも感じられます。
そこで、拙作ですが以下のdotfilesマネージャを紹介します。
実は前にも紹介したのですが、あまりにも投げっぱなしで説明不足だったので、再度宣伝を兼ねて紹介します。
特徴
このスクリプトを使用すると何が嬉しいかというと、他のdotfiles管理フレームワークとの比較で言えば
- シェルスクリプトで書かれており、環境依存度が低い
- 導入コストが低い(gitにのみ依存: 1と関連)
- GitHub上でのディレクトリ構造や名前は任意のものにできる(対応関係をテキストファイルに書き起こしているため)
- dotfiles以外のファイルも対象に出来る(つまりプライベートなファイルだけDropboxで管理,みたいなことができる)
でしょうか。
インストール
適当な場所にクローンしてきて、bashrc
やzshrc
からsourceすることによって使用できます。
zsh
の場合、$fpath
に追加することで補完機能も有効になります。
- ~/.bashrc
source ~/.bash/plugins/dot/dot.sh
- ~/.zshrc
source ~/.zsh/plugins/dot/dot.sh
fpath=(~/.zsh/plugins/dot $fpath)
# autoload -U compinit
# compinit
zgenやzplugなどのzshプラグインマネージャを使っていれば、さらに簡単にインストールできます。
- zgen
zgen load ssh0/dot
- zplug
zplug "ssh0/dot", use:"*.sh"
詳しくはREADMEを参照してください。
使う前の設定
~/.bashrc
や~/.zshrc
に、以下のように自分のdotfilesリポジトリのURLと、そのリポジトリをクローンしてきたディレクトリ名を設定します。
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
の書き方についてですが、","で区切られた左側がシンボリックリンクではなく実体のファイルのあるパス、右側がシンボリックリンクを張られる先となっています。
例えば
vimfiles/vimrc,.vimrc
は、$DOT_DIR/vimfiles/vimrc
というファイルから$HOME/.vimrc
へリンクが張られるべきであることを記述しています。
"/"で始まるパスを指定した時には絶対パスとして扱われ、これが省略されているものは、頭に$DOT_DIR/
や$HOME/
が付いたものとして解釈されます。
また、環境変数は展開されて解釈されるので、
$HOME/Dropbox/conf/netrc,.netrc
としたり、OSごとに変わる環境変数(例では$OS
)によってディレクトリを分けておいて、
vimfiles/${OS}/vimrc,.vimrc
のような使い方もできます。
また、
dot check
でdotlink
で記述されている対応関係になっているかどうかが確認できます。
参考までに自分のdotlinkはこんな感じ。
新しい環境で自分の設定を復元する場合
- git, dotのインストール
- 以下の環境変数を自分のリポジトリにあわせて設定
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
ファイルに以下のように追記されます。
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間で設定を共有することができます。
例:
$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
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
コマンドを実行すると上に書いた設定ファイルが読み込まれるようにしておくと便利です。
alias dot-someone="dot -c $HOME/.config/dot/dotrc-someone"
あとは通常のdot
コマンドと同じように使うことができます。
dot-someone edit
を実行してシンボリックリンクの対応を書き,dot-someone set
を実行して実際にシンボリックリンクを張ってください。
set
コマンドやpull
コマンドなど,すべての設定ファイルをそれぞれ読み込んで実行したい場合もあると思うので,以下のような関数を用意すると便利かもしれません。
dotconfigs=("file1" "file2" "file3")
dotall() {
for dotconfig in ${dotconfigs[@]}; do
dot -c "${dotconfig}" "$@"
done
}
zshで補完を有効にするには
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,...