.zshrcを色んな環境で共有する方法を考えてみた

.zshrc を様々な Mac や Linux マシンなどで使い回したいという人は多いと思います

しかし github で共有するには Mac だけでやりたい設定やそのマシンだけでやりたい設定などをうまく共有できるようにしなければなりません

その辺りをどう解決するのかを真剣に考えた結果を共有します

## zshenv

`~/.zshenv` に

```zsh:.zshenv
export ZDOTDIR=$HOME/.zsh
```

とすれば `~/.zsh/.zshrc` を読み込みに行くので `~/.zsh/` ディレクトリに設定をまとめて Git 管理にできます

## zsh で OS 依存のコードを分離する

```zsh:.zshrc
case ${OSTYPE} in
  darwin*)
    # ここに Mac 向けの設定
    ;;
  linux*)
    # ここに Linux 向けの設定
    ;;
esac
```

とやるのも良いですが，少し煩雑なので以下のようにファイルを分割するのがお勧めです

```zsh:.zshrc
[ -f $ZDOTDIR/.zshrc_`uname` ] && . $ZDOTDIR/.zshrc_`uname`
```

とすると `.zshrc_Darwin`, `.zshrc_Linux` に OS 依存のコードを書くことができます

ファイルがなければ右式は評価されないのでエラーは出ません
そのため FreeBSD など全部用意しなくても大丈夫です

マシンごとの設定をするローカルファイルも同様に設定できます

`.zshrc_local` を `.gitignore` に追加して

```zsh:.zshrc
[ -f $ZDOTDIR/.zshrc_local ] && . $ZDOTDIR/.zshrc_local
```

と `.zshrc` の一番最後に書くとマシン依存のコードを `.zshrc_local` に書けます

`.zshrc_local` は git 管理しないので代わりに `.zshrc_local.tmp` とかをコミットしておいて手元で `cp` するのが良いでしょう

主に PATH の設定はマシン毎によって異なるのでここでやるのがおすすめです

## rbenv など

```zsh:.zshrc_rbenv
if [ -d ${HOME}/.rbenv ]; then
  export PATH=$HOME/.rbenv/bin:$PATH
  eval "$(rbenv init -)"
  . ~/.rbenv/completions/rbenv.zsh
fi
```

最近では LL をインストールする場合は rbenv のようなものを使うのが一般的になりました

rbenv を一般的な構成でインストールすると `~/.rbenv` ディレクトリが存在するはずなのでそのディレクトリが存在したら rbenv を起動するようにすると便利です

`~/.rbenv` ディレクトリが存在しない限り動かないようにすることで rbenv が入ってない環境でエラーが起こることを防ぎます

## coreutils

Mac 限定になりますが，Mac は例えば `ls` などが BSD 由来で Linux で一般的な GNU のものとはオプションが異なります
また Linux なら入っているコマンドが Mac ではなかったりします

普段開発は Linux で行う人が多いと思うのでこの Mac の微妙な違いにイライラを感じたことがある人は多いと思います

それらの多くは Homebrew で coreutils をインストールすることで解消できます

Homebrew は私の周りでも使い方を把握していない人が多いので，私の書いたものですが [Zsh - Macで開発したい人のための基本的なことまとめ - Qiita [キータ]](http://qiita.com/catatsuy/items/50b339ead2571fd3f628) の Homebrew の解説を読むことをおすすめします

それで `brew info coreutils` を読むと書いてありますが，デフォルトのコマンドを上書きしないように `ls` は `gls` のようにインストールされるコマンドに対してプレフィックスとして `g` が付きます

このプレフィックスを除くには `PATH` を通す必要があります
その設定例です

```zsh:.zshrc_Darwin
if [ -d /usr/local/opt/coreutils/libexec/gnubin ]; then
  export PATH=/usr/local/opt/coreutils/libexec/gnubin:$PATH
  export MANPATH=/usr/local/opt/coreutils/libexec/gnuman:$MANPATH
  alias ls='ls --color=auto'
else
  export LSCOLORS=gxfxcxdxbxegedabagacad
  alias ls='ls -G'
fi
```

rbenv などと同じように coreutils が入っていることを前提にしないようにしましょう

この例では coreutils が入っていなかったら `ls` に簡単に色だけつけています

## 色も共有する

端末の色を設定したい場合は `LS_COLORS` を設定します（BSD 由来の `LSCOLORS` とは別物）

`.zshrc` にそのまま書くとかなり煩雑になるので `~/.dircolors` として外部ファイルに定義するのがおすすめです

[seebi/dircolors-solarized](https://github.com/seebi/dircolors-solarized) が個人的におすすめです

これを読み込むには `dircolors` が必要です

このコマンドは GNU 由来なので Mac は coreutils 必須です
そのためここでも coreutils が入っていることを前提にしないようにします

```zsh:.zshrc_dircolors
## dircolors
if [[ -f ~/.dircolors && -x `which dircolors` ]]; then
  eval `dircolors ~/.dircolors`
  zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
fi
```

この例ではついでにディレクトリを補完するときにも色の設定を適用するようにしています


## git submodule を活用する

Github で

* [zsh-users/zsh-completions](https://github.com/zsh-users/zsh-completions)
* [zsh-users/zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)
* [zsh-users/zsh-history-substring-search](https://github.com/zsh-users/zsh-history-substring-search)

この辺りおすすめなので git submodule で入れておきましょう

読み込み方などはそれぞれの README を読んで rbenv などと同じ要領で読み込んでください


## 【おまけ】エディタの設定

ここはおまけです

[Google の Shell Style Guide](http://google-styleguide.googlecode.com/svn/trunk/shell.xml) ではインデントがスペース 2 つなのでインデントは 2 つにするのがおすすめです（というか Google は 2 インデントが好き）

また今回 `.zshrc*` のようなファイルをたくさん作りましたが，これだとエディタの shell-script のシンタックスハイライトが効かないかもしれません

私は Emacs 派なので Emacs での設定例を紹介します

```el:init.el
;; indent
(add-hook 'sh-mode-hook '(lambda () (interactive)
        (setq sh-basic-offset 2 sh-indentation 2)))

;; .zshrc* を shell-script-mode に
(add-to-list 'auto-mode-alist
        '("\\.zshrc" . shell-script-mode))
```

## 続きは Github で！！

* [catatsuy/dot.zsh](https://github.com/catatsuy/dot.zsh)

私が実際に使っている .zshrc です
参考になれば！！

元ネタ：[catatsuy / .zshrc を Github で管理したい！！ - Glide](http://glide.so/catatsuy/6320954)