[Mew-dist 3242] Re: Emacs displays my pop password on minibuffer

Kazu Yamamoto ( 山本和彦 ) Kazu at example.com
1997年 12月 22日 (月) 16:29:08 JST


From: Motohiko Minakuchi <mina at example.com>
Subject: [Mew-dist 3204] Emacs displays my pop password on minibuffer
Date: Tue, 16 Dec 1997 19:42:13 +0900 (JST)

> そのとき、mew-summary-get が完了した直後に「Emacsのヘルプ」
> を起動するとミニバッファに
>     「p a s s w d RET C-h (Type ? for further options)」
> という内容が表示されてしまいますます。
> 上記の「p a s s w d」の部分に、直前に入力したパスワードが
> 1桁おきに表示されるのです。

このバグは昔報告されていましたが、再現できなかったのでそのままでした。
(motonori さんは、再現できたらしいので、詳しく聞こうと思っていたけど、
忘れていました。)

今回めでたく再現できましたので、必死の追跡を敢行したしたところ、おそら
く read-char のバグであろうという結論に至りました。(Emacs を C レベル
で追うのは、泣きそうです。)

パスワードに必要だと説得しても、どうせ Stallman は聞く耳を持たないでしょ
うから、read-char を直すのはあきらめて、read-key-sequence を使うことに
しました。

reset-this-command-lengths が Emacs 20 から提供されているところをみる
と、やはり Emacs 19 のキー入力の echo まわりは buggy のようです。

パッチを作るのがめんどうなので、ソースを送ります。想像できるように、
Emacs 19 では、まだ RET (パスワードの最後の文字)が echo されますが、
reset-this-command-lengths が提供されていないのでしょうがありません。

とりあえず、幸せになれるのではないかと思います。

P.S.

今年のクリスマスプレゼントは、MagicPoint にすると決めました。よって、
次の Mew の stable バージョンを長靴に入れてまわる余裕はないように思い
ます。(マニュアル書かなきゃ。)

(defun mew-read-passwd (prompt)
  (let ((pass)
	(c 0)
	(echo-keystrokes 0)
	(ociea cursor-in-echo-area)
	(inhibit-input-event-recording t))
    (unwind-protect
	(progn
	  (setq cursor-in-echo-area 1)
	  (while (and (/= c ?\r) (/= c ?\n) (/= c ?\e) (/= c 7)) ;; ^G
	    (message "%s%s"
		     prompt
		     (make-string (length pass) ?.))
	    ;; Since read-char is buggy, password is echoed if
	    ;; type C-u. So, use read-key-sequence instead.
	    (if (fboundp (function event-to-character))
		(setq c (event-to-character (aref (read-key-sequence nil nil) 0)))
	      (setq c (string-to-char (read-key-sequence nil nil))))
	    (if (char-equal c ?\C-u)
		(setq pass "")
	      (if (and (/= c ?\b) (/= c ?\177))
		  (setq pass (concat pass (char-to-string c)))
		(if (> (length pass) 0)
		    (setq pass (substring pass 0 -1))))))
	  (setq cursor-in-echo-area -1)
	  )
      (setq cursor-in-echo-area ociea)
      nil)
    (message "")
    (sit-for 0)
    ;; this deletes the last "RET".
    (if (fboundp (function reset-this-command-lengths))
	(reset-this-command-lengths))
    (substring pass 0 -1)
    ))

--かず



Mew-dist メーリングリストの案内