dotfilesリポジトリを作る


# dotfilesについて
自分用のdotfilesリポジトリを作る際に考えたことを中心にまとめておく。

## ドットファイルとは/何ができるか
ドットファイルは、「.」(ドット)から始まるファイルのこと。

ここではホームディレクトリのドットファイルを見てみる。

```
$ cd $HOME //ホームディレクトリへ移動
$ ls // ホームディレクトリのファイル一覧
codecommit  dotfiles  glow  jirasql  js  prev  script  sh
$ ls -a //　ホームディレクトリのファイルを隠しファイルも含めてすべて表示
.                   .aws           .bashrcp       .ctags               .gem                  .httpie         .motd_shown         .profile       .ssh                       .viminfo    js
..                  .bash_history  .bundle        .docker              .git-completion.bash  .java           .mozilla            .pub-cache     .sudo_as_admin_successful  codecommit  prev
.NERDTreeBookmarks  .bash_logout   .cache         .flutter             .gitconfig            .knownPackages  .node_repl_history  .sdkman        .tig_history               dotfiles    script
.android            .bash_profile  .clasprc.json  .flutter_settings    .gitignorep           .landscape      .npm                .serverless    .tigrc                     glow        sh
.anyenv             .bashrc        .config        .flutter_tool_state  .gradle               .local          .pki                .serverlessrc  .vim                       jirasql
```

このようにドットから始まるファイルは隠しファイルとなっており、確認する場合はlsにオプション-aを付ける。

隠すべき内容が書かれるファイルで、例えば.bash_historyはコマンドライン履歴情報、.gitconfigはgitの設定情報が入っている。

自動的に作成されるものがほとんどだが、もちろん自分で作成/編集することが可能。

特に設定ファイルは自分で作成する価値が高い。

設定ファイルが同じであれば、どこのサーバーに行っても同じような操作感を実現することが出来る。



## .bashrcをいじる/エイリアスを設定してみる
ここでは.bashrcを編集して自分のための設定を行ってみる。(シェルはbashを使う前提)

.bash_profileとの違いやどっちに書くべきかみたいなのはggrば出てくるので割愛。

今回は.bashrcを設定してエイリアスを設定してみる。(エイリアスはコマンドのショートカットのようなイメージ)

```
$ ls -a
.                   .aws           .bashrcp       .ctags               .gem                  .httpie         .motd_shown         .profile       .ssh                       .viminfo    js
..                  .bash_history  .bundle        .docker              .git-completion.bash  .java           .mozilla            .pub-cache     .sudo_as_admin_successful  codecommit  prev
.NERDTreeBookmarks  .bash_logout   .cache         .flutter             .gitconfig            .knownPackages  .node_repl_history  .sdkman        .tig_history               dotfiles    script
.android            .bash_profile  .clasprc.json  .flutter_settings    .gitignorep           .landscape      .npm                .serverless    .tigrc                     glow        sh
.anyenv             .bashrc        .config        .flutter_tool_state  .gradle               .local          .pki                .serverlessrc  .vim                       jirasql
$ la
la: コマンドが見つかりません
```

隠しファイルを表示するにはls -aは前回書いた通り。

これを短くlaで表示できるようにしてみる。

何も設定していないと、コマンドが見つかりません。

vimなどを使って、.bashrcに

```
alias la='ls -a'
```
の一行を加えてみる。これで設定は完了。

```
$ la
la: コマンドが見つかりません
```

しかしそのままではコマンドが見つかりませんのまま。これは、このシェルはまだ変更する前の.bashrcを使っているから。

なので一度シェルを閉じて、もう一度起動してみる。

```
$ la
.                   .aws           .bashrcp       .ctags               .gem                  .httpie         .motd_shown         .profile       .ssh                       .viminfo    js
..                  .bash_history  .bundle        .docker              .git-completion.bash  .java           .mozilla            .pub-cache     .sudo_as_admin_successful  codecommit  prev
.NERDTreeBookmarks  .bash_logout   .cache         .flutter             .gitconfig            .knownPackages  .node_repl_history  .sdkman        .tig_history               dotfiles    script
.android            .bash_profile  .clasprc.json  .flutter_settings    .gitignorep           .landscape      .npm                .serverless    .tigrc                     glow        sh
.anyenv             .bashrc        .config        .flutter_tool_state  .gradle               .local          .pki                .serverlessrc  .vim                       jirasql
```

これでエイリアスに成功した。

設定されているエイリアスはaliasコマンドで確認できる。

使う頻度が高いコマンドは覚えるよりもエイリアス派です。

## dotfilesリポジトリを作る/育てる

ドットファイルを作成して自分用に環境構築し、新しい環境でも同じドットファイルを使うことで同じ環境を構築できる。

こういった目的を果たすためには、dotfilesリボジトリを作成することが最適だと思う。



自身のdotfileを複数入れたdotfilesリポジトリを作成し、新しい環境ではリポジトリをcloneする。
色々育てた現在の私のdotfilesリポジトリは以下。

