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