dotfilesの作成・拡張の参考になりそうなリソース集

## はじめに
ウダウダしているうちにdotfilesアドベントカレンダー10日目ギリギリです。
この記事は、私の独断と偏見でdotfiles作成・拡張の上で参考になりそうなものをピックアップしたものです。ディープなものは拾えていません。古くならないように1年に1回ぐらい見直しに来たいと思います（思うだけならタダ）。これおすすめというものがあれば、ぜひコメントや記事でご教示ください。


## 私の属性とdotfiles歴
dotfilesの用途は人それぞれだと思うので、あまりにも私と属性が異なる人には、この記事はあまり参考にならないかもしれません。

### 属性
- まだ経験5年そこらのWebアプリケーションのサーバサイド開発者
- OS: 主にmacOS。サブにUbuntuを持っている。
- シェル: Bash, Zsh
- エディタ: Vim (1年) -> Sublime Text 2/3 (Vim binding) (3.5年) -> VSCode (Vim binding) (0.5年)
- 言語: 主にRuby, Typescript, Rust, その他色々

ただ、[ときどき起こるVSCodeVimの祭り](https://github.com/VSCodeVim/Vim/issues/4342)（昨日）を見ると、やはりおとなしくVimを使って、VS CodeはMDやUML書くときのサブかなという気もしています。

### dotfiles歴
- 最初はなんとなく環境構築やアプリ構築用の一部のスクリプトをGistで書いてみたりしていた
- 2015年はじめに [Qiita - 最強の dotfiles 駆動開発と GitHub で管理する運用方法](https://qiita.com/b4b4r07/items/b70178e021bef12cd4a2) を読んで、開発者はみんなdotfilesというたまごっちの飼育や、タレの熟成に励んでいることを知り、自分でもZsh+Prezto・Vim・Sublimeあたりを中心に一から育て始めた
- 2019年中頃、開発環境を全て見直そうと思い、ツールやデバイスを選び直しつつ、 [Github - paulirish/dotfiles](https://github.com/paulirish/dotfiles) と [Github - atomantic/dotfiles](https://github.com/atomantic/dotfiles) をベースに新しいdotfilesを育て始めた

## 背景
### dotfilesは一から作らなくてもいいんだよ
一から作る人もいると思いますが、 [Zach Holman - Dotfiles Are Meant to Be Forked](https://zachholman.com/2010/08/dotfiles-are-meant-to-be-forked/) というタイトルの通り、dotfilesは一から作らなくてもいいんです。何を当たり前のことを思うかもしれませんが、意外にも、dotfilesを使っていない人や開発経験の浅い人の中には、自分でリポ作るところからはじめるという考えを持ってる人もいたりします。実際には、

- 他の人のdotfilesをそっくりそのまま使っている人
- 他の人のをフォークして好きなように拡張する人
- 色んなdotfilesの良いとこ取りをする人

という人も多いので気楽に試してみてほしいです。

最終的には生産性をあげることがdotfilesを利用する目的なので、気が乗らなくていつまでも入門できなかったり、dotfiles作成に多大な労力をかけてしまったりするぐらいなら、お気に入りのdotfilesを見つけてそのまま利用し、不便を感じたら都度拡張していく作戦でいくと良いと思います。

### 色々なdotfilesの情報がまとまっていたらうれしいかもしれない
そうすると、このdotfilesはこの環境で使えて、こんな特徴がある、こうやって使う、これが便利、というのが見つけやすいといいのですが、Githubで"dotfiles"と検索するだけで13万件近くヒットするし（もちろん絞り込むことはできるんですが）、あちこち個人のブログで俺のdotfilesはこんな感じ、ということが語られていて、あまり情報がまとまっていない気がします。そこで、少しまとめて始めてみようと思い、この記事を書きました。

## dotfiles作成・拡張に役立ちそうなリソース
### 全体像やbetter practicesを知るのに良いもの
- [Qiita - ようこそdotfilesの世界へ](https://qiita.com/yutakatay/items/c6c7584d9795799ee164)<br>今回のアドベントカレンダーのオーナーyutakatayさんによる記事です。dotfilesとはどんなもので、どうやって始めたらよいか、何をどう管理したら良いか、優しくわかりやすくdotfilesの福音をもたらしてくださいます。すでにdotfilesを使っている方も取り入れようと思うようなテクニックもあってとても良いです。
- [Grant Ammons - How to efficiently manage your dotfiles](https://grantammons.me/2017/11/26/efficiently-managing-dotfiles/)<br>
英語で書かれた記事には、一から最後まで浅くダラダラ説明する記事が多い中、大事なことが短くまとまっていてオリジナリティのある良記事だと思います。thoughtbotのdotfiles（後述）をおすすめしています。
- [Qiita - 最強の dotfiles 駆動開発と GitHub で管理する運用方法](https://qiita.com/b4b4r07/items/b70178e021bef12cd4a2)
- [Qiita - 優れた dotfiles を設計して、最速で環境構築する話](https://qiita.com/b4b4r07/items/24872cdcbec964ce2178)<br>
ファイル構成や展開とセットアップに関する知見がまとめられています。Github上で公開されているdotfilesには、ファイルの展開はsymlinkやrsyncを利用したものが多く、makeを利用したものはたまに見るぐらいの印象ですが、makeコマンドを使う利点や具体的な方法も書かれています。

### コレクション
- [Github - webpro/awesome-dotfiles](https://github.com/webpro/awesome-dotfiles)<br>
よくあるawesome系のものです。導入記事から実際のdotfiles、dotfiles関連ツールまで良質のものがよくまとまっています。ただ、評判が良くても選に漏れているものや、awesome系によくあるのですが、情報が追加されたのはいいけど、古くなっても更新されなかったり削除されなかったりするようなところはあります。
- [Github does dotfiles](https://dotfiles.github.io/)<br>
ネット上おそらく最大規模でdotfiles関連のリポが集まっているページです。[Github - dotfiles/dotfiles.github.com](https://github.com/dotfiles/dotfiles.github.com)で管理されているページですが、PRがあればそのまま追加していく感じのようなので、掲載されているdotfilesも玉石混淆です。効率は良くないと思いますが、比較的新しいdotfilesがたくさん載っているので、掘り出し物（？）が見つかるかもしれません。

### Github上でスターがたくさんついているdotfiles
ここに書いているOSは主に使用が想定されているもので、紹介するほとんどのdotfilesのスクリプトはPOSIX実装なら動くよう書かれています。

- [Github - mathiasbynens/dotfiles](https://github.com/mathiasbynens/dotfiles)
環境
    - OS: macOS
    - シェル: Bash, Zsh
    - エディタ: Vim
    - ターミナル: iTerm2 + tmux
    
    最も多くスターがついているdotfilesリポです。設定・ツールに比較的クセがなく、きれいに分割されていて拡張しやすいです。スター数TOP10のdotfilesのうち、少なくとも2つはこのリポからフォークされたもので、その他のリポでも参考にされています。多少古いスクリプトもありますが、ちょこちょこいじればそのまま使えます。macOSの設定スクリプトが評価されてます。

- [Github - skwp/dotfiles](https://github.com/skwp/dotfiles)
環境
    - OS: macOS 
    - シェル: Zsh
    - エディタ: Vim
    - ターミナル: iTerm2 + tmux

    人気のあるいろいろなdotfilesから良いとこどりして作られているdotfilesです。細部までがっつり設定されているので、拡張して育てていくよりも、何も考えずにツールに従って開発したい人にとても良いと思います。
- [Github - thoughtbot/dotfiles](https://github.com/thoughtbot/dotfiles)
環境
    - OS: macOS
    - シェル: Zsh
    - エディタ: Vim
    - ターミナル: Terminal + tmux
    
    名Gemを多数開発していることで有名なThoughtbot社が公開しているdotfilesです。やはりRubyやRailsのVimプラグインが入っています。最低限みんなが使っている共通のものが入っているという印象を受けます。後述するrcmというdotfilesマネジャーを使って利用します。
### その他、気になるdotfiles
- [Github - elenapan/dotfiles](https://github.com/elenapan/dotfiles)
  環境
    - OS: Ubuntu
    - シェル: Zsh
    - エディタ: Vim
    - ターミナル: Kitty + tmux

    2017年に作成された比較的新しいリポですが、人気を集めているようです。これを拡張して、[UbuntuでMacレベルに使いやすくておしゃれな環境構築](https://sioyaki.com/entry/2018/03/04/111611)も参考にしつつ、サブのUbuntuに入れていますが、無駄におしゃれで素敵です。

- [Github - atomantic/dotfiles](https://github.com/atomantic/dotfiles)
  環境
   - OS: macOS
   - シェル: Zsh
   - エディタ: Vim
   - ターミナル: iTerm2 + tmux

    macOSの設定（defaultsコマンドに限らず）がとにかく詳しくドキュメント化されていて、参考になるところが多いです。

- [Github - b4b4r07/dotfiles](https://github.com/b4b4r07/dotfiles)
  環境
   - OS: macOS
   - シェル: Zsh, Bash
   - エディタ: Vim
   - ターミナル: Terminal + tmux

    この記事にも参考記事としても出てきているb4b4r07さんのdotfilesです。環境依存性、アプリケーションやプラグインへの依存性が小さいので安心感があり、ミニマルリズムを行くかっこよさがあります。

### dotfiles管理ツール
書く気力が溜まったら一言添えます。

- [Github - anishathalye/dotbot](https://github.com/anishathalye/dotbot)
- [Github - chezmoi](https://github.com/twpayne/chezmoi)
- [Github - rcm](https://github.com/thoughtbot/rcm)
- [Github - TheLocehiliosan/yadm](https://github.com/TheLocehiliosan/yadm)
- [Github - freshshell/fresh](https://github.com/freshshell/fresh)

### Bash
- [Github - awesome-lists/awesome-bash](https://github.com/awesome-lists/awesome-bash)<br>
「Bash完全に理解した」気になれます。
- [Gist - zachbrowne/The Ultimate Bad Ass .bashrc File](https://gist.github.com/zachbrowne/8bc414c9f30192067831fafebd14255c)<br>
"ultimate"かどうかわかりませんが、参考になるところがあります。
- [Reddit - A very useful .bashrc file](https://www.reddit.com/r/commandline/comments/9md3pp/a_very_useful_bashrc_file/)<br>
他人のbashrcに対して、細かく突っ込んだり、あれが便利、こうするといいみたいな忌憚のない議論をするところってあまりないので、眺めてると楽しいです。

### Zsh
プラグインマネジャー入れて、プラグインを入れて、とやっているうちに重くなりがちなZshですが、最近はパフォーマンスが意識されたものがたくさんあるので、それを使いつつ、本当に大事なプラグインに絞って入れる作戦が良いのではないかと思います。

- [Github - unixorn/awesome-zsh-plugins](https://github.com/unixorn/awesome-zsh-plugins)<br>
Zshの便利・人気プラグインがキュレーションされてます。
- [Qiita - もっと便利になれる zsh プラグインによる CLI ライフ](https://qiita.com/b4b4r07/items/f37aadef0b3f740e8c14)<br>
誰もが使いたいと思えるプラグインに絞って紹介されているところが素敵だと思います。
- [Github - zdharma/zplugin](https://github.com/zdharma/zplugin)<br>
パフォーマンスも使い勝手も良いと評判の、新しめのプラグインマネジャーです。oh-my-zsh -> prezto -> zplug と来て、今のところzpluginが良さそうだなあと思っています。もっと良いものがあったら教えて下さい。
- [Github - romkatv/powerlevel10k](https://github.com/romkatv/powerlevel10k)<br>
powerlevel9kを実装し直してパフォーマンスを改善したテーマ。これに限らずお気に入りのテーマを探すと良いです。

### Fish
まだです

### macOS関連
- [Github - mathiasbynens/dotfiles](https://github.com/mathiasbynens/dotfiles)（再掲）<br>
macOSの設定スクリプトについては、一度に全部走らせると挙動がおかしくなったり、好みに合わないものになり、しかもそれがどのコマンドによって設定されたものなのかわからなくなるので、何をするコマンドなのかちゃんと確認して数行ずつ試すのが良いかなと思います。
- [defaults-write.com](https://www.defaults-write.com/)<br>
macOS・OSXの設定に関するブログです。一覧性はありませんが、基本的に1テクニック1記事になっていて、とても短いのでちょっとした時間にチェックできます。不定期で今も更新されています。
- [Qiita - iMac/MacBook購入後に必ず設定したい設定項目](https://qiita.com/ryuichi1208/items/5905240f3bfce793b33d)<br>
上記2つを参考に書かれたもののようです。
- [Github - atomantic/dotfiles](https://github.com/atomantic/dotfiles)（再掲）<br>
`defaults`コマンドだけでなく、macOSのさまざまな便利設定について網羅されてます。もうこのdotfiles使ってればいいんじゃねという気もしてきます。
- [jaywcjlove/awesome-mac](https://github.com/jaywcjlove/awesome-mac)<br>
macOS対応の便利なアプリケーションをキュレーションしてくれてます。

### Vim関連
エディタ難民になっているので、またVimに戻ることも考えて色々チェックしようと思います。というか、上で紹介したdotfilesのメインエディタは全てVimなので、そちらを見れば良いと思います。他のエディタでVimバインディング使っている人も参考になるはずです。

- [Qiita - 脱初心者を目指すVimmerにオススメしたいVimプラグインや.vimrcの設定](https://qiita.com/jnchito/items/5141b3b01bced9f7f48f)
- [Qiita - vimって極めればvscode並のIDEになるんじゃないの？ - 最強のvimrcを晒す。
](https://qiita.com/ryuta69/items/98901f4c4f0683e7aa57)

### VSCode関連
ペイン操作周りで少し不満があったり、Vimバインディングで使っているとときどき不具合（スニペット機能との連携とか）があったりしますがお手軽です。

- [Qiita - 割と突き詰めてやったvim→vscode移行](https://qiita.com/y-mattun/items/45776b7e1942edb2f727)
- [Visual Studio Code - User and Workspace Settings](https://code.visualstudio.com/docs/getstarted/settings)<br>
公式ドキュメント


## その他
### センシティブなデータの取り扱い
特にこれからdotfilesに入門しようかなと思っている方へ。

- [Qiita - ようこそdotfilesの世界へ#dotfiles用の.gitignoreの設定](https://qiita.com/yutakatay/items/c6c7584d9795799ee164#dotfiles%E7%94%A8%E3%81%AEgitignore%E3%81%AE%E8%A8%AD%E5%AE%9A)（再掲）<br>
ここを参考に、`.gitignore`をホワイトリストとして運用して、余計なファイルをコミットしない
- そもそも大事なデータはローカルのファイルとして持たずに [Bitwarden](https://bitwarden.com/), [1Password](https://1password.com/), [LastPass](https://www.lastpass.com/) などで管理して、CLIを使って取得するとか
- [Githubヘルプ - 機密データをリポジトリから削除する](https://help.github.com/ja/github/authenticating-to-github/removing-sensitive-data-from-a-repository)<br>
万が一コミットしてしまったときは、速やかにここを参考にデータを削除して、パスワード変更・キーの作り直しと再登録等をする

## 感想
色々なdotfilesリポを眺めていて、ドキュメントがしっかりしたものが人気に出るわけではないが、人気が出るものはだいたいドキュメントがしっかりしているな、という当たり前の教訓を得ました。

## おわり
dotfilesライフを楽しみましょう！（勢い）