skeleton での minibuffer 入力時に C-h を help にしない

ちょっとした shell script を Emacs で書く時には skeleton 機能が便利なのでよく使っている。C-cC-t (sh-tmp-file) で

TMP=${TMPDIR:-/tmp}/sample.sh.$$
trap "rm $TMP* 2>/dev/null" 0

こんなのを挿入*1してくれたり、C-cC-i (sh-if) だと

if [  ]; then
    
else
    
fi

こんな風になったりとか。if の condition のところは minibuffer からインタラクティブに指定できたりする。便利。

それはいいんだけどさ。

この minibuffer で文字を入力する際に C-h で文字を消そうとすると help が表示されて、わざわざ BS を押し直さなきゃいけないのでどうにもリズムを狂わされる。普段は minibuffer でも C-h で文字が消えてくれるのに。面倒なのでずっと放置してたけど、今日は気が向いた*2ので skeleton.el のソースを眺めてみた。

元凶についてはよく判りませんでした orz。なんで skeleton の時だけ help になるんだろう。skeleton.el で bind しなおしてんのかと思ってたけどそうでもないっぽいし。なんか見逃してんのかなあ…。もしかしてこんなんなるのはウチだけ? テメエの .emacs が悪さしてたりして。とりあえず目的だけは

(defadvice skeleton-read (around unbind-c-h activate compile)
  (let ((help-char ?\M-?))
    ad-do-it))

こんなんで達成できたのでヨシとしよう。自分は help-command は M-? に割当てているので、ここでも同様の割当てに。原因についてはまた気が向いた時にでも。

余談

あー、そう言えば Bulkfeeds 経由で カーソルの位置にデバッグ用のprintfを挿入 - higepon blog とか 「カーソルの位置にデバッグ用のprintfを挿入」をひと工夫 - 趣味的にっき あたりの話が流れてきてましたが、そんな時こそ skeleton かと。まあ、単純なやつならベタに書いたほうが早いけど。

余談その2

あー、そう言えばここんとこ Ruby を書く機会が多かったんですが、Ruby 用の skeleton ってないんですかね。ちょっとググるska-skel-ruby.el ってのが見っかりましたが Ruby で頻出の定型文ってこんなもんだっけ? たまにしか使わないからピンとこないな。とりあえずこれを入れといてみよ。

*1:ホントは mktemp がある環境ならそっちを使って欲しいところ

*2:何度も遭遇してムカついたともいう