2008年1月18日金曜日

muttの弱点と克服

muttの弱点。
思うに1つありますねぇ。

「新規メールを書きながら、他のメールからコピペすることができない」

Windowsのメーラでは送信メールを書く場合、新規Windowが伴って作成されることが多いです。なので、他のメールを参照したり、コピペしたりは簡単。対してmuttはフツーに使うと、muttがエディタの終了を待ってしまいます。

[エディタ立上げ]→編集&保存→[送信確認]→[送信]

のフローでメール処理が進みますから、他のメールからコピペできないです。
ググっても良い解答はなかなか得られませんでした。

幾つか方法があるように思われます。
①別メールの参照用にmuttをもう一つ立ち上げる
②別メールの作成用にmuttをもう一つ立ち上げる
③別メールの参照機能をmuttに付加する(mutt改造)

③は重いので考えないっ。
②は別メールの作成といっても、全員返信やら、個別返信、転送、中継など色々な状況によってmuttは動きを変えます。別メールの作成用にmuttを立ち上げる時、いろんな立ち上げ方法を実装する必要が有りそうで、実現は難しいそうぅ。
ってことで①でしょうか。。。

単純にmuttを2つ立ち上げるのは、智慧が無いように思われるので、もう少しカッコよく、参照用またはメール作成用に別プロセスでmuttを立ち上げる方法を考えてみす。mutt(1.4)のコマンドラインオプションを見てみると下記。

引数なしに muttを実行すると Mutt はスプールメールボックスを読みに行きます。しかし、コマンドラインから指定してやることで他のメールボックスを読んだりコマンドラインから直接メールを送ったりすることも可能です。

-a メールにファイルを添付する
-b BCCのアドレスを指定
-c カーボンコピー (Cc) の宛先を指定する
-e 初期化ファイルが読まれた後に実行する設定コマンドを指定
-f 読み込むメールボックスを指定
-F 指定したファイルから初期化コマンドを読み込む
-h コマンドラインオプションについてのヘルプを表示
-H ドラフトとしてヘッダと本文を読み出すファイルを指定
-i メッセージ作成時に取り込むファイルを指定
-m デフォルトのメールボックスの種類を指定
-n システムの Muttrc を読まない
-p 延期していたメールを呼び出す
-R メールボックスを読み取り専用で開く
-s subject を指定 (空白を含むときは引用符で囲む)
-v バージョンとコンパイル時の定義を表示
-x mailx(1) の作成モードを真似る
-y mailboxes コマンドで指定されたファイルを含んだメニューを表示させる
-z メールボックスにメッセージが存在しないなら直ちに終了する
-Z 新しいメッセージのある最初のフォルダを開く、無いなら直ちに終了する

ほぅ~けっこうあるんですねぇ:-)

でっ、ちょっとだけ閃きましたぁ
muttがmコマンドやgコマンドでメール作成に取り掛かるとき、一時ファイルを作成し、このファイルを引数としてエディタ(set editot=プログラム で指定したもの)を起動します。エディタが終了してファイルがセーブされると、送信/保存の選択を聞いてきます。エディタが終了しても渡したファイルの内容に変化がないと、メール閲覧モードに移行します。なので、エディタとして例えば常に1を返すだけのtrueコマンドを使用すると、メール作成モードに入り、宛先とサブジェクトを指定した後すぐにメール閲覧モードに戻ってしまいます。
この動きを利用できそうです。エディタとして例えば下のようなスクリプト(hogetto)を指定します。

[editorhogex]
#!/bin/csh -f
xterm -e mutt -H $1 -e 'set editor=ne' &
sleep 1

上のhogettoスクリプトはメール作成モードの新しいmutt(-Hオプション)をxterm上で起動して、1秒待って終了します。なので元々のmuttは渡したファイルに変化がなかったのでメール作成モードを終了してメール閲覧モードへ戻ります。
メール作成モードで立ち上げたxterm上の新しいmuttは、一時ファイルを引数に与えて、エディタとしてこの場合`ne`を立ち上げます。

元々のmuttが作った一時ファイルを消去する前に新しいmuttがそれを確実に読み込んで立ち上がるために、sleep 1を入れて元々のmuttが動き出すまでに1秒の`待て`をいれてあります。

mutt -Hオプションは、与えられた一時ファイルからヘッダと本文をインクルードしますから、ヘッダ部分に宛先とサブジェクトが書かれていれば、それを用いてメールの雛型を作ってくれます。なので一時ファイルにヘッダを含めておく必要が有ります。このために、edit_header=yesとしておきます(muttのdefaultではedit_header=no)。

これで元々のmuttはメール参照モードへ戻り、新たにメール作成・送信用のmuttがxterm上で別ウィンドウとして立ち上がります。コピペも楽になりました。ここではxtermを使用していますが、ウィンドウマネージャとしてGNU screenを使用しているのであれば、-X オプションで立ち上がっているscreenへコマンドを送ることで別のセッションが作成できますね。またscreenは起動していると環境変数TERMにscreenを設定、環境変数STYに現在のscreenセッション名を設定してますので、この場合、

[editorhogescreen]
#!/bin/csh -f
if ($TERM == "screen") then
screen -S $STY -X screen mutt -H $1 -e 'set editor=ne'
else
ne $1
endif
sleep 1

このhogeronは、screenプロセスに対して、「screenを一面追加してそこでメール作成モードのmuttを起動させる」ことができます。screen の-Xオプションは即座にリターンしてきますので、この例では、&を付けてプロセスを分ける必要はありません。

一点、メール作成モードでmuttを立ち上げたとき、一時ファイルの内容から割り出した宛先でメール作成するかどうかをmuttが聞いてきます。これは不要なのですが。まぁリターンを2度叩くだけなので気にはなりませんが。

0 件のコメント: