[Mew-dist 305] Re: Why ^@ ?
SAKAI Kiyotaka
ksakai at example.com
1996年 12月 18日 (水) 13:41:14 JST
>> In article <19961129073530I.harunaga at example.com>, HARUNAGA Hirotoshi / 春永浩敏 <harunaga at example.com> writes:
>> その時の話では,原因はmuleの画面表記の速度が速過ぎてmew(+MH)の処理速度が
>> 追い付かないためということになっていて,結局,mew.elの要所要所に
>> (let ((process-connection-type nil))
>> を入れれば,とりあえず,このエラーは起きなくなるとの話になっていました.
> という情報があって、そのパッチを当てたら1.06では問題なくなったのですが、
> 1.54にバージョンアップしたら、また同じ現象が始まりました。
fj.editor.mule に流れた以下の記事のことですね。
単に、Mew はこのパッチを取り込んでいないだけだと思います。
Subject: [Solved] Linux 1.2.x + Mule 2.3 + Mew 1.06 (scan trouble)
From: his at example.com (ITO N. Hisashi)
Newsgroups: fj.editor.mule
Date: 15 Aug 96 05:56:38 GMT
Message-ID: <HIS.96Aug15145638 at example.com>
Organization: Toho Univ., Japan
Lines: 200
NNTP-Posting-Host: kuro.is.sci.toho-u.ac.jp
いとー@江戸川区 と申します。
以下のことは、ひょっとすると、もうすでに知られていることかもし
れませんが、そうだとしたらお許しください。_o_
------------------------------------------------------------------
Linux 1.2.{10,13} で Mule 2.3 と Mew 1.06 を使っているのですが、
次のようなトラブルがありました:
症状 --- mew を起動し、フォルダーの中のメールの一覧を表示させ
ようとすると、表示ができたりできなかったりする。
例えば、s を押し Range: all として、全てのメールを
scan させようとすると、一覧が表示ができたりできなかっ
たり、一部だけ表示できたり、いろいろなことがおこる。
一覧が表示できないということは、そのメールの内容も見
る事ができないということになる。
原因 --- mh の scan を子プロセスとして起こして、その出力を buffer
に納めるのだが、その出力に、どうやら ^@ (0x00) がまぎれこ
んでしまうようだ。これは、たぶん、Linux 1.2.x の pty のバグ
または仕様(?)なのでしょう。
# 未確認情報ですが、Linux 1.3.90 くらい以降とか 2.x とかでは
#直った(つまり、mew はちゃんと動く)ようです。
対策 --- Mule は子プロセスとの通信の際、デフォルトでは pty を使う。
pty を使わないで pipe を使うように、process-connection-type
という変数を nil にして、関数 start-process を呼び出すよう
にすればよい。 具体的には、次のパッチ:
ちなみに、Emacs Lisp Manual には process-connection-type について以下
のような記述があります。
-- Variable: process-connection-type
この変数は、非同期サブプロセスとの通信に使われるデバイスの種類を
制御します。この変数が`nil'以外の場合、PTYが利用可能ならばPTYが使
われます。それ以外の場合は、パイプが使われます。
PTYの場合、ジョブ・コントロール(`C-c'、`C-z'など)を使ってプロセス
やその子プロセスを制御できるのに対し、パイプはプロセスの制御がで
きません。このため、Shellモードのようにプロセスがユーザーから見え
る場合、通常はPTYが適しています。プログラムが内部的に使うプロセス
の場合は、パイプの方がより効率的なため、通常はパイプを使うのが適
切です。また、多くのシステムではPTYの総数が限られているため、PTY
を浪費しないほうがよいでしょう。
`start-process'が呼び出されると、`process-connection-type'の値が
使われます。このため、`start-process'の呼び出しの周辺だけでこの変
数を束縛すれば、特定のサブプロセスとの通信方法を指定できます。
(let ((process-connection-type nil)) ; パイプを使います。
(start-process ...))
特定のサブプロセスがパイプとPTYのどちらを実際に使っているかを調べ
るには、`process-tty-name'関数を使います(*Note Process Information::)。
という訳で、以下のパッチのように、Mew で start-process を実行する前に
は、必ず process-connection-type を nil に bind するのがいいかと思いま
す。
--
酒井 清隆 (E-mail: ksakai at example.com)
===================================================================
RCS file: RCS/mew.el,v
retrieving revision 1.2
diff -u -r1.2 mew.el
--- mew.el 1996/12/18 04:22:25 1.2
+++ mew.el 1996/12/18 04:23:16
@@ -1443,6 +1443,7 @@
(if (mew-y-or-n-p (format "Start %s? " program))
(let ((mc-flag nil)
(file-coding-system (if mew-mule-p *noconv*))
+ (process-connection-type nil)
pro file)
(if (not (file-exists-p mew-temp-dir))
(mew-make-directory mew-temp-dir)) ;; just in case
===================================================================
RCS file: RCS/mew-scan.el,v
retrieving revision 1.1
diff -u -r1.1 mew-scan.el
--- mew-scan.el 1996/12/18 04:14:54 1.1
+++ mew-scan.el 1996/12/18 04:16:26
@@ -46,7 +46,7 @@
(if (null (mew-summary-exclusive-p))
()
(condition-case err
- (progn
+ (let ((process-connection-type nil))
(message "Incing ...")
(goto-char (point-max))
(setq mew-summary-inc-start (point))
@@ -179,7 +179,7 @@
(if (null (mew-summary-exclusive-p))
()
(condition-case err
- (progn
+ (let ((process-connection-type nil))
(message "Scanning %s ..." folder)
(let ((buffer-read-only nil))
(if (equal erase 'erase)
===================================================================
RCS file: RCS/mew-virtual.el,v
retrieving revision 1.1
diff -u -r1.1 mew-virtual.el
--- mew-virtual.el 1996/12/18 04:21:34 1.1
+++ mew-virtual.el 1996/12/18 04:21:54
@@ -188,7 +188,7 @@
(if (null (mew-summary-exclusive-p))
()
(condition-case err
- (progn
+ (let ((process-connection-type nil))
(message "Scanning %s ..." vfolder)
(let ((buffer-read-only nil))
(erase-buffer))
===================================================================
RCS file: RCS/mew-draft.el,v
retrieving revision 1.1
diff -u -r1.1 mew-draft.el
--- mew-draft.el 1996/12/18 04:25:13 1.1
+++ mew-draft.el 1996/12/18 04:26:53
@@ -535,7 +535,8 @@
(mimedir (mew-expand-file-name mimefolder))
(msg (file-name-nondirectory (buffer-file-name)))
(fcc nil)
- (delete nil))
+ (delete nil)
+ (process-connection-type nil))
(set-buffer-modified-p t) ; Make sure buffer is written
(let ((file-coding-system (if mew-mule-p mew-mule-charset-mime-trans)))
(save-buffer)
===================================================================
RCS file: RCS/mew-ext.el,v
retrieving revision 1.1
diff -u -r1.1 mew-ext.el
--- mew-ext.el 1996/12/18 04:25:10 1.1
+++ mew-ext.el 1996/12/18 04:27:06
@@ -356,7 +356,8 @@
(defun mew-ext-url (begin end params)
(let ((url (mew-syntax-get-member params "url"))
(size (mew-syntax-get-member params "size"))
- (buffer-read-only nil))
+ (buffer-read-only nil)
+ (process-connection-type nil))
(erase-buffer)
(insert "# # ###### #\n"
"# # # # #\n"
===================================================================
RCS file: RCS/mew-pgp.el,v
retrieving revision 1.1
diff -u -r1.1 mew-pgp.el
--- mew-pgp.el 1996/12/18 04:25:07 1.1
+++ mew-pgp.el 1996/12/18 04:39:28
@@ -101,7 +101,7 @@
(setq mew-pgp-string nil)
(setq mew-pgp-decrypt-msg nil)
(setq mew-pgp-decrypt-failure nil)
- (let (file3 process)
+ (let (file3 process (process-connection-type nil))
(if (not (file-exists-p mew-temp-dir))
(mew-make-directory mew-temp-dir)) ;; just in case
(setq file3 (make-temp-name mew-temp-file))
@@ -133,7 +133,7 @@
(setq mew-pgp-running t)
(setq mew-pgp-string nil)
(setq mew-pgp-sign-failure nil)
- (let (file2 process)
+ (let (file2 process (process-connection-type nil))
(if (not (file-exists-p mew-temp-dir))
(mew-make-directory mew-temp-dir)) ;; just in case
(setq file2 (concat (make-temp-name mew-temp-file) mew-pgp-ascii-suffix))
Mew-dist メーリングリストの案内