zsh設定の一部を晒す

This entry was posted by on Friday, 23 February, 2007

漢のzsh』の連載開始はひとまずめでたい。それの需要をあてこんで、わたしの設定の一部を衆目に晒し、解説を試みる。機能を知ったり、手元のzshを調整する際の参考になれば幸い。

まずオプションだ。オプションはいっぱいある。zshoptions(1) はわたしが昔、翻訳したものがあるので興味のある人は参照のこと。

unsetopt NO_GLOB MAIL_WARNING setopt ALWAYS_TO_END setopt APPEND_HISTORY setopt AUTO_CD setopt AUTO_LIST setopt AUTO_MENU setopt AUTO_PARAM_KEYS setopt AUTO_PARAM_SLASH setopt AUTO_PUSHD setopt AUTO_REMOVE_SLASH setopt COMPLETE_IN_WORD setopt CORRECT setopt CORRECT_ALL setopt EXTENDED_GLOB setopt EXTENDED_HISTORY setopt GLOB_COMPLETE setopt GLOB_DOTS setopt HIST_IGNORE_DUPS setopt HIST_IGNORE_SPACE setopt IGNORE_EOF setopt INTERACTIVE_COMMENTS setopt LIST_TYPES setopt LONG_LIST_JOBS setopt MAGIC_EQUAL_SUBST setopt SHARE_HISTORY setopt SUN_KEYBOARD_HACK setopt PUSHD_IGNORE_DUPS setopt ZLE

まぁ、正直なところ、なんでやってるんだか忘れているものも多いんだが……。

まず何はなくても AUTO_PUSHD だ。最近の人は pushd を知らないかもしれない。たいていのシェルにはディレクトリをスタックとして保持する機能がある。 pushd コマンドは cd コマンドのようにカレントディレクトリを移動させるが、移動前のディレクトリをスタックに push する。 popd コマンドというものもあり、これはディレクトリスタックを取り出して、そのディレクトリに移動する。いくつかのディレクトリを行き来するときに便利だ。でも pushd とかいちいち打たないでしょ。手が cd って覚えているからね。でも AUTO_PUSHD しておくと cd コマンドが pushd 扱いになる。わたしは

alias pd=popd

としていて、popdも手軽にできるようにしている。なお、 PUSHD_IGNORE_DUPS とすれば、ディレクトリスタックに push しようとしたとき、スタックを探査して重複があれば重複の方を消してから push する。これは好き好きだろう。

HIST_IGNORE_DUPS。同じくヒストリから重複を除く……のではなく、実行したコマンドが直近のヒストリと同じときにはヒストリに加えない。ほら、よくあるでしょ。gccを実行してみたら何やらエラーが出て、しかたないからデバッグしながら何度も同じコマンドを実行して、それから改めてコマンドを実行しようとしたらヒストリの闇のなか、みたいなのが(おれだ)。ああいうムダっぽい重複を省くのがこれだ。

HIST_IGNORE_SPACE がオンになっているとき、コマンドの先頭に空白を入れて実行するとヒストリに入らない。zshユーザにはヒストリをムダに思えるほど長くする者が多いが、そういうとき、ちょっとファイルとして保存されると困るようなコマンドはこれを使う。ただし、実行直後のプロンプトからは見えている。なぜかというと、「先頭に空白を入れて無視させようとしたコマンド」にtypoやミスがあったときには気軽に修正したいのが人間の常だからだ。そんなところにも気が効いている。

SHARE_HISTORY によって zsh は複数のコマンド間でヒストリを共有できる。仕組みとしては単純で、頻繁にヒストリファイルを読み直し、あるいはすぐにヒストリを書き込む。仕組みとしては単純だが、ヒストリファイルによって共有するのには利点もあって、HOMEさえ共有していればほかのマシンででもヒストリを共有できる。

あと、ちょっと目立つのは SUN_KEYBOARD_HACKS か。誤解されないように書いておくと、おれは SUN のキーボードは使ってない。

>

行がバッククォートで終端し、この行に奇数個のバッククォートがあるとき、末尾のバッククォートを無視する。このオプションは、リターンキーがとても小さくて、バッククォートのキーがリターンのすぐ近くにあるようなキーボードで便利である。

……そういうオプションだ。でもまぁ、これは昔追加しただけで今はあまり意味ないかも。

