Last modified: Wed Oct 20 10:13:13 JST 2004
最新の Gnus 5.11 や Gnus 5.10 を日本語環境で使うときに役に立つ設定 です。~/.gnus.el ファイルに書き込んでご利用下さい。中 には Gnus 5.8.8 や Gnus 5.9 でも有効なものがあります。

Gnus の web サイト: http://www.gnus.org/

ご質問等の宛先:
(concat [60 121 97 109 97 111 107 97 64 106 112 108 46 111 114 103 62])

目次:

  • ○ 最新の Gnus を使おう!
  • ○ XEmacs では LANG=C で make
  • ○ MIME ではない日本語のメールのデコード
  • ○ 送信するニュース記事に CTE: 8bit を付けない
  • ○ 送信時に使う charset の優先順位の指定
  • ○ Message バッファを独立した frame にする
  • ○ グループパラメータの操作の一例
  • ○ 新しい gnus-other-frame コマンド
  • ○ POP before SMTP
  • ○ いろいろな色
  • ○ 不揃いな summary 行
  • ○ ヘッダを FLIM でエンコードする
  • ○ cl が load されないようにする
  • ○ 正しく digest フォワードができるようにする
  • ○ フォワードする記事ヘッダの整形
  • ○ 名前が日本語の添付ファイル
  • ○ 名前が日本語の添付ファイル (その2)

    ご注意: 憎むべき spammer に対抗するため、実在のメールアドレスの 表記に簡単な elisp の式を使っていることにご注意下さい。
  • ○ 最新の Gnus を使おう!

    なるべく最新の Gnus を使うことを強く勧めます。Gnus の開発には 世界中の多くの人が関わっていて、その内容は日々変化しています。 それは、ほとんどの場合に有用な改善であり、まれにバグが含まれて しまったとしても多くは次の日までに修正され、常に高い品質が維持 されているのです。まずは ding メーリングリストに参加しましょう。 英語が得意でなくたって気にする必要はありません。変な英語の文章 を投稿したからといって、それをからかったり非難する人はいません から大丈夫です。購読を申し込むには、本文に

    subscribe ding
    と書いたメールを以下のアドレス宛に送って下さい。

    (concat [100 105 110 103 45 114 101 113 117 101 115 116 64 103 110 117 115 46 111 114 103])

    または
    subscribe ding <youraddress@example.com>
    と書いて、記事の配送先を指定することができます。最新の Gnus の入 手には CVS を使うのが便利です。login と checkout のやり方につい ては、以下の web ページを見て下さい。
    http://www.gnus.org/distribution.html
    さて、この文章を読んで下さっている方のために、あまり一般的では ないメーリングリストの情報をお教えしましょう。本文に
    subscribe ding-cvslog
    または
    subscribe ding-cvslog Your Name <youraddress@example.com>
    と書いたメールを以下のアドレス

    (concat [100 105 110 103 45 99 118 115 108 111 103 45 114 101 113 117 101 115 116 64 103 110 117 115 46 111 114 103])

    に送ることによって、Gnus が CVS で変更されるたびに発信される log メッセージを受け取ることができます。

  • ○ XEmacs では LANG=C で make

    XEmacs はファイル最下端にある Local Variables: セクションの coding: 項で指定された coding-system を正しく処理することがで きません。そのため、特に日本語環境で byte-compile する際に Gnus のいくつかの .el ファイルに含まれている非 ascii 文字を誤っ てデコードして読み込み、それを元に .elc ファイルを生成してしま います。今のところ、多くは実害の無いものですが、環境変数 LANG を C にした環境で make を行なうことにより、coding: iso-8859-1 の指定については問題を回避することができます。

  • ○ MIME ではない日本語のメールのデコード

    MIME ではない日本語のメールを、ちゃんとデコードして表示させま す。Gnus はデフォルトでは iso-8859-1 でデコードするので、以下 のような設定が必要です。

    (setq gnus-group-charset-alist
          (cons '("^nnml:" iso-2022-jp-2) gnus-group-charset-alist))
          
    なお、以下の例も含めて `gnus-group-charset-alist' が gnus.el で はなくて gnus-sum.el で定義されている旧版の Gnus では、次のよう に書き換えて下さい。この場合 (setq の前に ' を付けること、最後の 閉じ括弧が一つ増えることをお忘れなく。
    (eval-after-load "gnus-sum"
      '(setq gnus-group-charset-alist
    	 ...))
          
    これは nnml の例です。nnmh や nnfolder でも、以下のように追加す れば使えるはずです。
    (setq gnus-group-charset-alist
          (append '(("^nnml:" iso-2022-jp-2)
    		("^nnmh:" iso-2022-jp-2)
    		("^nnfolder:" iso-2022-jp-2))
    	      gnus-group-charset-alist))
          
    グループ毎に切り替えることだってできます。
    ;; nnml:english.* 以外の nnml グループでは、MIME でないメールを
    ;; iso-2022-jp-2 でデコードして表示します。
    (setq gnus-group-charset-alist
          (append '(("^nnml:english\\." iso-8859-1)
    		("^nnml:" iso-2022-jp-2))
    	      gnus-group-charset-alist))
          
    グループの一つずつに対して設定したい場合は、グループパラメータの charset を使えば良いでしょう。

    なお、fj や japan のような主要な日本語のニュースグループでは、 MIME でない記事でもデフォルトで iso-2022-jp-2 が適用されますが、 それ以外のニュースグループについては次のように設定を追加すれば 良いでしょう。

    ;; nnml とニュースグループ local および sony をデフォルトでは
    ;; iso-2022-jp-2 でデコードして表示します。
    (setq gnus-group-charset-alist
          (append '(("^nnml:" iso-2022-jp-2)
    		("\\(^\\|:\\)local\\>" iso-2022-jp-2)
    		("\\(^\\|:\\)sony\\>" iso-2022-jp-2))
    	      gnus-group-charset-alist))
          
  • ○ 送信するニュース記事に CTE: 8bit を付けない

    内容が大きく変化している新版 もご覧下さい。

    2002年11月1日以降の Oort Gnus および Gnus 5.10 では、encoding が 7bit であるべき charset が使われるニュース記事に CTE: 8bit は付かなくなりました。しかし、shift_jis などが選択されてしまっ た場合に害を生じるかもしれない状況は変わらないので、いちおう参 照して下さい。

    送信するニュース記事に Content-Transfer-Encoding: 8bit を付け ないようにします。Content-Type: text/plain; charset=iso-2022-jp だったら 7bit、または Content-Transfer-Encoding は無くて良いのですが、Gnus のデフォ ルトでは付けてしまうのでカッコ悪いのです。

    (eval-after-load "gnus-msg"
      '(if (boundp 'gnus-group-posting-charset-alist)
           (let ((news (assq 'message-this-is-news
    			 gnus-group-posting-charset-alist)))
    	 (if news
    	     (setcdr news '(nil nil))))))
          

    これはおそらく iso-8859-1 の文字が書かれたニュース記事がエン コードされないまま流通していた時代のなごりで、欧米では今でも通 用しますが、運悪く shift_jis などが選択されてしまうとそれもエ ンコードされずに出て行ってしまうので、単にカッコ悪いだけではな く、場合によっては害になることがあります。(ここで言うエンコー ドとは quoted-printable や base64 のことです。)

  • ○ 送信時に使う charset の優先順位の指定

    送信するメールまたはニュース記事で使う charset の優先順位を指 定します。特に Emacs 21 を使う場合に必要で、何もしないと環境に よっては以下のようなあまり一般的ではない charset が使われてし まうことがあります。`system-type' の値が `usg-unix-v' である場 合、または Mule-UCS に含まれている jisx0213 モジュール を load している場合が該当します。

    Content-Type: text/plain; charset=euc-jp
    Content-Transfer-Encoding: base64
          
    これには Emacs 21.2 に付属している Gnus 5.9 か Oort Gnus v0.05 以降 (含 Gnus 5.10) で盛り込まれた機能を使います。
    (setq mm-coding-system-priorities
          '(iso-2022-jp iso-2022-jp-2 shift_jis iso-8859-1 utf-8))
          

    なお 2002年9月3日以降の Oort Gnus (v0.08 以上) および Gnus を 日本語の環境で使う (`current-language-environment' の値が "Japanese" である) 場合は、わざわざ設定する必要はありませんが、 念のため `mm-coding-system-priorities' の値を確認して下さい。

  • ○ Message バッファを独立した frame にする

    送信用の message バッファを独立した frame にします。info の例 と違うのは、複数の message 用 frame を開くことができること、送 信後またはバッファを kill した後で自動的に frame が消えること、 それに article バッファが常に見える状態になっていることです。 (2004年09月22日改定)

    (let* ((default
    	 ;; Winodw layout for normal message frames.
    	 '(vertical
    	   ((width . 80) (height . 40)
    	    ;;(left . -1) (top . 1)
    	    (user-position . t))
    	   (message 1.0 point)))
           (bug
    	;; Window layout for a gnus-bug frame.
    	;; Note that multiple gnus-bug frames are not supported.
    	'(vertical
    	  ((width . 80) (height . 40)
    	   ;;(left . -1) (top . 1)
    	   (user-position . t))
    	  (if gnus-bug-create-help-buffer '("*Gnus Help Bug*" 0.5))
    	  ("*Gnus Bug*" 1.0 point)))
           (config
    	`(frame
    	  1.0
    	  (progn
    	    (setq gnus-frame-list nil) ;; 2004-03-23
    	    (if (buffer-live-p gnus-summary-buffer)
    		(if (get-buffer gnus-article-buffer)
    		    (car (cdr (assq 'article gnus-buffer-configuration)))
    		  (car (cdr (assq 'summary gnus-buffer-configuration))))
    	      (car (cdr (assq 'group gnus-buffer-configuration)))))
    	  ,default))
           (settings '(compose-bounce forward mail-bounce message post
    				  reply reply-yank)))
      (while settings
        (gnus-add-configuration (list (car settings) config))
        (setq settings (cdr settings)))
      (setcdr (nthcdr 2 (setq config (copy-sequence config))) (list bug))
      (gnus-add-configuration (list 'bug config)))
    
    (add-hook
     'gnus-configure-windows-hook
     (lambda nil
       (if (eq major-mode 'message-mode)
           (let* ((message-frame (selected-frame))
    	      (delete-frame-function
    	       `(lambda nil
    		  (if (and
    		       ;; Uncomment the following line if other windows
    		       ;; in message frames are supposed to be important.
    		       ;;(eq (selected-window) (next-window))
    		       (eq (selected-frame) ,message-frame))
    		      (delete-frame ,message-frame)))))
    	 (setq gnus-frame-list (delq message-frame gnus-frame-list)
    	       message-exit-actions `((funcall ,delete-frame-function))
    	       message-postpone-actions message-exit-actions)
    	 (if (or (featurep 'xemacs)
    		 (< emacs-major-version 21))
    	     (make-local-hook 'kill-buffer-hook))
    	 (add-hook 'kill-buffer-hook `,delete-frame-function t t)
    	 ;; Uncomment the following line if you want to show all headers.
    	 ;;(set-window-start (selected-window) (point-min))
    	 ))))
    
    ;; Don't popup a message frame when sending a queued message.
    (add-hook
     'gnus-message-setup-hook
     (lambda nil
       (if (or (memq this-command '(gnus-draft-send-message
    				gnus-draft-send-all-messages
    				gnus-group-send-queue))
    	   (and (featurep 'gnus-delay)
    		(save-excursion
    		  (save-restriction
    		    (widen)
    		    (message-narrow-to-headers)
    		    (re-search-forward
    		     (concat "^" (regexp-quote gnus-delay-header)
    			     ":\\s-+")
    		     nil t)))))
           (let ((config (copy-sequence gnus-buffer-configuration)))
    	 (set (make-local-variable 'gnus-buffer-configuration)
    	      (cons '(forward (vertical 1.0 (message 1.0 point)))
    		    (delq (assq 'forward config) config)))
    	 (set (make-local-variable 'gnus-configure-windows-hook)
    	      nil)))))
    
    ;; Run `mml-preview' on a new frame.  2004-09-22
    (gnus-add-configuration
     '(mml-preview
       (frame 1.0
    	  (vertical 1.0 (message 1.0))
    	  (vertical ((width . 80) (height . 40)
    		     ;;(left . -1) (top . 1)
    		     (user-position . t))
    		    (save-excursion
    		      (set-buffer mml-preview-buffer)
    		      (if (or (featurep 'xemacs)
    			      (< emacs-major-version 21))
    			  (make-local-hook 'kill-buffer-hook))
    		      (add-hook 'kill-buffer-hook
    				(lambda nil
    				  (delete-frame (selected-frame)))
    				t t)
    		      (list 'mml-preview 1.0 'point))))))
          

    それにしても Gnus の window/frame 配置のカスタマイズは、初心 者には難しいと思います。特にこのような凝ったことを行なう場合は。

  • ○ グループパラメータの操作の一例

    これはグループパラメータの操作に関する単なる例です。ただし 2002年8月15日以降の Oort Gnus (v0.08 以上) および Gnus でない と使えません。日本以外の国や地域に住んでいる人が、fj や japan の記事は日本標準時で、それ以外の記事は現地時刻で Date ヘッダを 表示するようにします。

    (setq gnus-treat-date-local 'head)
    
    (setq gnus-parameters
          `(("\\`fj\\.\\|\\`japan\\."
    	 (gnus-treat-date-local nil)
    	 (gnus-treat-date-user-defined 'head)
    	 (gnus-article-time-format
    	  (lambda (time)
    	    (let ((ms (car time))
    		  (ls (car (cdr time)))
    		  (system-time-locale "C"))
    	      (setq ls (+ ls ,(- (* 9 3600)
    				 (car (current-time-zone)))))
    	      (cond ((>= ls 65536)
    		     (setq ls (- ls 65536)
    			   ms (1+ ms)))
    		    ((< ls 0)
    		     (setq ls (+ ls 65536)
    			   ms (1- ms))))
    	      (format-time-string "Date: %a %b %d %T %Y +0900"
    				  (list ms ls))))))))
          
    もし他の目的で `gnus-parameters' に何か設定してある場合には、そ の設定を行なった後で以下のように追加すれば良いでしょう。
    (setq gnus-parameters
          (nconc
           gnus-parameters
           `(("\\`fj\\.\\|\\`japan\\."
    	  (gnus-treat-date-local nil)
    	  (gnus-treat-date-user-defined 'head)
    	  (gnus-article-time-format
    	   (lambda (time)
    	     (let ((ms (car time))
    		   (ls (car (cdr time)))
    		   (system-time-locale "C"))
    	       (setq ls (+ ls ,(- (* 9 3600)
    				  (car (current-time-zone)))))
    	       (cond ((>= ls 65536)
    		      (setq ls (- ls 65536)
    			    ms (1+ ms)))
    		     ((< ls 0)
    		      (setq ls (+ ls 65536)
    			    ms (1- ms))))
    	       (format-time-string "Date: %a %b %d %T %Y +0900"
    				   (list ms ls)))))))))
          
  • ○ 新しい gnus-other-frame コマンド

    2002年8月27日以降の Oort Gnus および Gnus では `gnus-other-frame' コマンドの動作仕様が少し変わっていて、すで に Gnus が走っている場合は frame を pop up するだけの動作を行 ないます。これを toolbar から実行できるようにしておくと、画面 がたくさんのウィンドウで埋まってしまっている場合でも、確実に Gnus をディスプレイの表に出すことができます。以下は Emacs 21 と XEmacs で使える設定の例です。.emacs に書き込んで下さい。

    (cond ((featurep 'xemacs)
           (setq toolbar-news-reader 'gnus)
           (setcdr (assq 'gnus toolbar-news-commands-alist)
    	       'gnus-other-frame)
           (setq gnus-other-frame-parameters
    	     '(width 80 height 48)))
          ((fboundp 'tool-bar-add-item)
           (tool-bar-add-item "gnus-pointer"
    			  'gnus-other-frame 'Gnus)
           (setq gnus-other-frame-parameters
    	     '((width . 80) (height . 48)))))
          
    加えて、このコマンドを gnuclient で起動させることもできます。

    現在のディスプレイに popup させる場合:

    gnuclient -batch -f gnus-other-frame
    別のホストのディスプレイ "remote:0.0" に popup させる場合:
    gnuclient -batch -eval '(gnus-other-frame nil "remote:0.0")'
    どちらの例も -batch オプションを使っていますが、これは余計な frame が生成されないようにするためです。しかしこれを使うと -display オプションが無視されてしまうので、後の例では `gnus-other-frame' の第二引数でディスプレイを指定しています。

    なお、FSF Emacs 用の新しい gnuserv は以下の場所から入手できま す。

    http://meltin.net/hacks/emacs/src/gnuserv-3.12.5.tar.gz
    それから、以下は Emacs の実行時に cl を load しないようにするパッ チです。
    ftp://ftp.jpl.org/pub/elisp/gnuserv-3.12.5-no-cl.patch
  • ○ POP before SMTP

    ISP の SMTP サーバーに接続してメールを送信する場合に、それよ り前の一定時間内に同じ ISP の POP サーバーに接続して認証を行なっ ておかなければならないことがあります。要はメールを送信する前に 新着メールのチェックまたは取り込みを行なえば良いのですが、とも するとそれを忘れてしまって送信に失敗することがあるでしょう。 Gnus にはこれまで、送信する前に自動的に POP サーバーに接続して くれるような機能がありませんでしたが、2002年8月28日以降の Oort Gnus (v0.08 以上) および Gnus では可能です。

    従来の `smtpmail-send-it' の代わりに `message-smtpmail-send-it' を使って下さい。
    (setq message-send-mail-function 'message-smtpmail-send-it)
          
    そして次の hook を設定します。
    (add-hook 'message-send-mail-hook 'mail-source-touch-pop)
          
    この `mail-source-touch-pop' という関数は `mail-sources' に設定 されているすべての POP サーバーに、単に接続をオープンしてすぐに 閉じるという動作を行ないます。`mail-sources' に複数の POP サーバー (同じサーバーでアカウントが違う場合も含む) を設定しているが、メー ルの送信前に接続するのは一つだけで良い場合には、その source を以 下のように設定して下さい (`mail-sources' とは括弧の深さが違うこ とにご注意)。
    (setq mail-source-primary-source
          '(pop :server "my.pop.server"
    	    :user "user-name" :password "secret"))
          
    さて、この例のように source にパスワードも含めておくと POP サー バーに接続するときにいちいち入力を要求されなくて楽なのです が、.gnus.el などに生のパスワードを書きたくない場合は、(X)Emacs の起動時に入力したものに簡単な暗号をかけて持つようにする、以下の ような方法もあります。これは .gnus.el ではなくて .emacs に書いた 方が良いです。
    (let* ((pop-server "my.pop.server")
           (pop-user "user-name")
           (pop-passwd (read-passwd "POP password for %s@%s: "
    				pop-user pop-server)))
      (if (featurep 'xemacs)
          (progn
    	(require 'efs)
    	(efs-set-passwd pop-server pop-user pop-passwd)
    	(setq pop3-read-passwd
    	      `(lambda (prompt)
    		 (efs-get-passwd ,pop-server ,pop-user))))
        (require 'ange-ftp)
        (ange-ftp-set-passwd pop-server pop-user pop-passwd)
        (setq pop3-read-passwd
    	  `(lambda (prompt)
    	     (ange-ftp-get-passwd ,pop-server ,pop-user)))))
          
    ※ XEmacs ユーザーのみなさんへの重要なお知らせ:
    EFS 1.20 以前 (efs-1.29-pkg 以前) の efs には、上記のように .emacs などで efs を load してしまった後では、eval-after-load で設定した Lisp フォームが正しく評価されないバグがあります。必 ず新版の EFS を使って下さい。
  • ○ いろいろな色

    このページのタイトルにそぐわないかもしれませんが、XEmacs で Gnus の各バッファの modeline に歴代 Gnus のロゴを表示します。 データは LZW 圧縮を行なっていない gif です。残念ながら XEmacs は modeline に表示する gif データの透明色を正しく扱えないので、 それを modeline の背景色で置き換えるために以下の gifsicle プロ グラムが必要です。

    http://www.lcdf.org/gifsicle/
    (if (and (featurep 'xemacs)
    	 (executable-find "gifsicle"))
        (let ((data (base64-decode-string "\
    R0lGODlhEAAOAPQAAP8iAP///8wzAPj/uMDMk6HMk9L/uAX/lwTMkAXe/wSazIK2/2iGzHxo
    zIyC/7JkzM99/8xkwv19//99tcxkhXJCFB4/A4eHh7S0tP/MAL+ZAAAAAAAAAAAAAAAAAAAA
    ACH5BAEhAAEALAAAAAAQAA4AAAJCjI+pIsZ6mJRIGAEAy9JMcAhAAEwSYAjZAUgZYAiA8iZA
    IkCBABgCwNABAgxAACCATAAGgADCyBwAAkgmARDotogCACH5BAEhAAEALAAAAAAQAA4AAANE
    GLrcTkRBt6C1jCgyBuyWcg0LMQTDZQ0K0S2D1Q0KMThzMzQEFRADBWEA8Q0CkEFgQKBcBooB
    gQLpLAYESqcxIPi+jAQAIfkEASEAAQAsAAAAABAADgAAA0QYutxeRUG3oLWsqGIM7JZyGUth
    BMZlGUrRLYbVGUphOHNjNAUVFAZFwQDxGQIQQ8BQoFwMCkOBAuksDAVKp2Eo+L6MBAAh+QQB
    IQABACwAAAAAEAAOAAAERzDISatFSGI7sfcUIiHHgZWe9B0TcgTH5x0SUk6HVx4Scli7yqGC
    4AQQBwnigDEeAphD4IDgfA6SA4KDKU0OCE6pckAYz5QIACH5BAEhAAEALAAAAAAQAA4AAARH
    MMhJq1VKYjux95QiKUmClZ70JZOSBMnnJZJSTolXJpKSWLtKoqLgBBQJiSKBMSYCmEQgoeB8
    EpKEgoMpTRIKTqmSUBjPlAgAIfkEASEAAQAsAAAAABAADgAABEcwyEmrZUxiO7H3FCMxy4KV
    nvQtE7MEy+ctElNOi1cuErNYu8qiwuAEGAsJY4ExLgKYRWDB4HwWkgWDgylNFgxOqbJgGM+U
    CAAh+QQBIQABACwAAAAAEAAOAAAERzDISattTWI7sfdUIzWOg5We9DlT4wTO5zlSU06OVzpS
    41i7iqPS4AQaDknDgTE6AhhHwNHgfBwSR4ODKU0cDU6p4mgYz5QIACH5BAEhAAEALAAAAAAQ
    AA4AAAVLYCCOZGk+j4iaI+q65CM+EITWrvhC4wMFkJcLInrURhBXDSJ6QEzLEqT0YAUeENED
    grJCAihIAPJgvSAiyIOFqo0gD1atBHlY76QQACH5BAEhAAEALAAAAAAQAA4AAAVLYCCOZGlG
    kYiaI+q6ZCRGkoTWrvhKYyQFkpdLIorURhJXTSKKSEzLkqQUYQUiElFEgrJKAihJQBJhvSQi
    SYSFqo0kEVatJIlY76QQACH5BAEhAAEALAAAAAAQAA4AAAVLYCCOZGlSlIiaI+q6JCVS04TW
    rvhOIzUFk5drIqLURhNXbSKiTEzL0qREYQUoExFlgrJOAqhJYEJhvSaiCYWFqo0mFFatNKFY
    76QQACH5BAEhAAEALAAAAAAQAA4AAAVLYCCOZGlWlYiaI+q6ZCVWloXWrvhaY2UFlpfLIqrU
    RhZXzSKqWEzLkqVUYQUqFlHFgrJaAihLwFJhvSwiS4WFqo0sFVatZKlY76QQACH5BAEhAAEA
    LAAAAAAQAA4AAAVLYCCOZGlimIiaI+q6JCZi14XWrvheI3YFl5frIsLURhdX7SLCXEzL0qWE
    YQUwFxHmgrJeAqhL4IJhvS6iC4aFqo0uGFatdMFY76QQACH5BAEhAAEALAAAAAAQAA4AAAVL
    YCCOZGlqmoiaI+q6pCZqWYbWrvhmo5YFmZcrI9LURhlXLSPSZEzLUqakYQU0GZEmg7JmAqhM
    IKNhvTKijIaFqo0yGlatlNFY76QQADs="))
    	  (background (mapconcat
    		       (lambda (c) (number-to-string (% c 256)))
    		       (color-rgb-components (face-background
    					      'modeline))
    		       ","))
    	  (coding-system-for-read 'binary)
    	  (coding-system-for-write 'binary))
          (with-temp-buffer
    	(insert data)
    	(call-process-region (point-min) (point-max)
    			     "gifsicle" t t nil
    			     "--careful" "--delay" "33"
    			     "--change-color"
    			     "255,255,255" background)
    	(setq gnus-xmas-modeline-glyph
    	      (make-glyph (make-image-instance
    			   (vector 'gif :data (buffer-string))))))))
          
  • ○ 不揃いな summary 行

    Summary バッファに表示される日本語を含む行と ascii だけの行が 不揃いになる場合があります。

       r  [   5: 無料プレゼント             ] 未承諾広告※
       r  [  41: Robert Morelli      ] Some questions about 21.4.8
          
    Oort Gnus v0.05 以上 (含 Gnus 5.10) において、こういうものを適切 に処理する機能が盛り込まれたので、それを使いましょう。
    (setq gnus-use-correct-string-widths t)
          
    これは Gnus の版によっては XEmacs でだけデフォルトで t になって いるので、まずは値がどうなっているか確認して下さい。なお、この値 を変更したときは、以下の式を eval (*scratch* バッファにコピーし て、行末で C-j をタイプ) する必要があるかもしれません。
    (gnus-update-format-specifications t)
          
  • ○ ヘッダを FLIM でエンコードする

    2004年5月20日、No Gnus の rfc2047.el においてヘッダの MIME エ ンコーダに大きな改造を加えました。それ以前に以下に書いたことは おおむね改善されているはずですが、不安だからやっぱり FLIM を使 いたいという方は利用して下さい。:)

    ヘッダに長い日本語が書かれていた場合に、Gnus はあまり美しいエ ンコードを行なってくれません。しかも Gnus v5.10.2 とそれ以前の 版では、残念ながらエンコードに失敗することがあると聞いています。 これは Gnus に付属している rfc2047.el のエンコーダに代わって、 FLIM を使ってエンコードする方法です。こんなことはしないで Gnus のバグ出しに協力するのがスジだとは思いますが。

    2004年05月10日改定:
    エンコーディングの指定が "=?iso-2022-jp?b?..." の "b" のように小 文字だった場合にデコードしてくれない邪悪なメイラーがあるようなの で、強制的に大文字を使うようにしました (cf. 土屋さんの記事)。
    ;; Use eword-encode to encode message header in Gnus.
    (eval-after-load "mail-parse"
      '(progn
         (autoload 'mime-encode-header-in-buffer "eword-encode" nil t)
         (defalias 'mail-encode-encoded-word-buffer
           (lambda nil
    	 (mime-encode-header-in-buffer t)))
    ;;     (defadvice eword-encode-text (after downcase-charset activate)
    ;;       "Convert `charset' into lower case and `encoding' into upper case."
    ;;       (require 'eword-decode)
    ;;       (if (and ad-return-value
    ;;		(string-match eword-encoded-word-regexp
    ;;			      ad-return-value))
    ;;	   (setq ad-return-value
    ;;		 (concat
    ;;		  (downcase (substring ad-return-value
    ;;				       0 (match-beginning 3)))
    ;;		  (upcase (substring ad-return-value
    ;;				     (match-beginning 3)
    ;;				     (match-beginning 4)))
    ;;		  (substring ad-return-value
    ;;			     (match-beginning 4))))))
         ))
          
    Gnus のエンコーダに戻すには、以下のコメントを外して eval して下 さい。
    ;;(defalias 'mail-encode-encoded-word-buffer 'rfc2047-encode-message-header)
          
  • ○ cl が load されないようにする

    2002年10月14日に Oort Gnus の gnus-group.elc が無条件に mm-url.elc を require しないように実力行使しました。それ以降の 版を使う場合は、以下の項目を無視して下さい。

    コマンド gnus-group-fetch-charter で使うだけのために gnus-group.elc は mm-url.elc を require しているのですが、これは Emacs/W3 の url ライブラリをデフォルトで使い、Emacs/W3 は cl 実 行時関数を多用しているために cl を require します。Emacs/W3 を使 わない人は以下の設定を .gnus.el ファイルに追加することによって、 url ライブラリと cl の load を抑制することができます。
    (setq mm-url-use-external t) ;; Don't load url and possibly cl.
          
  • ○ 正しく digest フォワードができるようにする

    複数の記事にマークを付けて一度にまとめてフォワードする場合、 または gnus-uu-digest-(mail|post)-forward コマンド (キーは SOm か SOp) を使ってフォワードする場合に、第一パートに日本語が含ま れているとエンコードされずに出て行ってしまうため、相手は読むこ とができません。以下はこの問題を解決するための advice です (ding で言ったんだけど相手にしてもらえなかったの ;_;)。

    (defadvice gnus-uu-digest-mail-forward
      (after simplify-summarized-topics-part activate)
      "Simplify summarized topics part."
      (if (re-search-forward (concat "
    \\(" (regexp-quote mail-header-separator) "\\)
    
    \\(<#multipart type=digest>\\)
    <#part type=message/rfc822>
    Subject: Topics
    
    ") nil t)
          (replace-match "\n\\1\n\\2\n")))
          
  • ○ フォワードする記事ヘッダの整形

    メッセージをフォワードする際に Gnus はデフォルトで元記事のヘッ ダに含まれている encoded word をデコードしてくれるのですが、 ascii と日本語が混在していると変なところで折り返されて見苦しく なることがあります。これは encoded word に改行の制御機能が無い MIME の宿命で、しかも Gnus のユーザ/開発者には英語しか使わない 人が多いので本体で対策するのは諦め、代わりに以下の advice で整 形するようにしてみました。

    (defadvice mime-to-mml (after unfold-encoded-headers activate)
      "Unfold encoded headers."
      (save-excursion
        (save-restriction
          (message-narrow-to-head)
          (goto-char (point-max))
          (let (end start prev)
    	(while (not (bobp))
    	  (setq end (point-marker))
    	  (while (progn
    		   (forward-line -1)
    		   (memq (char-after) '(?\t ?\ ))))
    	  (setq start (point))
    	  (if (re-search-forward "[^\000-\377]" end t)
    	      (progn
    		(insert-before-markers
    		 (mapconcat
    		  'identity
    		  (delete "" (split-string
    			      (prog1
    				  (buffer-substring start end)
    				(delete-region start end))))
    		  " ")
    		 "\n")
    		(goto-char start)
    		(setq prev nil)
    		(while (re-search-forward ", ?" end t)
    		  (if (and prev
    			   (> (current-column) 76))
    		      (progn
    			(delete-region (goto-char (car prev))
    				       (cdr prev))
    			(insert ",\n ")
    			(setq prev nil))
    		    (setq prev (cons (match-beginning 0)
    				     (match-end 0)))))
    		(goto-char (1- end))
    		(if (and prev
    			 (> (current-column) 76))
    		    (progn
    		      (delete-region (goto-char (car prev))
    				     (cdr prev))
    		      (insert ",\n ")))
    		(goto-char start))))))))
          
  • ○ 名前が日本語の添付ファイル

    Gnus で名前が日本語の添付ファイルを送信すると、ファイル名が RFC2231 の勧告に従ってエンコードされます。これは世界中のみんな で決めた正しいやり方です。しかしいまいましいことに、それを無視 して勝手なフォーマットを使っている一団がおり、彼らは Gnus で送っ た添付ファイルの名前を解釈しません。rfc2047-encode-parameter は Gnus が不当な非難を浴びるのを避けるために作ったエンコーダで す。一方 Gnus はこの変則仕様を扱うことができます。これには 2004年7月22日以降の No Gnus を使う必要があります。

    (defalias 'mail-header-encode-parameter 'rfc2047-encode-parameter)
          
  • ○ 名前が日本語の添付ファイル (その2)

    日本語の添付ファイル名が特にエンコードされず、通常のテキスト と同様に iso-2022-jp で送られてくることもあります。そんな場合 に Gnus は生の iso-2022-jp のデータをファイル名として扱うので、 表示された名前は読めないし、ファイルとしてセーブするにも困って しまいます。

    そういうときの対策の一つとして、Gnus に記事をエンコードし直さ せることが有効な場合があります。操作は summary バッファで `e'、 次にarticle バッファで `C-c C-c' です。

    それとは別にもう一つ、以下は Gnus の MIME デコーダに前もって ファイル名をデコードさせてしまうための advice です。

    (defadvice rfc2231-parse-qp-string (after decode-filename activate)
      "Decode `filename' and `name' parameters by `undecided'.
       This advice will do it only when a name contains 7bit characters only."
      (let ((param (or (assq 'filename ad-return-value)
    		   (assq 'name ad-return-value)))
    	name)
        (when (and param
    	       (setq name (cdr param))
    	       (string-match "\\`[\000-\177]+\\'" name))
          (setcdr param (decode-coding-string name 'undecided)))))
          

    この advice を解除するには、M-x ad-unadvise に続いて関数名と して rfc2231-parse-qp-string を指定、再び有効にするにはこの定 義の最後の閉じ括弧の後ろで `C-x C-e' です。