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)

ウチちの環境でこのエラーを再現する方法:

  1. emacs を起動。 (elscreen, iswitchb, mcomplete が使える状態)
  2. C-z b *Message* と入力しようとする
  3. [No match] [No match] … と出て、全くバッファ名にマッチしなくなる
  4. *Message* バッファに Error in pre-command-hook: (args-out-of-range 41 63) が出てる
  5. *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 は眼中になかったらしい。