ちなみに、 zsh には typo を推定する機能があるが、これはキーボードレイアウトに依存している。aの隣がsやzやqやwだということをzshは知っていて、その情報を誤り訂正に使っている。わたしは使っていないから関係ないが、 DVORAK 配列を使っている人は zsh のオプションに DVORAK を指定するといい。

次。プロンプト。

PROMPTTTY=`tty | sed -e 's/^\/dev\///'` PROMPT="[%B${cyan}%~${default}%b] <%B${PROMPTTTY}%b> %E %b%# " if [ `whoami` = root ]; then RPROMPT="${red}%B%n${default}%b@${logreen}%m${default}%b" else RPROMPT="${loyellow}%n${default}%b@${logreen}%m${default}%b" fi SPROMPT="${red}Correct ${default}> '%r' [%BY%bes %BN%bo %BA%bbort %BE%bdit] ? "

プロンプトはシンプルにしている。そういえばこれは、 colors の設定を知らないころに書いた設定なので、色の設定のしかたが普通と違う。ちょっと恥ずかしい。でもまあ、そこは適当に良みかえてほしい。

世のzshユーザはRPROMPTにパスを入れるのが大好きなようだが、わたしには理解しがたい。あんなモンが右側から迫ってきたらジャマで仕方ないだろうと思うんだが。RPROMPTには自分のユーザ名とホスト名を配置。自分が root のときは赤色に変えている。これは『漢のzsh』の後藤さんといっしょかな。

ではパスはどこに表示するか。むろん PROMPT だが、ここには改行を入れられることを知らない人が多いのかもしれない(たしかtcshなどではPROMPTに改行ひとつ入れるのもしんどいようだ)。パス名などはPROMPTの頭の方に入れておきしかるのちに改行する、これだ。むろん、プロンプトが複数行になるのがイヤというのは個人の感情論だからイヤならやめればいいが、その程度で何が変わるのかってのは、いっぺん考えてみた方がいいと思うよ。

ちなみに色だが、

autoload colors

として、あとは $colors[red] とかのように書けばよい……んだったと思った。これは比較的新しいzshの機能である。くわしくは fpath の colors ファイルを見るといいだろう。

WORDCHARS='*?_-.[]~=&;!#$%^(){}<>' autoload -U compinit compinit zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z} m:{A-Z}={a-z}' zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} compdef _man w3mman compdef _tex platex

まぁこの辺は zsh ユーザでやらないやつはいないだろうし、そのうち連載でも解説されるだろうから略。見て感じろ。

あーただ、 matcher-list について、私はかなりアグレッシヴな設定にしているが、これはときどきイラつくことがある。とくに autotool を使っているソフトウェアのディレクトリで、 INSTALL と install.sh の両方がひっかかってうまく補完されず、ムカつくことがある。でも時々便利なのでこうしている。

alias h='history 1' alias j='jobs' alias cp='nocorrect cp -i'

エイリアスで特徴的なのはこの辺かな。とくに jobs は頻繁に使う(はず)なので、 j と1打鍵で済ませた方がいい。 nocorrect は zsh の予約語で、以降のコマンドにおける訂正を抑制する効果がある。 cp なんかでは新しくファイルを作ることが多いから、いちいち訂正を出されるよりはこのようにするといい。ほかにも mv、mkdir、touchなどもそうだろう。

ああそれからむろん、w3mman=manというエイリアスをしている(そのため上記のような設定をしている)。一発で完璧にマニュアルを探索できるという稀有な人間を除いて、w3mmanの方がハイパーリンクがあって便利だ。まぁ、知らない人はいないだろうけれど。

alias -g L='| lv' alias -g H='| head' alias -g T='| tail' alias -g G='| grep' alias -g W='| wc' alias -g S='| sed' alias -g A='| awk' alias -g LE='|& less' alias -g HE='|& head' alias -g TE='|& tail' alias -g GE='|& grep' alias -g WE='|& wc' alias -g SE='|& sed' alias -g AE='|& awk'

global alias はこんなもの。いろいろあるが、この辺は知り合いの人を真似してやったもので、今になって見返すと L と G 以外は滅多に使わないからなくてもいいと思う(HとTも使わないことはないが)。ほかの知り合いに |ruby を R に設定しているという人もいたけど、わたしはやっていない。

おっとそうだヒストリ。

HISTFILE=$ZDOTDIR/.zsh_history HISTSIZE=20000 SAVEHIST=200000000

まぁこんなところで。

Comments are closed.