vimのiabのよう略語展開

http://zshwiki.org/home/examples/zleiab

ZshWikiを漁っていたら、おもしろい設定を見付けた。
vimではiabで略語展開ができる(らしい)が、同様のことをzshでもやろうという設定だ。
ソースはこんなの。

setopt extended_glob

typeset -A abbreviations
abbreviations=(
  "Im"    "| more"
  "Ia"    "| awk"
  "Ig"    "| grep"
  "Ieg"   "| egrep"
  "Iag"   "| agrep"
  "Igr"   "| groff -s -p -t -e -Tlatin1 -mandoc"
  "Ip"    "| $PAGER"
  "Ih"    "| head"
  "Ik"    "| keep"
  "It"    "| tail"
  "Is"    "| sort"
  "Iv"    "| ${VISUAL:-${EDITOR}}"
  "Iw"    "| wc"
  "Ix"    "| xargs"
)

magic-abbrev-expand() {
    local MATCH
    LBUFFER=${LBUFFER%%(#m)[_a-zA-Z0-9]#}
    LBUFFER+=${abbreviations[$MATCH]:-$MATCH}
    zle self-insert
}

no-magic-abbrev-expand() {
  LBUFFER+=' '
}

zle -N magic-abbrev-expand
zle -N no-magic-abbrev-expand
bindkey " " magic-abbrev-expand
bindkey "^x " no-magic-abbrev-expand

.zshrcに加えるなりsourceするなりしてこの設定を読み込んだ後、たとえば「Im」と入力した後スペースを押すと、ぱっと「| more 」へと展開される!自動略語展開だ。スペースキーで反応するようになっている。
自動略語展開といえば、global alias機能(alias -g)があるのだが、それだとすべての場所で展開されてしまうから危険である。それに対してこの略語展開だとC-x SPCで展開させなくもできる。
なお、この設定はextended_globをonにしていないと動かないけど、zsh使いなら当然onにしているよね。「LBUFFER=${LBUFFER%%(#m)[_a-zA-Z0-9]#}」の行でextended_globの機能を使っているらしい。構文がcrypticすぎてなにがなんだかわからん。マニュアルもわかりにくいし…。
ただ、この設定には欠点があって、以下のように修正しないと「-Im 」が「-| more 」に展開されてしまう。_a-zA-Z0-9の前にハイフンをつけた。

magic-abbrev-expand() {
    local MATCH
    LBUFFER=${LBUFFER%%(#m)[-_a-zA-Z0-9]#}
    LBUFFER+=${abbreviations[$MATCH]:-$MATCH}
    zle self-insert
}

言うまでもないが、連想配列abbreviationsは自由に編集すればいい。最初の文字はべつにIでなくても大文字であればなんでもいい。略語は覚えやすく、かつコマンドラインに出てきなそうな文字列にしておこう。もちろん俺は「"Ir" "| ruby"」と入れている。だってrubyistだもん。

4日で途切れた

http://gigazine.net/index.php?/news/comments/20071102_halo3_landfall/ でリンクしてあるムービーをmplayerで見ようとしたら画面が真っ暗になった。理由はわからん。
でかすぎだからか?いや、テレビの録画も見ているからそれはないな…
6300kbpsと高ビットレートだからか?知らん。
コーデックが未対応だからか?さぁ…
幸いCtrl-Alt-Delが効いたから無事にunmountできた。ティウンティウン