Terminal (Mac OS X): zsh で Terminal での作業を効率化する

Mac の Terminal を立ち上げたときに、標準では bash というプログラムが動いています。bash に対してユーザーはコマンドを打ち、bash が OS に伝えるという役割を担っています。

この bash も悪くはないのですが、 zsh (ゼットシェル) はより効率的に作業を行うことができます。

1. 便利なプラグインがある
2. 自動でアップデートされる機能がある
3. コミュニティが活発である
4. bash より処理が高速
5. コマンドラインが苦手な人でも大丈夫な仕組みが整備されている

使う分には特に差もなく使えるようなので zsh を使ってみていく過程をメモしていきます。

Terminal を開いて以下のコマンドを叩きます。
(以下のように書かれていた場合は zsh とだけ入力します。)

$ zsh

すると $ が % に表示が変わります。

Ctrl + D で bash に戻ることができます。

% ls
% pwd

など bash で使用できるコマンドも普通に使えます。

bash や zsh のことを shell といい、Mac に入っている shell 一覧を表示することができます。

% cat /etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

Mountain Lion の場合です。bash や zsh の他にも実は色々入っています。

Terminal を再度起動したりすると bash に戻ってしまうので、自動的に zsh が選択されるようにします。

% chsh

Mac のパスワード入れて Enter

vim というテキストエディタが Terminal 上に立ち上がり、テキスト編集画面になります。
i キーを押してインサートモードに切り替えて、

Shell: /bin/bash

となっているところを

Shell: /bin/zsh

とし、ESC でインサートモードを離脱し、:wq で保存して終了します。
もし間違えたらインサートモードでない状態の時に u で undo するか、:q! で、やりなおししてしまいましょう。

Terminal を Cmd+N などで別ウィンドウを立ち上げると、タイトルバーに zsh と書かれ、zsh が立ち上がっていることを確認出来ます。

ちなみに現在どれが自動選択される shell かは以下のコマンドで確認できます。

% echo $SHELL
/bin/zsh

いよいよ設定ファイル .zshrc の作成にうつります。

% vi ~/.zshrc

export LANG=ja_JP.UTF-8

PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting

########################################
# 補完
# 補完機能を有効にする
autoload -Uz compinit
compinit
 
# 補完で小文字でも大文字にマッチさせる
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
 
# ../ の後は今いるディレクトリを補完しない
zstyle ':completion:*' ignore-parents parent pwd ..
 
# sudo の後ろでコマンド名を補完する
zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin \
                   /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin
 
# ps コマンドのプロセス名補完
zstyle ':completion:*:processes' command 'ps x -o pid,s,args'

########################################
# vcs_info
 
autoload -Uz vcs_info
zstyle ':vcs_info:*' formats '(%s)-[%b]'
zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a]'
precmd () {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
}
RPROMPT="%1(v|%F{green}%1v%f|)"

##################################

# チェンジディレクトリを簡単にする
# cd したら自動的にpushdする
setopt auto_pushd
# 重複したディレクトリを追加しない
setopt pushd_ignore_dups
# ディレクトリ名だけでcdする
setopt auto_cd

# ヒストリの設定
HISTFILE=~/.zsh_history
HISTSIZE=1000000
SAVEHIST=1000000
# 同じコマンドをヒストリに残さない
setopt hist_ignore_all_dups
# 同時に起動したzshの間でヒストリを共有する
setopt share_history
# ヒストリファイルに保存するとき、すでに重複したコマンドがあったら古い方を削除する
setopt hist_save_nodups
# スペースから始まるコマンド行はヒストリに残さない
setopt hist_ignore_space
# ヒストリに保存するときに余分なスペースを削除する
setopt hist_reduce_blanks
# 補完候補が複数あるときに自動的に一覧表示する
setopt auto_menu
# 高機能なワイルドカード展開を使用する
setopt extended_glob


# 日本語ファイル名を表示可能にする
setopt print_eight_bit

# フローコントロールを無効にする
setopt no_flow_control

# '#' 以降をコメントとして扱う
setopt interactive_comments

# 色を使用出来るようにする
autoload -Uz colors
colors

# プロンプト
# 1行表示
# PROMPT="%~ %# "
# 2行表示
PROMPT="%{${fg[red]}%}[%n@%m]%{${reset_color}%} %~
%# "

# 単語の区切り文字を指定する
autoload -Uz select-word-style
select-word-style default
# ここで指定した文字は単語区切りとみなされる
# / も区切りと扱うので、^W でディレクトリ1つ分を削除できる
zstyle ':zle:*' word-chars " /=;@:{},|"
zstyle ':zle:*' word-style unspecified

PATH のところだけ環境によって違うかもなので要注意ですが、コピペしたら :wq で保存。

Terminal を再起動(Cmd+N で新規ウィンドウを立ち上げる)するか、以下のコマンドを叩けば、設定が反映されます。

% source ~/.zshrc

これでほんの少し、Terminal が快適になるはずです。