« 2006年2月26日 - 2006年3月4日 | トップページ | 2006年3月26日 - 2006年4月1日 »

2006年3月15日 (水)

Mew でパスワード入力時 C-g を押しても止まってくれない

普通 Mew の Summary では 'i' [mew-summary-retrieve] を押したあと、パスワードの入力を求められる。私は複数の case を使い分けているのでこの入力を'C-g' [keyboard-quit] で止めようとすることがしばしばあるが、残念ながら止まってくれない。

特に今の Mew は +queue を flush する際に draft の case を使ってくれないので、case ごとに SMTP サーバを切り換えたりする私にとっては、'C-g' で +queue が flush されるのを阻止できないのが非常に不満だった。

この原因の一つは、Mew が inhibit-quit を真にして他のバッファでエディット中に'C-g' が押されてもバックグラウンドプロセスが影響を受けないようにしていることにある。mew-read-passwd を使うときには一時的に inhibit-quit を nil にして 'C-g' を使えるようにしているのだが、その返り値が 'C-g' を押された結果の空文字列であったとしても、その後の関数内で処理を怠っているのだ。

原因のもう一つは、flush が処理が完了してなかろうとも実行されてしまうことにある。

そこで、少しダーティだが、mew-read-passwd に advice して 'C-g' が押されているかもしれないなら大域脱出し、process 終了後の hook を使い、処理が完了していなければflush しないようにした。以下のようにすれば良いようだ。

;; パスワードが入力されなかった場合、+inbox フォルダのプロセスを kill し、
;; エラーを signal する。
(defadvice mew-read-passwd
  (around mew-read-passwd-enable-quit (prompt) activate)
  (let ((pass ad-do-it))
    (when (or (null pass) (string= pass ""))
      (save-excursion
        (set-buffer (mew-inbox-folder))
        (when mew-summary-buffer-process
          (mew-summary-kill-subprocess)))
      (error "Empty Password or Keyboard quit."))))

;; 実行時スコープが甘い Lisp だからこそできる荒業
(add-hook 'mew-pop-sentinel-hook
          (lambda ()
            (if (or error (not done))
                (setq flush nil))))


副作用としてパスワードに空文字列が使えなくなるが、多くの場合問題ないものと思う。
更新: 2006-03-15
初公開: 2006年03月15日 13:37:02
最新版: 2006年03月18日 10:53:18

2006-03-15 13:36:57 (JST) in Emacs/Meadow | | コメント (0) | トラックバック (2)