はてブロ@ama_ch

https://twitter.com/ama_ch

zsh入門してみたら便利すぎて鼻息が抑えられない

「シェル?ターミナルでコマンド叩くだけでしょ。デフォルトのbashで十分」
そう思っていた僕ですが、漢のzshを見て考えが180度変わりました。zshスゴイ。愛してる。
zshはどうにも情報が得にくくて敬遠していたけど*1、漢のzshは分かりやすくて素晴らしい!僕も漢としての第一歩を踏み出せそうな気がしてきました。
連載の5回まで読んでやってみたので、記録しておきます。

まずはbashにお別れ

最初はターミナルでzshを叩いて試してたけど、やればやるほどデフォルトで良いんじゃないか、いやむしろデフォルトでお願いします、という気持ちが強くなったので、ログインシェルを変更。さよならbash、今までありがとう。

$ chsh -s /bin/zsh

これで、次回以降は最初からzshが使えます。

ところでzshって何て読むの?

「ぜっとしぇる」で正しいはず!
Z Shell - Wikipedia

漢の道程

.zshrcを作り、bashの設定を引き継ぐ

zshは設定を.zshrcに書く。
ホームディレクトリに.zshrcファイルを作り、.bashrcや.bash_profileに書いていた設定を適宜コピー。丸ごとコピーでもいいのかな?
あとは、.zshrcにゴリゴリ設定を書いて興奮しまくればよし!

.zshrcの編集と読み込み

.zshrcを編集したら、

% source ~/.zshrc

で再度読み込むことができる。

補完機能
# 補完機能
autoload -U compinit
compinit

これで、補完機能が使える。Tabでコマンド名やオプションなど、色々補完できる!

プロンプト

【コラム】漢のzsh (2) 取りあえず、プロンプトを整えておく。カッコつけたいからねの例とほとんど同じ。

# プロンプトの設定
case ${UID} in
0)
    PROMPT="%{^[[31m%}%n%%%{^[[m%} "
    RPROMPT="[%~]"
    PROMPT2="%B%{^[[31m%}%_#%{^[[m%}%b "
    SPROMPT="%B%{^[[31m%}%r is correct? [n,y,a,e]:%{^[[m%}%b "
    [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && 
        PROMPT="%{^[[37m%}${HOST%%.*} ${PROMPT}"
    ;;
*)
    PROMPT="%{^[[31m%}%n%%%{^[[m%} "
    RPROMPT="[%~]"
    PROMPT2="%{^[[31m%}%_%%%{^[[m%} "
    SPROMPT="%{^[[31m%}%r is correct? [n,y,a,e]:%{^[[m%} "
    [ -n "${REMOTEHOST}${SSH_CONNECTION}" ] && 
        PROMPT="%{^[[37m%}${HOST%%.*} ${PROMPT}"
    ;;
esac

上記設定の"^["は文字列ではなくエスケープ記号なので、そのままコピペすると動かない。
Emacsなら、置換対象を"^["、置換文字を"C-q ESC"で変換すると動く。
プロンプトが「ユーザー名% 」になっていて、現在のパスを右側に表示するようにした。
パスを右側表示にすると、左プロンプトの長さが一定になってこれがなにげに快適!

コマンド履歴

指定したファイルに、実行したコマンドの履歴が記録される。重複するものは記録しないし、一度入力したコマンドは後述の履歴検索からすべて辿れるようになる。すごいぞzsh

# コマンド履歴
HISTFILE=~/.zsh_history
HISTSIZE=6000000
SAVEHIST=6000000
setopt hist_ignore_dups     # ignore duplication command history list
setopt share_history        # share command history data
コマンド履歴検索

以下の設定で、コマンドの履歴を検索できる。

# コマンド履歴検索
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end

Ctrl-P/Ctrl-Nで、入力中の文字から始まるコマンドの履歴が表示される。"l"と入力した状態でCtrl-Pを押すと、"ls"や"less"が次々に表示されていく。
bashだと"!hoge"でhogeから始まる最後のコマンドを実行できるけど、使い勝手が悪かった。zshのこの設定の方が無理がなくて素敵ですね!

その他いろいろ
# ディレクトリ名を入力するだけで移動
setopt auto_cd

"cd"を入力しなくても移動できるようになる!
"~"とか".."とだけ打てば動けるのは、ありがたい。

# 移動したディレクトリを記録しておく。"cd -[Tab]"で移動履歴を一覧
setopt auto_pushd

"cd -[Tab]"で、移動履歴が表示されるようになる。
ひとつ前にいたディレクトリに戻りたいけど、パスが長くて面倒・・・という時に効果絶大!

# コマンド訂正
setopt correct

コマンドを打ち間違えた時に、近いコマンドを提案してくれる。何この便利機能、賢すぎる!

# 補完候補を詰めて表示する
setopt list_packed 

Tabで補完候補を表示する際、画面に収まらない場合は表示間隔を詰めてなるべく収まるようにしてくれる。細かいところで気が利いてるなぁ〜。

# 補完候補表示時などにピッピとビープ音をならないように設定
setopt nolistbeep

ビープ鳴りまくると結構ストレスなので、設定しておきます。

# Emacsライクキーバインド設定
bindkey -e 

最初からEmacsキーバインドだと思うんだけどな?いちおう、これも設定。
vim使いにはvimキーバインド設定もありますよ!

zshはよいものだ

まだ全然理解できていませんが、とても使いやすいということは分かりました。
色々と調べて、もっと使いこなせるようになりたいです!

*1:そもそもシェルをいじったり変えようとしたことがなかった