[Mew-dist 08054] Re: [Mew-Win32 01246] Re: Code conversions on Mew.

Kyotaro HORIGUCHI kyota at example.com
1999年 3月 12日 (金) 18:06:45 JST


堀口です. お騒がせしましたが, ごちゃごちゃいってても仕方がないの
 でとりあえずでっち上げてみました. どうでしょうか?

とりあえず話の流れは

  現在の mew の elisp コード内でのプロセス実行に絡む部分の文字列
 の扱いが混乱しているように見える.

  これは Mule のプロセス呼び出しの際の引数のエンコーディングが不
 完全であることに起因している.

  これを解決するには Emacs の出口ぎりぎりまでは内部コードで扱って, 
 外に出る直前に # Muleに勝手にコード変換されないような # 表現にし
 てしまえばよい.


 というわけで, im 側の改造も必要になってしまいますが, とりあえず
以下のようなものを作ってみました.

  mew から im を呼び出すときは特定のコマンドの特定のパラメータに
 対してはパラメータの引数だけを丸ごとメイルのヘッダと同じ(Mew の
 ソレとは正確には違いますが)エンコーディングをかけて送る.

  例: --expression=body=設定
      ==>  --expression==?iso-2022-jp?B?Ym9keT0bJEJAX0RqGyhC?=

  im 側ではそれを識別してデコードしてパラメータとして扱う.


一方当然制限が出てきて,

 ・パラメータに本当に=?iso-2022-jp?B?Ym....?= という値を設定した
   いときに im 側で勝手にデコードされてしまう.


 ですが, 適応するコマンドとパラメータは簡単に設定できるので問題に
なるようなことはないと思います(^^;) とりあえず実験として, imgrep 
の expression パラメータに対してこれを行ってみました.

 添付したファイルでは imgrep へのパッチとそれ対応の 
mew-process.el です. パッチは jcode.pl を使ってとあえずデコードで
きるようにしただけのものです.

 これは mew を起動した後で, 適当に読みこめば使えるようになります.

.emacs で 

 (add-hook 'mew-init-hook '(lambda ()(require 'mew-process)))

でもいいです. 対象は Mew-1.94b13 と im-110 です.

# ちなみにわたしの環境は Meadow 1.0/WinNT4.0 です.

-- 
堀口恭太郎 

-------------- next part --------------
;; mew-process.el

;; mew-process.el encodes arguments passed to im* by same manner to
;; mail-header encoding. this can protect argument from mule argument encoding
;; with native coding system.

;; This module can use by implement paramter decoding maneuver into im*

;; mew-process-encode-paramter-alist is alist that indicate what parameters to
;; be encoded. format is
;; ( (PROGRAM NAME . LIST-OF-ARGUMENTS-TO-BE-ENCODED) ...)
(defvar mew-process-encode-argument-alist 
  (list (cons mew-prog-imgrep '("expression"))))

;; mew-process-encode-arguments make argument list encoded.
(defun mew-process-encode-arguments (PROGRAM args)
  (let (target param-name param)
    (if (setq target (cdr (assoc PROGRAM mew-process-encode-argument-alist)))
	(mapcar 
	 (lambda (str)
	   (if (and (string-match "^--\\([a-zA-Z0-9]+\\)=\\(.*\\)$" str)
		    (member (setq param-name (match-string 1 str)) target))
	       (progn
		 (setq param (match-string 2 str))
		 (concat "--" param-name "="
			 (if (equal (mew-charset-guess-string  param)
				    mew-us-ascii)
			     param
			   (mew-header-encode param))))
	     str))
	 args) ;; mapcar
      args))) ;; else

;; mew-call-process is alternative call-process for mew with process argument
;; encoding
(defun mew-call-process (PROGRAM &optional INFILE BUFFER DISPLAY &rest args)
  (interactive)
  (apply 'call-process PROGRAM INFILE BUFFER DISPLAY
	 (mew-process-encode-arguments PROGRAM args)))

;; mew-start-process is alternative start-process for mew with process
;; argument encoding
(defun mew-start-process (NAME BUFFER PROGRAM &rest args)
  (interactive)
  (apply 'start-process NAME BUFFER PROGRAM
	 (mew-process-encode-arguments PROGRAM args)))

;; these code overrides mew-funcs.el to use mew-(call|start)-process as
;; substitutes for (call|start)-process

(defun mew-im-call-process (msg prog &rest arg)
  (let (ret)
    (and msg (message "%s ..." msg))
    (setq ret (apply (function mew-call-process)
		     prog nil t nil (append arg mew-prog-im-arg)))
    (if (equal ret 0)
	(progn
	  (and msg (message "%s ... done" msg))
	  t)
      (if msg (message "%s ... failed" msg) (message "failed"))
      nil)))

(defun mew-im-call-process-no-output (msg prog &rest arg)
  (let (ret)
    (and msg (message "%s ..." msg))
    (setq ret (apply (function mew-call-process)
		     prog nil nil nil (append arg mew-prog-im-arg)))
    (if (equal ret 0)
	(progn
	  (and msg (message "%s ... done" msg))
	  t)
      (if msg (message "%s ... failed" msg) (message "failed"))
      nil)))

(defun mew-im-start-process (prog name &rest arg)
  (apply (function mew-start-process)
	 name (current-buffer) prog
	 (append arg mew-prog-im-arg)))

(provide 'mew-process)
-------------- next part --------------
*** imgrep.org	Thu Mar 11 21:43:32 1999
--- imgrep	Fri Mar 12 17:41:06 1999
***************
*** 8,13 ****
--- 8,15 ----
  ### Revised: Mar 10, 1999
  ###
  
+ require "jcode.pl";
+ 
  BEGIN {
      
      
***************
*** 25,30 ****
--- 27,33 ----
  use IM::Folder;
  use IM::Grep;
  use IM::Util;
+ use IM::EncDec;
  use integer;
  use strict;
  use vars qw($Prog $EXPLANATION @OptConfig
***************
*** 107,112 ****
--- 110,122 ----
  
  @opt_src or @opt_src = ( $default_folder );
  @default_ranges = ( @ARGV ? @ARGV : 'all' );
+ 
+ &jcode'init;
+ 
+ if($opt_expression =~ /^=\?[^?]+?(.*)?=$/){
+   $opt_expression = &mime_decode_string($opt_expression);
+   &jcode'jis2euc(*opt_expression);
+ }
  
  if ( $opt_format eq 'number' and @opt_src > 1 ) {
      $opt_format = 'path';


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