LoginSignup
86

More than 5 years have passed since last update.

posted at

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

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

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

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

zshenv

~/.zshenv

.zshenv
export ZDOTDIR=$HOME/.zsh

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

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

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

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

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

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

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

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

.zshrc_local.gitignore に追加して

.zshrc
[ -f $ZDOTDIR/.zshrc_local ] && . $ZDOTDIR/.zshrc_local

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

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

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

rbenv など

.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 [キータ] の Homebrew の解説を読むことをおすすめします

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

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

.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 が個人的におすすめです

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

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

.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 で

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

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

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

ここはおまけです

Google の Shell Style Guide ではインデントがスペース 2 つなのでインデントは 2 つにするのがおすすめです(というか Google は 2 インデントが好き)

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

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

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 で!!

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

元ネタ:catatsuy / .zshrc を Github で管理したい!! - Glide

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
86