5 月 11
emacs(Meadow 3.00-dev) の elscreen と iswitchb と mcomplete が便利でよかったんだけど、いつの頃からか、
C-z b(elscreen-find-and-goto-by-buffer) をしたときに、ミニバッファが↓の様になって、うまくいかない事件が発生。
[No match] [No match] [No match] [No match] [No match] …
調べてみると、*Message* バッファに次のエラーが。(数値の部分はその時々で変わる)
Error in pre-command-hook: (args-out-of-range 41 63)
ウチちの環境でこのエラーを再現する方法:
- emacs を起動。 (elscreen, iswitchb, mcomplete が使える状態)
- C-z b *Message* と入力しようとする
- [No match] [No match] … と出て、全くバッファ名にマッチしなくなる
- *Message* バッファに Error in pre-command-hook: (args-out-of-range 41 63) が出てる
- *Message* [No match] [No match] [No match] [No match] とかいう名前のバッファが新規作成される
ちなみに、 C-x b などでバッファを選ぶと問題ない。 C-z b の時だけ。
原因究明:
pre-command-hook とか言われても、どの hook がダメなのかさっぱりだったので、いろいろ追っかけて、elscreen と mcomplete の連携がうまくいってないことが判明。
ずっと、iswitchb が原因と思って iswitchb.el をデバッグしてたのに・・・。
mcomplete.el の 1093 行目付近の以下の箇所を修正。
修正前:
(mapcar #'(lambda (f) (put f 'mcomplete-mode '(:mode off)))
'(iswitchb-buffer iswitchb-buffer-other-window
iswitchb-display-buffer iswitchb-buffer-other-frame
ido-find-file ido-find-alternate-file ido-write-file
ido-insert-file ido-switch-buffer ido-insert-buffer
ido-kill-buffer ido-find-file-other-window
ido-find-file-other-window ido-switch-buffer-other-window
ido-display-buffer ido-find-file-other-frame
ido-switch-buffer-other-frame))
修正後:
(mapcar #'(lambda (f) (put f 'mcomplete-mode '(:mode off)))
'(iswitchb-buffer iswitchb-buffer-other-window
iswitchb-display-buffer iswitchb-buffer-other-frame
ido-find-file ido-find-alternate-file ido-write-file
ido-insert-file ido-switch-buffer ido-insert-buffer
ido-kill-buffer ido-find-file-other-window
ido-find-file-other-window ido-switch-buffer-other-window
ido-display-buffer ido-find-file-other-frame
ido-switch-buffer-other-frame
elscreen-find-and-goto-by-buffer
))
どうやら、mcomplete は、 iswitchb とかと競合しないように気を遣っているようだけど、elscreen は眼中になかったらしい。