[最初のすがた](https://github.com/kitajima-mamoru/dotfiles/commit/08fc01aac5ebea62b9bcddc3f6362507d892be40)

ドットファイルはホームディレクトリ以下に置く必要があるので、cloneしてきただけではダメ。

そこで[install.shを作成し、dotfilesリポジトリに配置](https://github.com/kitajima-mamoru/dotfiles/blob/master/install.sh)する。

そのシェルスクリプトでは、ホームディレクトリ以下にcloneしてきたドットファイルの[実体へのシンボリックリンクを作成](https://github.com/kitajima-mamoru/dotfiles/blob/master/install.sh#L50)する。

リンクにすることで実体の更新がそのまま反映されることになるので、リポジトリをpullすれば反映されるようになる。

シェルスクリプトなのは、色々な環境で動くことが期待できるから。rubyとかで書くと、設定前の使いづらい環境でrubyの設定をしてからの導入になってしまう。

ドットファイルの実体はsrc以下など、一つディレクトリを切ったほうが良い。
install.shでsrc以下のすべてのファイルに関してホームディレクトリにシンボリックリンクを作成する。
このようにシンボリックリンクにすることで、dotfileリポジトリでpullするだけで最新のdotfileが反映される設計となる。
現在は5つのドットファイルを用意してあり、bash関連2つ、git関連2つ、ctagsについて一つである。

しかしドットファイルと呼ばれるものはもう一つ、vimrcも設定している。

vimrcは、vimrcという形でsrc以下に置いても良いが、.vim以下にvimrcを置いても読んでくれる。
vim --versionで読まれるファイルを確認できる

```
$ vim --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Apr 15 2020 06:40:31)
適用済パッチ: 1-2269
Modified by team+vim@tracker.debian.org
Compiled by team+vim@tracker.debian.org
Huge 版 without GUI.  機能の一覧 有効(+)/無効(-)
+acl               -farsi             -mouse_sysmouse    -tag_any_white
+arabic            +file_in_path      +mouse_urxvt       -tcl
+autocmd           +find_in_path      +mouse_xterm       +termguicolors
+autochdir         +float             +multi_byte        +terminal
-autoservername    +folding           +multi_lang        +terminfo
-balloon_eval      -footer            -mzscheme          +termresponse
+balloon_eval_term +fork()            +netbeans_intg     +textobjects
-browse            +gettext           +num64             +textprop
++builtin_terms    -hangul_input      +packages          +timers
+byte_offset       +iconv             +path_extra        +title
+channel           +insert_expand     -perl              -toolbar
+cindent           +job               +persistent_undo   +user_commands
-clientserver      +jumplist          +postscript        +vartabs
-clipboard         +keymap            +printer           +vertsplit
+cmdline_compl     +lambda            +profile           +virtualedit
+cmdline_hist      +langmap           -python            +visual
+cmdline_info      +libcall           +python3           +visualextra
+comments          +linebreak         +quickfix          +viminfo
+conceal           +lispindent        +reltime           +vreplace
+cryptv            +listcmds          +rightleft         +wildignore
+cscope            +localmap          -ruby              +wildmenu
+cursorbind        -lua               +scrollbind        +windows
+cursorshape       +menu              +signs             +writebackup
+dialog_con        +mksession         +smartindent       -X11
+diff              +modify_fname      +sound             -xfontset
+digraphs          +mouse             +spell             -xim
-dnd               -mouseshape        +startuptime       -xpm
-ebcdic            +mouse_dec         +statusline        -xsmp
+emacs_tags        +mouse_gpm         -sun_workshop      -xterm_clipboard
+eval              -mouse_jsbterm     +syntax            -xterm_save
+ex_extra          +mouse_netterm     +tag_binary
+extra_search      +mouse_sgr         -tag_old_static
      システム vimrc: "$VIM/vimrc"
      ユーザー vimrc: "$HOME/.vimrc"
   第2ユーザー vimrc: "~/.vim/vimrc"
       ユーザー exrc: "$HOME/.exrc"
  デフォルトファイル: "$VIMRUNTIME/defaults.vim"
       省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H   -Wdate-time  -g -O2 -fdebug-prefix-map=/build/vim-iU6mZD/vim-8.1.2269=. -fstack-protector-strong -Wformat -Werror=format-security -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lm -ltinfo -lnsl  -lselinux  -lcanberra -lacl -lattr -lgpm -ldl     -L/usr/lib/python3.8/config-3.8-x86_64-linux-gnu -
lpython3.8 -lcrypt -lpthread -ldl -lutil -lm -lm
```

またvimrc内は他のファイルを読むという記述だけになっており、実態はrcディレクトリ以下である。

vimrcは記述量が多く、ファイル分けしたかったのでこういった構成になっている。

rc以下に追加/削除するだけでvimrcの記述を追加/削除できるように構成した。



### append

また以下のようにbashrc、.gitignore、vimrcに関しては、以下の様に各環境で個別の設定を追加できるようになっている。
.bashrc:[.bashrcpを読む](https://github.com/kitajima-mamoru/dotfiles/blob/master/src/.bash_profile#L3)
.gitignore:[.gitigrorepを読む](https://github.com/kitajima-mamoru/dotfiles/blob/master/src/.gitconfig#L27)
vimrc:[pri/以下はリンクではなくコピー](https://github.com/kitajima-mamoru/dotfiles/blob/master/install.sh#L52)
dotfilesリポジトリで管理しだすと、各環境で共通でないものを設定したくなる場合が出てくる。
しかし、git管理下で編集するとpullするたびにstashが必要になってしまい、使いづらい。
環境ごとの設定は環境ごとの設定ファイルを用意するべきという考えで、こういった構成にした。

## まとめ

dotfilesリポジトリを作った際の話をまとめました。

どんなに簡単なものでも作っておくと、自身の成長につれてリポジトリも成長させられるので、作っておくことを強くオススメします。