dotfilesをGitHubで管理するようにしたついでに晒す

この記事は[dotfiles Advent Calendar 2020](https://qiita.com/advent-calendar/2020/dotfiles)の8日目です。

# はじめに
最近開発マシンをMacからWindowsに変えて、そのタイミングでdotfilesをGitHubで管理するようにしたので、自分用の整理も兼ねてdotfilesを晒します。

# 私の環境
- Windows + WSL 2 Ubuntu + Windows Terminal
- 時々Mac
- Bash

# リポジトリ構成
- https://github.com/ngmy/dotfiles
  - dotfilesを管理するリポジトリ
- https://github.com/ngmy/homedir
  - ホームディレクトリを管理するリポジトリ
- https://github.com/ngmy/wt-settings
  - Windows Terminalの設定を管理するリポジトリ
- https://github.com/ngmy/devenv
  - 上記のリポジトリを取りまとめるリポジトリ

dotfiles以外にもホームディレクトリとWindows Terminalの設定をGitHubで管理しており、それらをdotfilesという名前のリポジトリに含めるのもどうかと思ったので、それぞれ別のリポジトリにしています。
各リポジトリにインストールスクリプトを用意して個別にインストールできるようにしていますが、基本的には最後のdevenvリポジトリのインストールスクリプトを実行すれば全部まとめてインストールされて開発環境ができあがるようにしています。

```console
bash <(curl -LSs https://raw.githubusercontent.com/ngmy/devenv/master/install.sh)
```
# https://github.com/ngmy/dotfiles
dotfilesを管理するリポジトリです。
リポジトリのディレクトリ構成は下記のようになっています。

```console  
.Brewfile
.bash_aliases
.bash_profile
.bashrc
.bashrc_ubuntu
.git/
.git_template/
.gitconfig
.gitconfig_linux
.gitconfig_mac
.gitignore
.vim/
.vimrc
LICENSE
README.md
install.sh*
```

私はBashしか使わないのでBashだけを考慮しています。
今のところUbuntuとMacで使うことを想定しています。

インストールスクリプトを実行するとホームディレクトリからdotfilesへのシンボリックリンクが張られます。

```console
$ ll ~/ | grep '^l' | grep '/home/nagamiya/share/dotfiles/' | awk '{print $9,$10,$11}'
.Brewfile -> =/share/dotfiles/.Brewfile
.bash_aliases -> /home/nagamiya/share/dotfiles/.bash_aliases
.bash_profile -> /home/nagamiya/share/dotfiles/.bash_profile
.bashrc -> /home/nagamiya/share/dotfiles/.bashrc
.bashrc_os -> /home/nagamiya/share/dotfiles/.bashrc_ubuntu
.git_template -> /home/nagamiya/share/dotfiles/.git_template/
.gitconfig -> /home/nagamiya/share/dotfiles/.gitconfig
.gitconfig_os -> /home/nagamiya/share/dotfiles/.gitconfig_linux
.gitignore -> /home/nagamiya/share/dotfiles/.gitignore
.vim -> /home/nagamiya/share/dotfiles/.vim/
.vimrc -> /home/nagamiya/share/dotfiles/.vimrc
```

## `.Brewfile`
Homebrewのバンドルファイルです。
`brew bundle --global`するとバンドルファイルに書かれたパッケージがインストールされます。
UbuntuでもMacでも使えるように、パッケージはなるべくHomebrewでインストールするようにしています。
新しいパッケージを追加したら`brew bundle dump --global --force`して、生成された`.Brewfile`をコミットしています。

## .bash_aliases
Bashのエイリアスを書く場所です。

## .bash_profile
Bashの設定ファイルです。

## .bashrc
Bashの設定ファイルです。
`.bashrc_os`を読み込んでいます。

## .bashrc_ubuntu
Ubuntuのデフォルトの`.bashrc`です。
`~/.bashrc_os`からシンボリックリンクを張っています。

## .git_template
Gitのテンプレートです。

## .gitconfig
Gitの設定ファイルです。
このファイルにはUbuntuとMacで共通の設定を書いています。
Ubuntu個別の設定は`.gitconfig_linux`に、Mac個別の設定は`.gitconfig_mac`に書き、どちらかに` ~/.gitconfig_os`からシンボリックリンクを張り、それを`.gitconfig`からインクルードしています。

```:.gitconfig
...
[include]
	path = ~/.gitconfig_os                           
```

個別の設定が必要になる理由は、Homebrewでインストールされるパッケージの格納先ディレクトリがUbuntuの場合は`~/.linuxbrew`、Macの場合は`~/.homebrew`とそれぞれ異なるためです。
格納先ディレクトリが異なるため`.gitconfig`内でパッケージのパスを参照する際に別々のパスを指定する必要があり、`.gitconfig`には条件分岐を書くことができないため、Ubuntu用とMac用の2つのファイルを用意してシンボリックリンクと組み合わせる方法で対処しています。

## .gitconfig_linux
Ubuntu用のGitの設定ファイルです。
`~/.gitconfig_os`からシンボリックリンクを張っています。

## .gitconfig_mac
Mac用のGitの設定ファイルです。
`~/.gitconfig_os`からシンボリックリンクを張っています。

## .gitignore
Gitの除外設定です。

## .vim
Vimの設定ディレクトリです。
プラグインの実体はコミットせず[vim-plug](https://github.com/junegunn/vim-plug)を使ってインストールするようにしています。

## .vimrc
Vimの設定ファイルです。
前述のvim-plugはリポジトリに含めていないので、Vimの起動時にvim-plugをダウンロードしてパッケージをインストールするようにしています。

# https://github.com/ngmy/homedir
ホームディレクトリを管理するリポジトリです。
リポジトリのディレクトリ構成は下記のようになっています。

```
LICENSE
README.md
bin/
install.sh*
localrepos/
share/
tmp/
usr/
var/
```

インストールスクリプトを実行すると下記の構成でホームディレクトリが作られます。

```console
$ tree -d ~/
/home/nagamiya/
|-- bin
|-- docs -> /mnt/c/Users/ynaga/OneDrive/ドキュメント
|-- localrepos
|   `-- github.com
|       `-- ngmy
|-- share
|-- tmp
|-- usr
|   `-- local
|       `-- src
`-- var
    |-- archive
    |-- backups
    |-- desktop -> /mnt/c/Users/ynaga/OneDrive/デスクトップ
    |-- downloads -> /mnt/c/Users/ynaga/Downloads
    `-- tmp
```

この構成は下記の記事を参考にさせてもらっています。

[うちのホームディレクトリ構成を少し晒す](http://blog.azumakuniyuki.org/2012/03/home-directory-tree-in-my-macbook-air.html)

## ~/bin
自作のスクリプトを置く場所です。
`.bash_profile`で`PATH`環境変数に追加しています。

## ~/docs
マイドキュメントへのシンボリックリンクです。
Macの場合はDocumentsへのシンボリックリンクになります。

## ~/localrepos
Gitのリポジトリを置く場所です。
`~/localrepos`の下にホスト名ごとにディレクトリを作成しています。
ホスト名のディレクトリの下にはアカウント名ごとにディレクトリを作成しています。
例えば私個人のGitHubリポジトリであれば`~/localrepos/github.com/ngmy`となります。

## ~/share
共有データを置く場所です。
前述のdotfilesリポジトリは`~/share/dotfiles`にクローンしています。

## ~/tmp
物置です。

## ~/usr
パッケージマネージャーでインストールできないソフトウェアをコンパイル・インストールする場所です。
`~/usr/local/src`でコンパイルして`~/usr/local/*`（`~/usr/local/httpd`等）に置いています。

## ~/var
変化の多いファイルを置く場所です。
`~/var/tmp`（滅多に掃除しないもう一つの物置）、`~/var/archive`（よく使うソフトウェアのアーカイブを置く場所）、`~/var/backups`（バックアップを置く場所）を作っています。
ブラウザのダウンロードディレクトリやデスクトップへのシンボリックリンクもあります。

# https://github.com/ngmy/wt-setting
Windows Terminalの設定を管理するリポジトリです。
リポジトリのディレクトリ構成は下記のようになっています。

```console
.git/
.gitmodules
AppData/
LICENSE
README.md
install.sh*
```

インストールスクリプトを実行すると設定ファイルとフォントがコピーされます。

設定ファイルは`AppData/Local/Packages/Microsoft.WindowsTerminal_8wekyb3d8bbwe/LocalState/settings.json`に置いています。
私はVimを使うので、Vimの矩形選択とキーマップが被らないようにWindows Terminalのペーストを`ctrl+v`から`ctrl+shift+v`に変更しています。
またカラースキームを下記のGistを参考にして、Macで慣れ親しんだ[Iceberg](http://cocopon.github.io/iceberg.vim/)風に変更しています。

[Iceberg color scheme for Windows Terminal](https://gist.github.com/kshimi/86a6d840bab526c427b6e71acde44a81)

フォントは安定の[RictyDiminished](https://github.com/edihbrandon/RictyDiminished)を使っています。
`AppData/Local/Microsoft/Windows/Fonts/RictyDiminishedRictyDiminished`にサブモジュールとして追加しています。

# https://github.com/ngmy/devenv
上記のリポジトリを取りまとめるリポジトリです。
リポジトリのディレクトリ構成は下記のようになっています。

```console
.git/
LICENSE
README.md
install.sh*
```

インストールスクリプトを実行するとdotfiles・homedir・wt-settingsリポジトリが全部まとめてインストールされます。

# おわりに
私のdotfilesを晒してみました。
dotfilesをGitHubで管理するようにしてインストールスクリプトを用意したことで、開発環境を簡単に構築・再現できるようになりました。
私の場合、WSL 2がまだ不安定なせいで特にDockerまわりが壊れてWSL 2をリセットしたくなることがままあり、そうなった時に気軽にWSL 2をリセットして開発環境を再現できるようになったので、とても助かっています。