[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 メーリングリストの案内