x-face.el v1.3 取扱い説明書 山岡克美 市川達哉 奥西藤和 小関吉則 v1.3 から XEmacs だけで使うプログラムなどを分離して x-face-xmas.el というファイルに納めました。が、まだ分離は不充分です。 v1.2.7 からカラー/マルチ X-Face が扱えるようになっています。カラーイ メージをファイルにセーブするときと外部 viewer で見るときのフォーマッ トは、XPM か非圧縮の BMP (OS/2 または Windoze) のどちらかを選択する ことができます。XEmacs でインライン表示する方法については 6. XEmacs の項を、それ以外については 7. その他 の項をご覧下さい。 カラー/マルチのためにヘッダに複数の X-Face フィールドを挿入するこの 方法は、まだ世の中で認知されたものではありません。(^^;;) いちおう、 規格書ふうの読み物を METHOD.ja として添付しました。 ---------------------------------------------------------------------- 1. 必要なもの。 外部コマンドとして compface と uncompface が必要です。例えば /anonymous@ftp.eos.hokudai.ac.jp:/pub/tools/compface.tar.Z /anonymous@ftp.jaist.ac.jp:/pub/faces/compface/compface.tar.Z /anonymous@ftp.mei.co.jp:/free/Graphics/faces/compface/compface.tar.gz /anonymous@ftp.wg.omron.co.jp:/pub/gnu/elisp/mew/faces/compface.tar.Z などを持ってきてコンパイルし、適当なディレクトリにインストールして下 さい。XEmacs を --with-xface で作るときに必要な compface.h はこのアー カイブに含まれていて、libcompface.a も作ることができます。 それからイメージファイルを見ることができる viewer として xv など、お よび gzip や bzip2 も設定によっては必要です。 ---------------------------------------------------------------------- 2. Install. x-face.el を byte-compile-file して、load-path のディレクトリにでき 上がった x-face.el と x-face.elc をコピーして下さい。 XEmacs で使う方 はこのパッケージを gunzip | tar で展開したディレクト リで (*) x-face-xmas.el も byte-compile-file して、x-face-xmas.el と x-face-xmas.elc を同様にインストールして下さい。 その際必ず .elc ファイルのタイムスタンプが .el より新しくなるように しなければなりません。 VM もしくは Mew をお使いの場合には VM もしくは Mew を起動した後でコン パイルして下さい。 (*) 作業ディレクトリに logo のイメージファイルがあれば、このディレク トリでなくても構いません。逆に *.elc が load されるときに表示さ れる splash 画面がうっとおしいならば、logo のイメージファイルが 無い状態で byte-compile-file するか、x-face-inhibit-loadup-splash という変数の値を non-nil にして下さい。 もし byte-compile-file した *.elc ファイルが正常に動作しないときは、 すでにインストールされている古い x-face.el と x-face.elc を (XEmacs の場合は x-face-xmas.el と x-face-xmas.elc も) 消去してから Emacsen を起動し直して、再度 byte-compile-file してみて下さい。 ---------------------------------------------------------------------- 3. autoload の設定。 ~/.emacs に次のように書いて下さい。 (autoload 'x-face-encode "x-face" "Generate X-Face string(s) from xbm file." t) (autoload 'x-face-insert "x-face" "Insert X-Face fields." t) (autoload 'x-face-save "x-face" "Save X-Face fields to files." t) (autoload 'x-face-view "x-face" "View X-Face fields." t) (autoload 'x-face-ascii-view "x-face" "View X-Face fields as ascii pictures." t) ; XEmacs の場合のみ。詳細は 6. XEmacs の項をご覧下さい。 (autoload 'x-face-xmas-display-x-face "x-face" "Display X-Face fields as XEmacs-glyph." t) (autoload 'x-face-xmas-force-display-x-face "x-face" "Display X-Face fields compulsorily as XEmacs glyph." t) (autoload 'x-face-xmas-remove-x-face-glyph "x-face" "Remove X-Face images and some text-properties." t) 最低これだけ書いておけば GNUS または Gnus と mh-e, Mew, RMAIL, VM cmail および Wanderlust(wl) で使えるはずですが、他の Newsreader/Mailer を使う場合や環境やユーザの好みに合わせて変えたい場合は、後述の 5. Customize の項を参照して下さい。 ---------------------------------------------------------------------- 4. 使い方。 ・Decode and view デフォルトの設定では gnus-summary-mode, gnus-Subject-mode, mh-folder-mode, mew-summary-mode, mew-virtual-mode, rmail-mode, vm-summary-mode, cmail-summary-mode, wl-summary-mode の各バッファに カーソルがある場合と、送信するメッセージを編集しているバッファのよう にカレントバッファに X-Face フィールドがある場合に、 M-x x-face-view とタイプすると xv (変数 x-face-viewer-program で指定された viewer) で face を表示します。 キャラクタ端末で xv などが使えない場合でも、M-x x-face-ascii-view と タイプすると、48桁×24行の ascii picture で face を表示します。 (もちろん X の端末でも使えます。) ・Decode and save デフォルトの設定では gnus-summary-mode, gnus-Subject-mode, mh-folder-mode, mew-summary-mode, mew-virtual-mode, rmail-mode, vm-summary-mode, cmail-summary-mode, wl-summary-mode の各バッファに カーソルがある場合と、送信するメッセージを編集しているバッファのよう にカレントバッファに X-Face フィールドがある場合に、 M-x x-face-save とタイプすると所定のディレクトリにイメージファイルとしてセーブします。 ・Encode 適当な xbm ファイルを用意しておいて M-x x-face-encode とタイプするとエンコードした X-Face フィールドの文字列を表示します。 C-u M-x x-face-encode ESC 1 M-x x-face-encode などと引数を付けて使うと elisp 式でエンコードした文字列を表示します。 ( C-u は universal-argument コマンドのデフォルトのキー設定です。) イメージサイズは不問ですが、48x48 より小さい場合は余白を付け、大きい 場合は必要なら縦横が 48 の自然数倍になるように余白を付けて、それぞれ 48x48 のサイズで分割した複数のエンコード結果を返します。 ・Insert 適当な xbm ファイルを用意しておいて M-x x-face-insert とタイプするとカレントバッファの適切な位置に X-Face フィールドを挿入 します。イメージサイズは不問です。 configure オプションを --with-xface --with-xpm にして作った XEmacs ではデフォルトで encoded string を隠して直接イメージを表示することが できます。詳しいことは 6. XEmacs の項をご覧下さい。 また、引数を付けて M-x x-face-insert を実行すると、すでに存在する X-Face フィールドを消さずに挿入することができます。具体的には C-u M-x x-face-insert ESC 1 M-x x-face-insert などとタイプします。 (注) gnus-summary-mode, gnus-Subject-mode, mh-folder-mode, mew-summary-mode, mew-virtual-mode, rmail-mode, vm-summary-mode, cmail-summary-mode, wl-summary-mode の各バッファというのはそれぞれ次のようなものです。 gnus-summary-mode (GNUS v3.15 以降と Gnus) gnus-Subject-mode (GNUS v3.14.4 以前) ニュース記事のサブジェクト一覧が表示されているバッファ。 mh-folder-mode mew-summary-mode, mew-virtual-mode vm-summary-mode cmail-summary-mode wl-summary-mode メールのサブジェクト一覧が表示されているバッファ。 rmail-mode メールの内容が表示されているバッファ。 ---------------------------------------------------------------------- 5. Customize. 以下のように .emacs に書いておくことによってカスタマイズができます。 また、比較的新しい custom パッケージがあれば、M-x customize または M-x customize-group を使って編集することもできます。 (setq x-face-image-file-directory "~/x-faces") ; イメージファイルを通常置いておくディレクトリの指定です。 ; 以前の変数名 x-face-xbm-file-directory は暫定的に有効にしていますが、 ; なるべくこの新しい名前を使うようにして下さい。 (setq x-face-image-file-directory-for-save "~/x-faces") ; イメージファイルをセーブするためのディレクトリ名の指定です。 ; デフォルト値は x-face-image-file-directory と同じです。 (setq x-face-default-xbm-file "myface.xbm") ; 主に自分の X-Face 用に使う xbm ファイルの名前を指定します。 ; もし x-face-image-file-directory で設定したディレクトリ以外の場所に ; 置いておく場合は、ディレクトリ名も含めて記述して下さい。 ; この変数には "myface.xbm.gz" または "myface.xbm.bz2" というように ; gzip や bzip2 で圧縮されたものを指定することが可能で、"myface.xbm" ; を設定した場合でも "myface.xbm.gz" や "myface.xbm.bz2" が存在する場 ; 合はそれが使われます。逆にこの変数に例えば "myface.xbm.gz" を設定し ; てもそれが実在ではなくて、"myface.xbm.bz2" や "myface.xbm" が存在し ; ている場合にはそれが使われます。 (setq x-face-insert-interactive t) ; 関数 'x-face-insert を手動のコマンドとして使う場合以外でも、この変数 ; を t にしておくと挿入するファイル名を尋ねるようになります。 ; そのときの気分に応じて face を変えるような場合に便利でしょう。 (setq x-face-compressor 'gzip) ; 'gzip または 'bzip2 を設定しておくと X-Face をセーブするときに gzip ; または bzip2 で圧縮します。nil では圧縮しません。 (setq x-face-compressor-program-list '((gzip ".gz" "gzip" "-c9" "GZIPping" "gzip" "-cd" "GUNZIPping") (bzip2 ".bz2" "bzip2" "-f" "BZIPping" "bzip2" "-d" "BUNZIPping"))) ; 圧縮伸長方法を指定するリストです。 ; それぞれのエレメントは変数 x-face-compressor で指定するシンボル、ファ ; イル名のサフィックス、圧縮プログラム、圧縮時の引数、圧縮時のメッセー ; ジ、伸長プログラム、伸長時の引数、伸長時のメッセージで構成されます。 ; プログラム名は必要なら絶対パスを使って下さい。 (setq x-face-user-x-face-variable-name "x-face-default-encoded-string") ; C-u M-x x-face-encode の出力で使う変数名の指定です。 ; ま これはどうでも良いでしょう。 (setq x-face-compface-program "compface") (setq x-face-uncompface-program "uncompface") (setq x-face-viewer-program "xv") ; パスが設定されていないディレクトリに外部コマンドのファイルを置いてい ; る場合は、"/usr/local/bin/X11/xv" などとフルパスで記述して下さい。 ; なお x-face-viewer-program には system-type が OS/2 または windows-nt ; だった場合はそれぞれ "pmview" か "start" が、それ以外の場合は "xv" ; がデフォルトで設定されます。 (setq x-face-viewer-options '("-nodecor" "-quit" "-")) ; これは viewer program の引数の list です。x-face-view-asynchronous ; という変数 (後述) が t の場合には必ず参照するものではありません。 ; xv 以外のものや古〜い xv を使う場合は適宜修正して下さい。 (setq x-face-icons-to-color-picture-function 'x-face-icons-to-xpm) ; カラー X-Face を見たりセーブするときに、イメージフォーマットに変換す ; るための関数を指定します。現在 XPM、OS/2-BMP および Windoze-BMP の各 ; イメージをエンコードするための関数が用意されていて、デフォルト値は ; system-type の値によってそれぞれ以下のように設定されます。 ; ; 'OS/2 'x-face-icons-to-os2-bmp ; 'windows-nt 'x-face-icons-to-win-bmp ; 上記以外 'x-face-icons-to-xpm ; ; いずれも X-Face フィールドを uncompface で icon フォーマットに変換し ; た後で使うものです。 (setq x-face-view-asynchronous nil) ; t にしておくと M-x x-face-view で非同期に viewer を起動します。 ; すなわち、nil の場合には viewer を終了させるまで Mule/NEmacs/XEmacs ; の操作ができなくなりますが、t では face を見ながらキーボード操作がで ; きます。 ; OS/2 の場合はデフォルトで t にしてあります。というのは xbm を表示で ; きる VIO版アプリケーションがないので PMView などの PM版グラフィック ; ビューアを使わざるを得ないのですが、PMアプリケーションは標準入出力を ; 扱えない仕様となっているためです。変数が nil の場合には標準出力され ; るのに対し、t の場合はテンポラリファイルに書き出されるので PM版でも ; 問題なく使えるというわけです。X-Free86 for OS/2 で xv が使えるものの、 ; 肝心の OS/2 Mule が xterm 上では VIOモードでもまともに使えません。:-) ; PMX で xv は動くはずですが、PMMule から動かせるかどうか調べてません。 (setq x-face-view-asynchronous-function {関数シンボル or 関数定義}) ; x-face-view-asynchronous が t のときに使う関数の設定です。引数として ; 表示すべきファイルの絶対パス名が渡されます。 (setq x-face-viewer-startup-time 10) ; 外部 viewer を起動して表示するファイルを読み込むまでの最大時間を秒数 ; で設定します。x-face.el から外部 viewer を起動した後でこの時間が経過 ; するとファイルを消します。 (setq x-face-save-or-view-method-alist '( (gnus-summary-mode . (gnus-summary-show-article x-face-find-gnus-article-buffer gnus-summary-show-article)) (gnus-Subject-mode . (gnus-Subject-show-article x-face-find-gnus-article-buffer gnus-Subject-show-article)) (mh-folder-mode . (x-face-mh-get-article x-face-extracted-headers-buffer)) (mew-summary-mode . (x-face-mew-get-article x-face-extracted-headers-buffer)) (mew-virtual-mode . (x-face-mew-get-article x-face-extracted-headers-buffer)) (vm-summary-mode . (x-face-vm-get-all-headers x-face-extracted-headers-buffer)) (cmail-summary-mode . (x-face-cmail-get-article x-face-extracted-headers-buffer)) (wl-summary-mode . (x-face-wl-get-article x-face-extracted-headers-buffer)) )) ; 色々な Newsreader/Mailer で M-x x-face-{save,view} できるようにする ; ための変数で、各 cell は次のような構造にします。 ; ; (MAJOR-MODE . (PREPARE-FUNCTION BUFFERorFUNCTION POST-FUNCTION)) ; ; M-x x-face-{save,view} したときのカレントバッファの major-mode が ; MAJOR-MODE だったら、まず PREPARE-FUNCTION を実行し、実行し終わった ; ときに X-Face フィールドが存在するはずのバッファを BUFFER で指定しま ; す。 ; ; BUFFER に関数が指定されていた場合は、その評価結果を採用します。 ; x-face-find-gnus-article-buffer と mew-buffer-message がこれに該当し ; ます。 ; ; POST-FUNCTION は {save,view} し終わってから後始末のために実行する関 ; 数の指定です。 ; ; カレントバッファに X-Face が存在しているときに M-x x-face-{save,view} ; するためには、特別な設定は不要です。 毎回 M-x x-face-{save,view} とタイプするのが面倒ならば、以下のように キーを設定することもできます。 (add-hook 'gnus-summary-mode-hook (function (lambda () (define-key (current-local-map) "\C-x4s" 'x-face-save) (define-key (current-local-map) "\C-x4v" 'x-face-view) (define-key (current-local-map) "\C-x4a" 'x-face-ascii-view) ))) ; Gnus や GNUS (v3.15 以上) 以外では gnus-summary-mode-hook の代わりに ; 以下の hook を使って下さい。 ; GNUS (v3.14.4 以下) gnus-Subject-mode-hook ; RMAIL rmail-mode-hook ; mh-e mh-folder-mode-hook ; Mew mew-summary-mode-hook ; mew-virtual-mode-hook ; VM vm-summary-mode-hook ; cmail cmail-summary-mode-hook ; wl wl-summary-mode-hook ; NEmacs には add-hook がありませんから、関数定義を追加 (後述) するか ; 通常の方法を使って下さい。以下も同様です。 送信するメッセージに X-Face フィールドを自動付加するには、例えば次の ようにして下さい。XEmacs の場合はこの方法の代わりに 6. XEmacs. の項 で説明する方法を推奨します。 (add-hook 'gnus-message-setup-hook 'x-face-insert) ; Gnus (v5.4 以上) では、こうすると x-face-default-xbm-file で指定した ; xbm ファイルの内容がエンコードされて挿入されます。 ; また、変数 x-face-insert-interactive を t にしておくと毎回挿入するファ ; イル名を尋ねるようになります。 ; デフォルト以外のファイルを使いたい場合は次のように書きます。 (add-hook 'gnus-message-setup-hook (function (lambda () (x-face-insert "FILENAME")))) ; Gnus (v5.4 以上) 以外では gnus-message-setup-hook の代わりに以下の ; hook を使って下さい。 ; Gnus (v5.2 以上) message-setup-hook ; Gnus (v5.1 以下) と GNUS news-setup-hook ; MAIL/RMAIL/VM mail-setup-hook ; Mew mew-draft-mode-hook ; mh-e mh-letter-mode-hook ; cmail cmail-mail-hook or mail-setup-hook ; wl wl-mail-setup-hook また、以下ような hook を設定しておくと、送信メッセージを書き始めると きに X-Face フィールドを付加するかどうかを (y or n) で選択できるよう になります。(これは mail-setup-hook に設定する例です。) (add-hook 'mail-setup-hook (function (lambda () (and (y-or-n-p "X-Face ヘッダを付けますか? ") (call-interactively 'x-face-insert) )))) x-face-insert で X-Face フィールドを付加した直後に評価される hook と して x-face-insert-hook があります。これが評価されるときの (point) は X-Face フィールドの行頭です。 それから、x-face-add-x-face-version-header という変数を t にしておく と、x-face-insert したときに X-Face-Version という、この program の version を表すフィールドを併せて付加しますので、もしよろしければ使っ て下さい。 v1.2.8 からバージョン 19 以上の Emacsen でメニューが使えるようになっ ています。メニューを有効にするには .emacs に次のように書いて下さい。 (autoload 'x-face-define-menu "x-face" "Define menu." t) (add-hook 'HOOK 'x-face-define-menu) HOOK には例えば以下のようなものが使えますので、必要に応じて追加して 下さい。 MUA 受信 送信 ------------------------------------------------------------------ cmail: cmail-summary-mode-hook mail-setup-hook Gnus: gnus-summary-mode-hook gnus-message-setup-hook Mew: mew-summary-mode-hook mew-draft-mode-hook mew-virtual-mode-hook mh-e: mh-folder-mode-hook mh-letter-mode-hook RMAIL: rmail-mode-hook mail-setup-hook VM: vm-summary-mode-hook mail-setup-hook wl: wl-summary-mode-hook wl-mail-setup-hook あるいは、これら全部を引っくるめて (mapcar (function (lambda (hook) (add-hook hook 'x-face-define-menu))) '(cmail-summary-mode-hook gnus-message-setup-hook gnus-summary-mode-hook mail-setup-hook mew-draft-mode-hook mew-summary-mode-hook mew-virtual-mode-hook mh-folder-mode-hook mh-letter-mode-hook rmail-mode-hook vm-summary-mode-hook wl-summary-mode-hook wl-mail-setup-hook)) などと書いてしまっても実害は無いでしょう。 メニューから使えるコマンド x-face-menu-insert x-face-menu-encode を 手動で M-x したり hook などで使う場合には、 (require 'x-face) または (autoload 'x-face-menu-insert "x-face" "Insert X-Face with menu." t) (autoload 'x-face-menu-encode "x-face" "Generate X-Face string(s) from xbm file with menu." t) といった記述を追加して下さい。 ---------------------------------------------------------------------- 6. XEmacs. configure オプションを --with-xface --with-xpm にして作った XEmacs を使うと、メールやニュースの記事を読むときと送信バッファを編集すると きに、直接イメージを表示することができます。XEmacs で多用されている highlight-headers.el の変数 highlight-headers-hack-x-face-p が nil だった場合は highlight-headers の仕様に合わせてイメージを表示しない ようにしています。 【メールやニュースを読むときのインライン表示】 インライン表示するために四つの方法を用意しています。 (1) highlight-headers.el の関数 highlight-headers の置き換え。XEmacs で多くの Mailer/Newsreader を使う上で必須とも言える tm または SEMI、および Mew の旧版でもこれを使っています。 Gnus が自身で設定する gnus-article-display-hook を無効にする必要 があります。 (2) Gnus だけは Gnus が持っているさまざまなヘッダを修飾する機能を使い、 それ以外は tm または SEMI の関数 mime-preview/x-face-function-use-highlight-headers (ここでも highlight-headers を利用しています) を置き換えます。 Gnus が自身で設定する gnus-article-display-hook を無効にする必要 があります。 (3) Gnus の関数 gnus-article-display-x-face の置き換え。tm または SEMI を使わない (って、どうやるんだろう? ^^;;) 場合のために用意し ました。Gnus が自身で設定する gnus-article-display-hook の内容を 書き換えて x-face.el の x-face-xmas-gnus-article-display-x-face という関数を使うようにします。 Gnus では gnus-article-x-face-command という変数に X-Face を表示 するための関数などをユーザが設定する手段が用意されていますが、こ れはマルチ X-Face のそれぞれに対して動作してしまうため使えません。 (4) Mew 1.92 以降では highlight-headers を使わなくても済むようになっ たので、(1) の関数の置き換えは不要です。下記に従ってして下さい。 それぞれ次のように .emacs に書き入れて下さい。(1) か (2) の設定を行 なう場合、他の autoload の設定は一切必要ありません。 ;(1) 関数 highlight-headers の置き換え。 (require 'x-face) (setq gnus-article-display-hook nil) (x-face-xmas-replace-highlight-headers) ;(2) (require 'x-face) (setq gnus-article-display-hook nil) (x-face-xmas-replace-highlight-headers) ; tm を使う場合。 (x-face-xmas-replace-x-face-function-for-tm) ; SEMI を使う場合。 (x-face-xmas-replace-x-face-function-for-semi) gnus-article-display-hook は gnus.el の中で defcustom による設定が行 なわれるので、gnus.el が load される前に変数として存在していれば Gnus は何もしません。したがってこれらの例のように nil にする以外に、何ら かの関数を add-hook することもできます。 (require 'x-face) する代わりにすべて autoload にすることもできないこ とはないのですが、他のライブラリが load される順序によってはうまくい かないので、上記の設定をとりあえず推奨しておきます。 ;(3) tm または SEMI 無しで Gnus を使う場合。 (autoload 'x-face-xmas-replace-gnus-article-display-x-face "x-face" "Replace X-Face function in gnus-article-display-hook." t) (add-hook 'gnus-art-load-hook 'x-face-xmas-replace-gnus-article-display-x-face) ;(4) Mew 1.93 以降で使う場合。 (autoload 'x-face-xmas-mew-display-x-face "x-face" nil t) (setq mew-use-highlight-x-face-function 'x-face-xmas-mew-display-x-face) ; 何が何でも highlight-headers を load しない。:-p ;(provide 'highlight-headers) Mew 1.92 と 1.93b2 以前では mew-use-highlight-x-face-function の代わ りに mew-opt-highlight-x-face-function を使って下さい。 【送信バッファなどでのインライン表示】 コマンド M-x x-face-insert を使って手動で挿入した X-Face フィールド を、デフォルトでは encoded string を隠して直接イメージを表示するよう になっています。表示する位置は From フィールドがある場合はそこ、無い 場合は X-Face フィールドになります。 表示/非表示は M-x x-face-xmas-display-x-face でトグルに切替えること ができますが、M-x x-face-insert を手動で実行した直後にイメージを表示 させたく無い場合は、.emacs に (setq x-face-xmas-auto-image nil) と書いておいて下さい。変数 highlight-headers-hack-x-face-p を nil に してもイメージを表示しなくなります。 コマンド x-face-xmas-display-x-face に与える引数が正の整数だった場合 はイメージを強制表示し、負の整数だった場合は強制非表示になります。 それ以外の場合には表示/非表示のトグル切替えを行ないます。 (関数 x-face-xmas-remove-x-face-glyph は x-face-xmas-display-x-face に負の整数の引数を与えた場合と同じ動作をします。) また M-x x-face-xmas-display-x-face を `ESC t' キーに割り当てる方法 を下に示します。 (add-hook 'HOOK (lambda () (define-key (current-local-map) "\M-t" 'x-face-xmas-display-x-face) )) ; HOOK にはお使いになる Newsreader/Mailer によって、それぞれ以下のもの ; を使って下さい。 ; ; Gnus gnus-message-setup-hook ; Mew mew-draft-mode-hook ; MAIL/RMAIL/VM/cmail mail-setup-hook ; mh-e mh-letter-mode-hook ; wl wl-mail-setup-hook 手動で M-x x-face-insert する以外に、送信バッファを編集し始めるとき に X-Face フィールドを自動付加して、かつイメージを表示させたいときは 次のように hook を設定して下さい。 **---------------------------------------------------------------** ** 5. Customize. で説明した hook の設定 ** ** ...送信するメッセージに X-Face フィールドを自動付加するには...** ** の代わりに使って下さい。 ** ** ** ** ただし Mew 1.91 以前のものを使う場合は 5. Costomize. の ** ** 説明のままで良く、以下のように書き換える必要はありません。 ** **---------------------------------------------------------------** (add-hook 'HOOK (lambda () (x-face-insert) (x-face-xmas-force-display-x-face) ; Mew 1.91 以前では不要 )) ; x-face-default-xbm-file で指定した xbm ファイルの内容がエンコードされ、 ; かつイメージを表示します。HOOK にはお使いになる Newsreader/Mailer に ; よって、それぞれ以下のものを使って下さい。 ; ; Gnus gnus-message-setup-hook ; MAIL/RMAIL/VM mail-setup-hook ; mh-e mh-letter-mode-hook ; cmail cmail-mail-hook or mail-setup-hook ; wl wl-mail-setup-hook ; ; Wanderlust (wl) では ~/.xface ファイルに X-Face の encoded string が ; あればそれが insert されますが、hook の関数に (x-face-insert) が含ま ; れていると上書きしてしまいます。~/.xface ファイルの方を有効にするに ; は上記の hook は使わずに ; ;(setq wl-highlight-x-face-func 'x-face-xmas-force-display-x-face) ; ; などの設定を行なってイメージを表示して下さい。 デフォルト以外のファイルを使いたい場合は次のように書きます。 (add-hook 'HOOK (lambda () (x-face-insert "FILENAME") (x-face-xmas-force-display-x-face) ; Mew 1.91 以前では不要 )) また、以下ような hook を設定しておくと、送信メッセージを書き始めると きに X-Face フィールドを付加するかどうかを (y or n) で選択できるよう になります。 (add-hook 'HOOK (lambda () (when (y-or-n-p "X-Face ヘッダを付けますか? ") (x-face-insert) (x-face-xmas-force-display-x-face) ; Mew 1.91 以前では不要 ))) From フィールドにイメージを表示しているときは X-Face フィールド全体 を隠して、From フィールドと X-Face フィールド全体を read-only にしま す。 X-Face フィールドにイメージを表示しているときは encoded string を隠 して X-Face フィールド全体を read-only にします。 いずれも見えなくなってしまった領域を不用意に書き変えてしまわないため の対策なのですが、read-only にした後でさらにヘッダを書き変えるような 処理が行なわれると、その処理の正しい結果が得られなかったりエラーで止 まってしまう場合があります。 もしそのような事態が不幸にして起こってしまうようでしたら、簡単には (setq x-face-xmas-inhibit-read-only t) と .emacs に書いておくと、見えないヘッダの領域を read-only にしない ようにすることができます。 もっと良いのは、ヘッダを書き変えるプログラムが実行されるより前に (x-face-xmas-remove-x-face-glyph) を実行して read-only の属性を消してしまうことです。 例えば tm の mime-editor/preview-message や SEMI の mime-edit-preview- message コマンドを実行したときに、read-only な領域の隣りにフィールド を挿入する際に起こるエラーを回避するには、.emacs で次のような hook を設定しておくと良いでしょう。どうやら Gnus では必須のようです。 (add-hook 'mime-editor/translate-hook 'x-face-xmas-remove-x-face-glyph) ; tm (add-hook 'mime-edit-translate-hook 'x-face-xmas-remove-x-face-glyph) ; SEMI 【表示スタイル】 x-face.el では From: フィールドに X-Face を表示 (*1) したり、複数の X-Face を表示するときの順序 (*2) が、デフォルトでは Gnus ふうになっ ています。これを highlight-headers ふうにしたい場合は .emacs に次の ような記述を追加してください。 (setq x-face-xmas-like-highlight-headers t) なお、x-face-xmas-replace-highlight-headers で置き換えられた関数 highlight-headers は無条件でオリジナルと同じ仕様になります。 (*1) "From:■ foo@bar" が Gnus ふう、 "From: ■foo@bar" が highlight-headers ふうです。 (*2) ヘッダに存在する X-Face を上から順にイメージに変換して、左から はじめて右に向かって並べるのが Gnus ふう、highlight-headers は 右からはじめて左に向かって並べます。 【メニュー】 メニューから Encode または Insert を実行した場合に、XEmacs では dialog box にイメージを表示します。この dialog box のサイズは (setq x-face-xmas-dialog-frame-alist '((width . 48) (height . 16) (left . 0) (top . -1))) のように設定することができます。デフォルトはこの通りの値です。 また dialog box に表示する文字フォントの高さが 16-dot 以外の場合には (setq x-face-xmas-font-height-in-dialog-box 14) などと設定して下さい。 メニューに表示するイメージは最初に作ったときにキャッシュするので、2 回目以降は dialog box の起動が速くなります。イメージファイルの変更時 刻やサイズが変わったり新しいファイルが追加された場合、キャッシュの内 容は自動的に更新されます。 このキャッシュは例えば以下のように .emacs に書いておくことによってプ リチャージすることも可能です。 ;;; x-face.elc を load するときにプリチャージする。 (add-hook 'x-face-load-hook 'x-face-xmas-image-file-cache-precharge) ;;; XEmacs を起動するときにプリチャージする。 (require 'x-face) (x-face-xmas-image-file-cache-precharge) もし x-face-image-file-directory の値がデフォルトと異なる場合は、 これらの前に setq で設定しておかなければなりません。 【Select-XFace】 寺西裕一さん がお作りになった select-xface を 使うと、挿入する X-Face をそのイメージを見ながら選択することができ ます。これは非常に便利なツールなので XEmacs のユーザの皆さんにはぜひ お使いになってごらんになることをお勧めします。このプログラムは Mew のパッケージに収められている他に、 /anonymous@ftp.gohome.org:/pub/elisp/select-xface/ または /anonymous@ftp.jpl.org:/pub/elisp/ などの下に select-xface-*.tar.gz として置かれています。 ---------------------------------------------------------------------- 7. その他。 関数 x-face-encode は手動のコマンドとして使われるとエンコード結果を ポップアップしたバッファに表示しますが、プログラムから関数として呼ば れた場合には戻り値としてエンコード結果を返すだけの動作になります。 返す値が複数ある場合のためにリストになっています。 x-face-insert コマンドを使って xbm ファイルからエンコードした X-Face フィールドが複数になる場合には、自動的に X-Face-Type フィールドも挿 入します。ここに書かれるのは元のイメージの配置を表す情報です。 また特に X-Face フィールドの個数が 3 の自然数倍になる場合には、それ が RGB 各色に分解されたカラー X-Face であるかどうかを尋ねます。毎回 尋ねられるのが煩わしいならば、その xbm ファイルの先頭に以下のような コメント行を挿入して下さい。 /* X-Face-Type: RGB */ /* Type: MONO */ (残念ながらこのような行があるファイルを表示できない viewer があるよ うですが ...。:-<) 参考までに、これらを検知するためにプログラムで使っている正規表現は、 "type[\t \"]*[:;=]+[\t \"]*rgb" または "type[\t \"]*[:;=]+[\t \"]*mono" で、大文字/小文字の区別はしていません。 ヘッダに複数の X-Face フィールドが存在するために、Mailer/Newsreader によっては次のような設定を行なう必要があります。 ; Gnus で送信するときに同名複数のフィールドに対する警告を抑制する。 (setq message-syntax-checks '( (long-lines . disabled) (control-chars . disabled) (multiple-headers . disabled) ; ←これ (signature . disabled) )) ; Mew が扱えるヘッダの上限値を大きくする。 (setq mew-header-max-length 100) それから、カラー X-Face を netpbm を使って作る方法を紹介しておきます。 まずはお絵書きツールなどを使って 48x48 またはその自然数倍のサイズの イメージファイルを作りましょう。ここで色数が多かったり中間色を使って いると、きれいな face を作ることができないことに注意して下さい。 テレビ放送のテストで使われるカラーバーの色 (白 黄 シアン 緑 マゼンタ 赤 青 黒) だけになっているのがベストです。例えばこれが gif だったら、 % giftoppm FACE.gif > FACE.ppm % ppmtorgb3 FACE.ppm こうすると 赤,緑,青 に分解された三つの pgm ファイル noname.red, noname.grn, noname.blu が生成されるので、さらに % pnmcat -tb noname.red noname.grn noname.blu > FACE.pgm こうやって縦方向に連結してから xbm に変換します。 % pgmtopbm FACE.pgm > FACE.pbm % pbmtoxbm FACE.pbm > FACE.xbm 元のカラーイメージが 48x48 より大きい場合は、必ず *縦方向* に連結し て下さい。48x48 の場合は横でも構いません。 最後にエディタを使ってできあがった FACE.xbm の第一行目に /* X-Face-Type: RGB */ と書き込めば終わりです。 (残念ながらこのような行があるファイルを表示できない viewer があるよ うですが ...。:-<) ---------------------------------------------------------------------- 8. add-hook. NEmacs や NEpoch で add-hook を使う場合は、以下の関数定義を ~/.emacs などのなるべく始めの方に書き込んで下さい。 (defun add-hook (hook function &optional append) "Add to the value of HOOK the function FUNCTION. FUNCTION is not added if already present. FUNCTION is added (if necessary) at the beginning of the hook list unless the optional argument APPEND is non-nil, in which case FUNCTION is added at the end. HOOK should be a symbol, and FUNCTION may be any valid function. If HOOK is void, it is first set to nil. If HOOK's value is a single function, it is changed to a list of functions." (or (boundp hook) (set hook nil) ) ;; If the hook value is a single function, turn it into a list. (let ((old (symbol-value hook))) (if (or (not (listp old)) (eq (car old) 'lambda)) (set hook (list old)) )) (or (if (consp function) ;; Clever way to tell whether a given lambda-expression ;; is equal to anything in the hook. (let ((tail (assoc (cdr function) (symbol-value hook)))) (equal function tail) ) (memq function (symbol-value hook)) ) (set hook (if append (nconc (symbol-value hook) (list function)) (cons function (symbol-value hook)) )) ))