Heavy Watal

zsh

The most powerful shell

Installation

基本的にはOSに入ってる /bin/zsh を使う。 新しいのを入れるならHomebrewを使うのが楽:

brew install zsh
brew install zsh-completions

Environment variables

ZDOTDIR
設定ファイルを読み込むディレクトリ。デフォルトは ${HOME}
HISTFILE
コマンド履歴を保存するファイル。 デフォルトは ${ZDOTDIR}/.zsh_history っぽいけど明示的に設定しといたほうが安心。
fpath
zsh関数や補完関数のパス

Configuration files

$ZDOTDIR 以下の個人設定ファイルが場合に応じて下記の順で読まれる。 システム全体の設定ファイルとして /etc/z* が個人設定ファイルの前に読み込まれる。

/etc/zshenv
スクリプトの実行時も含めてあらゆる場合に読み込まれ、オプションでも外せない。 Ubuntuはここで基本的な PATH を設定。
.zshenv
スクリプトの実行時も含めてほぼあらゆる場合に読み込まれる。 インタラクティブ用の設定などはせず、最低限の記述に留める。 例えば ZDOTDIR, unsetopt NOMATCH など。
ここで PATH を設定したい気もするけど、 OSによっては次の /etc/zprofile で上書きされてしまう。 unsetopt GLOBAL_RCS としてそれを防ぐ手もあるけどやや危険。
/etc/zprofile
Macでは /usr/libexec/path_helper/usr/bin などの基本的な PATH を設定する。
ここで /etc/profilesource して設定するLinuxもある。
.zprofile
ログインシェルとして立ち上げるときのみ読まれる。 export する環境変数(PATH とか)を設定するのに適している。 .bash_profile に対応するので共通設定を .profile に書いておいて source するとか。
例えばローカル環境Mac + リモート環境Linux CUIで開発する場合、 ターミナルもtmuxもデフォルトでログインシェルを立ち上げるので、 .zshrc に一本化してしまっても構わない。
使い分けるのはLinux GUIを使う場合とか、 よほど重い初期化をログインシェル1回で済ませたい場合とか。
.zshrc
ログイン・非ログイン問わず、インタラクティブシェルとして立ち上げるときに読まれる。 こだわりが無ければだいたいどの設定もこれに書いておけば問題ない。
.zprofile と使い分けるなら setoptautoload など、親シェルから引き継がれないものはこちら。 alias などは別ファイルを読み込む形にして .bashrc と共有。
.zlogin
.zshrc より後に読まれる以外は .zprofile と同じ。使わない。
.zlogout
ログアウト時にしてほしいことが万が一あれば。

起動時間短縮

まずはプロファイリングしてボトルネックを知る:

# head of .zshenv
zmodload zsh/zprof

# tail of .zshrc
zprof

compinit とかが遅かったり複数回呼ばれていたりするので順番やオプションを変えてみる。

Glob

Qualifiers

ファイルの種類を限定したり順番を変えたりできる。 setopt EXTENDED_GLOB で有効になる。