至高のコマンドインタプリタzsh

Last modified Wed Oct 7 10:23:53 2009 on firestorm
12年目の大改装:-)

zsh book

前口上 / 小技集 / 提供リソース[NEW](zshcompsys(1)の 部分和訳) / zshの本完成

zshは、tcshやbash等を使っている以下のような症状に悩んでいる人に有効 である。

  1. cd するのにいちいち cd ってうたなきゃいけない面倒だとか、
  2. hoge.o 以外の *.o を全部消したいなあとか、
  3. カレント以下の全ての *.orig の古いのと symlink ファイルを消したい けど、find はオプション書くの難しくてやだなーとか、
  4. ./configure --libraries=/opt/include --prefix=/usr/local/hoge
    まで打ってから、あ、config.h 変えとかなきゃって思って vi config.h とまで打ったところで、あchmodせんとと思って chmod +w config.h したあとで、あああー、またvi config.hって 打つのかーって 思ってさらに編集し終わって、また ./configure うつのかーしくしく、とか、
  5. file `which mule` の ` ってうちづらいなーとか、
  6. fix-01.gz 〜 fix-11.gz があって、4〜10 だけあてたいなーとか、
  7. a000 〜 a255 という名前のファイルを作りたい。
  8. rm -rf dir[TAB] → rm -rf directory/ って / がつくと rm が rmdir してくれないので、手で / をいちいち消してるとか、
  9. pushd しまくって dirs したら /foo/bar が3つもあったとか、
  10. /usr/local/f[^D] → /usr/local/fi[^D] とかやってたら画面がどんど んスクロールしててって上が見えなくなっちゃったとか、
  11. .cshrc いじってエラーが出て、どこでバグってんのか探すの大変とか、
  12. さっきの foreach のループの中はヒストリに残ってないの? とか、
  13. "" の中に " を書けない等cshのバグどうにかなんないか なーとか、
  14. promptにcwd出してるんだけど、長くなって来るとやだなーとか、
  15. 次に打つコマンドはヒストリに登録して欲しくないなーだとか、
  16. ./myprogram | ./myfilter というパイプコマンド、あるいは alias してあるコマンドの実行時間を time ではかりたいとか、
  17. ls /usr/local/lib とかして、そのあとで ls -l !$/libfoo[Tab] って うっても !$ を考慮してくれなーい、とか、
  18. 違うディレクトリのファイルをまとめて編集したいから vi /etc/rc.d/{hogehoge,herohero} とかする予定だけど補完して欲しく て /etc/rc.d/{ho までうって反射的に [Tab] 打ってもピッってエラーが 出るだけでかなしー、とか、

上記のような不満はzshではそれぞれ以下のように解消される。

  1. setopt auto_cd しておけば、ディレクトリ名を打つだけでcd出来る
    (最近tcshにも実装されたらしい)
  2. rm *.o~hoge.o で hoge.o 以外の全ての *.o が消せる。
  3. rm **/*.orig(m+30) **/*(@) でOK。(setopt extended_globしておく)
  4. まず
    ./configure --libraries=/opt/include prefix=/usr/local/hoge
    と打ったところで悩む。ここで [ESC] q を打つと ./confiure... が消えて新しいコマンドラインが始まる。
    vi config.h
    と打ったところでさらに悩む。もう一度 [ESC] q を打つと vi config.h が消えてまた新しいコマンドラインが始まるので chmod +w config.h ぺし
    する。と勝手に vi config.h がコマンドラインに戻って来るので 編集してZZで終了。
    あら不思議、./configure --libraries... って長いのが 戻って来たところで
    [RET]
    をおしておしまい。実際にやってみないと分かんないかも…。でもこのコ マンドラインスタックって超便利。無いと生きてゆけなくなるよ。
  5. file =mule と、=コマンド名 で `which コマンド名` と同じ働きをする。 これ良く使うもんねー。
  6. gzcat fix-<4-10>.gz | patch -p
    のように、ワイルドカードの部分に <ここから-ここまで> のように数値 を指定すると数値的にその範囲内に当たるファイル名がマッチする。mhな んか使ってるとやっぱし便利。
  7. touch a{000..255} でOK。{from..to}とやるとfromからtoまでの数字が生 成される。{0..2}とやると 0 1 2 に {00..02} とやると 00 01 02 が生 成される。頭良すぎ。
  8. setopt auto_remove_slash すると、補完で末尾に補われた / が自動的に 削除される。必ず削除されるわけじゃなくて、ふふふ賢いんだなこれが。
  9. setopt pushd_ignore_dups すると既にpushdしたディレクトリはダブらせ ずにディレクトリスタックの先頭に持って来る。だからpushdしまくって も混乱しない!
  10. setopt always_last_prompt しておくと、カーソル位置は保持したままファ イル名一覧を順次その場で表示する。って分かんないね。tcshとかで ^D で一覧表示するとどんどんスクロールしちゃうけど、zshはしないって 事。
  11. zshなら定義ファイルにエラーがあった場合には、ファイル名と行番号を 表示してくれる。やー、これも泣きそうにありがたい。
  12. zshならforeachとかで打ち込んだ複数行をまとめてヒストリに登録してく れる。これだけのためにzshを起動する人もいる。
  13. まあ csh script を書かない人には関係ないかな。結構 csh ってバグが あるんですわ。ついでに関数も書けない。関数の使えない言語で スクリプトを書く気になりまっか?
  14. zshの場合 RPROMPT という変数でコマンドライン右側に出るプロンプトを 設定できます。おすすめは、
    PROMPT="%U$USER@%m%%%u "
    RPROMPT="[%~]"
    ってかんじかな。こうするとコマンドライン右側に [~/src] のようなカ レントディレクトリを示すプロンプトが出るんだけど、入力文字がどんど ん伸びて行って右プロンプトにぶつかると勝手に右プロンプトが消滅する。 これ結構感動的。
    (これも最近のtcshでは実装されたらしい)
  15. setopt hist_ignore_space しておくと、コマンドラインの先頭にスペー スをいれておくとそのコマンドはヒストリに追加しない。
  16. tcshではコマンドラインでパイプを使うとtimeで計れない。aliasの場合 は、あろうことか command not found になって実行すらできない。馬鹿。 zshではパイプラインに含まれる全てのコマンドの実行時間が計れ、もち ろんaliasでもOK。関数やマルチステートメントを含むaliasの場合も、そ れらを全て実行し終える時間を計りたいときは time (func) のように、 サブシェルの中で実行すればOK。もちろんパイプラインのコマンド一つず つじゃなくて、まとめて計りたいときもサブシェルの括弧に括れば良い。 cshはコマンドライン解析がアドホックな作りなのでこういう事は当分で きないじゃろ。time以外のシェル内部コマンドも、aliasなどを処理でき ない困りもの。
    tcsh% alias la 'ls -a'
    tcsh% repeat 3 la
    tcsh% la: command not found.

    きゃーすてきー! :-p もちろんzshの場合は
    zsh% alias la='ls -a'
    zsh% repeat 3 la
    . .. .hoge foo
    . .. .hoge foo
    . .. .hoge foo
    ちゃんとできるし
  17. ZSHは!$とか!:3とかが途中にあっても内部で展開してTab補完してくれる。
  18. ZSHは /some/other/{file1,file2} の中括弧のカンマのどの位置のファイ ルも補完してくれる。

どうじゃ、zshを使ってみたいと思ったかね。

なに、せっかく築き上げた .tcshrc を移植するのが難しそう。そんな君のため にわしが乗り換えガイドをつくって日本語風マ ニュアルパッケージの中に入れておいた。じゃが、せっかくこのページをを 見てくれた君のためにその改訂版を用意し た。もうひとつ、今わしがつこているコマンドライン 補完関数の定義ファイル(.zshcompctl)をおみせしやう。これには、 普段良く使うコマンドの 引数を補完するための記述のエッセンスが詰まっていると思うので、これをパク ればかなりの補完ができるようになるはずじゃ。

まだ迷っている君、tcshが便利だと惚れている君、tcshのカスタマイズならちょっ と自信があるぜいという君、そういう君こそzshのすごさが実感できるはずだ。 かくいうわしも以前はtcshにぞっこんだった。ま、とりあえずいちどつこてみたまえ。

tcshなんてうんこ

だって思っちゃうよ。
あ、言っちゃった…。

で、zshの小技集

プロンプト

非常にみーはーだが、わしのシェルプロンプトはカラフルなのだ。これは、zsh自身が疑似乱数 発生できるのと、プロンプトにエスケープシーケンスを通してくれる機構 があるからできる技。さらに他のどのシェルにもない機能として右側プロ ンプトがあり(と思ったらいつの間にかtcshが真似したらしい)、これらは zshユーザであることを他人に見せつけるためには一番楽な技なのでやり 方を教えやう。

結論からいうと .zshrc あたりに

setopt prompt_subst
PROMPT=$'%{\e[$[32+$RANDOM % 5]m%}%U%B$HOST'"{%n}%b%%%{\e[m%}%u "
RPROMPT=$'%{\e[33m%}[%~]%{\e[m%}'

と入れる。$'' は \e などのエスケープシーケンスを記述 できるクォート方式。もちろん\eはESC文字を示す。 以下説明。

まずプロンプトにエスケープシーケンスを通すオプションを立ててお く。これは .zshrc あたりに入れておくとよろし。

setopt prompt_subst

そしてプロンプトにエスケープシーケンスを含める。色を出すエスケープ シーケンスは、"ESC [ 色番号 m " で、番号と色の対応は標準状態の ktermなら、

3031323334 353637

となっていて、個人的に赤は暗くて見づらいので使いたくなく、白を出し てもしょうがないので、32〜36番の色が出て欲しい。ので乱数として0〜4 を出すようにしてそれに32を足す。てことで色を乱数で決める部分が、 PROMPTの

\e[$[32+$RANDOM % 5]m

のところ。zshでは $[ … ] で括った部分は数式と して計算してくれる。すげー($(( … )) でも可)。 さらにプロンプト文字列中のエスケープシーケンスを括るための記法 %{ … %} で括れば無事プロンプトの色が変わる。PROMPTの後半 \e[m でデフォルトの色に戻しておちまい。

もひとつ、RPROMPTで右側につけるプロンプトを設定。これも色をつけ ておけば目立ち度抜群。

ちなみに色をつけるのは見栄えだけの効果しかないかというとそんな ことはなくて、たった今打ったばかりのコマンドの出力がどこから始まる かを見付ける時に一瞬で見分けがつくのでものすごく楽ちん。

おすすめオプション

man zsh してもオプション変数がいっぱいあって、どれが便利なのか よーわからんというちみのために、「これだけつけときゃじうぶんじゃろ」 オプション一覧。

###
# Set shell options
###
setopt auto_menu auto_cd correct auto_name_dirs auto_remove_slash
setopt extended_history hist_ignore_dups hist_ignore_space prompt_subst
setopt pushd_ignore_dups rm_star_silent sun_keyboard_hack
setopt extended_glob list_types no_beep always_last_prompt
setopt cdable_vars sh_word_split auto_param_keys
初期化ファイルの例

zsh4時代の.zshrcマイルド版

提供リソース

訳しかけ zshcompsys マニュアル

自分がcompsysを理解するのに必要な部分を日本語風にした。 ここまで分かれば後は読まなくていいというところで作業をやめた。 誤訳多数あり。補足説明結構あり。

zshに乗り換えたい、compsysを極めたい、そんな人には zshの本が有効である。

zsh book

zshの本、やっと完成。544ページ。 補完の使い方に約70ページ、compsysのチューン法解説に 約70ページ(これでも書き足りないが)。

compsysヲ制覇シタイ
    ↓
一部日本語風compsysマニュアルヲ読ム
    ↓
「zshの本」ノ第5章ト第15章ヲ読ム
    ↓
  ワカル
    ↓
  書ケル

目次 / サポートページ


yuuji@gentei.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]