zsh
シェルの話。 いつもはLinuxでデフォルトになっているbashを使っているんだけど、究極のシェルといわれているzshを試してみようと思う。 zshは情報が少ないのが欠点なんだけど、豊富な機能を持つことが特徴。 特にコマンドラインスタックが便利みたい。
まずは環境の整備から、ということで.zshrcを編集する。
プロンプト
デフォルトのプロンプトは、
hostname%
なんだけど、bashに慣れた身としては違和感がある。 今までと同じように、
[user@hostname] $
となるように環境変数PROMPTを設定する。
PROMPT='[${USER}@${HOSTNAME}] %(!.#.$) '
最後の %(!.#.$) は、一般ユーザは $ でrootは # にするためのもの。 あおきにっきを参考にさせてもらっている。
次に、カレントディレクトリをプロンプトに表示させる。 zshだと、環境変数RPROMPTを設定することで、画面の右側にもプロンプトを表示できるようになる。
RPROMPT='[%~]'
これで、プロンプトは下のようになった。 入力しているコマンドが長くなると、右側のカレントディレクトリの表示は勝手に消えてくれる。
[user@hostname] $ tail -f messages [/var/log]
プロンプトに色を付ける
このままだと、プロンプトとコマンドが同じ色なので少々分かりにくい。 そこで、プロンプトの部分に色を付けることにする。
色は
'%{^[[34m%}
などと指定するようだ。しかも ^[ はESCコードらしい。 慣れていない人からすると、ほぼ記号だなぁ。 これをそのままPROMPTの定義文に埋め込んじゃうと訳が分からなくなりそうだったので、下のように色の定義を別の変数とした。
local GREEN=$'%{\e[1;32m%}' local BLUE=$'%{\e[1;34m%}' local DEFAULT=$'%{\e[1;m%}' PROMPT=$BLUE'[${USER}@${HOSTNAME}] %(!.#.$) '$DEFAULT RPROMPT=$GREEN'[%~]'$DEFAULT setopt PROMPT_SUBST
最後に$DEFAULTを指定しないと、以降の文字まで色が付いた状態になってしまう。 また、直接ESCコード ( ^[ ) を入力するのではなく、エスケープシーケンスを使って \e[1; と指定するようにしている。 これならテキストをコピー&ペーストしても使える。 「setopt PROMPT_SUBST」は、色の指定を有効にするためのおまじないのようなもの。(コントロールコードを有効にしているみたい)
これで、プロンプトは青色に、右側のプロンプトは緑色になった。
ディレクトリの履歴
階層の深いディレクトリを頻繁に行ったり来たりする場合、以前いたディレクトリに戻るのが面倒だったりする。 そこで、たどったディレクトリの履歴を記憶しておき、簡単に戻れるようにする。 zsh for the working researcherの「2.3 cd」節を参考にして、.zshrcに下のように記述した。
setopt autopushd alias gd='dirs -v; echo -n "select number: "; read newdir; cd -"$newdir"'
これで、gdコマンドで今まで行ったディレクトリに簡単に戻れるようになった。
[user@hostname] $ gd [/var/log] 0 /var/log 1 /usr 2 ~ 3 /etc/postfix 4 /proc select number:
グローバルエイリアス
UNIXやLinuxはコマンドを組み合わせて使うことが多く、よく使う定型パターンがある。 「| grep」や「| more」などがそうかも。 そこで、これらのパターンをエイリアスとして定義することで、入力を楽にすることができる。 通常のエイリアスだと、コマンドに対してしか有効にならないけど、zshのグローバルエイリアスは、コマンド行の途中に対しても有効になるみたい。
alias -g lG='| grep ' alias -g lM='| more '
こうやって指定しておくと、「dmesg lG CPU」と入力することで「dmesg | grep CPU」と同じ意味になる。
abbreviation
グローバルエイリアスより一歩進んだ使い方。 入力中に動的に置換してくれるので便利。
便利だと思ったこと
今のところ、これらの機能がお気に入り。
- 入力中にTABキーで補完。補完候補が複数あった場合に、TABを押すごとに各候補を順番に表示してくれるのが便利。
- ESC+qによるコマンドラインスタック。長いコマンドを打っている途中に他のコマンドを実行できる。
後者はscreenでも代用できるけど、特に前者の補完は本当に便利。