[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11. 付録


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.1 XEmacs

XEmacs はパッケージの集合として配布されています。Gnus の XEmacs パッケー ジが必要とするものは何であれ、あなたはインストールすべきです。今のところ 必要なのは ‘gnus’, ‘mail-lib’, ‘xemacs-base’, ‘eterm’, ‘sh-script’, ‘net-utils’, ‘os-utils’, ‘dired’, ‘mh-e’, ‘sieve’, ‘ps-print’, ‘W3’, ‘pgg’, ‘mailcrypt’, ‘ecrypto’ および ‘sasl’ です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2 歴史

GNUS は梅田政信氏によって書かれました。1994年の秋が忍び寄ってくるこ ろ、退屈していたラルス・マッグヌ・イングブリグットスン (Lars Magne Ingebrigtsen) は Gnus を書き直そうと決心しました。

この非道な行為の責任者を調べてみたいのなら、あなたの (いまいましい!) ウェ ブブラウザーを http://quimby.gnus.org/ に向けることができます。こ れは新しくて粋な版の Gnus の第一配布場所で、Newsrc をぶっ壊して人々を激 怒させるサイトとしても知られています。

最初のアルファ版の開発期間に、新しい Gnus は“(ding) Gnus”と呼ばれてい ました。(ding) はもちろん、ding is not Gnus の短縮形で、これ はまったく完全な嘘ですが、だれがそんなことを気にするでしょうか? (ところ で、この短縮形の“Gnus”はおそらく梅田さんの意図通り「ニュース」と発音さ れるべきで、そうするともっと適切な名前になります。そう思いませんか?)

どちらにせよ、すべてのエネルギーを新しい元気の良い名前を付けるのに使い果 たした後で、その名前は あまりに 元気が良すぎるということになり、 それを“Gnus”と再び命名しました。でも、今回は大文字と小文字を混ぜていま す。“Gnus”と“GNUS”です。新しいもの と 古いもの。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.1 Gnus Versions

最初の「正しい」Gnus 5 のリリースは 1995年11月に Emacs 19.30 の配布に含 まれたときになされました (132 の (ding) Gnus のリリース 足すこと の Gnus 5.0 の 15 リリース)。

1996年3月に次の世代の Gnus (別名“September Gnus”(99 リリースの後 で)) が“Gnus 5.2”という名前でリリースされました (40 リリース)。

1996年の 7月28日に Red Gnus の作業が始まり、それは 1997年1月25日 に (84 リリースの後で)“Gnus 5.4”としてリリースされました (67 リリース)。

1997年9月13日に、Quassia Gnus が開始され、37 リリース続きました。それは “Gnus 5.6”として 1998年3月8日にリリースされました (46 リリース)。

1998年8月29日に Gnus 5.6 から Pterodactyl Gnus が生まれ、1999年12月3日 に (99 リリースと CVS リポジトリでの作業の後)“Gnus 5.8”としてリリース されました。

2000年10月26日に Oort Gnus が開始され、2003年5月1日に Gnus 5.10 としてリ リースされました (24 リリース)。

2004年1月4日に No Gnus が始まりました。

2010年4月19日、Gnus の開発は Git に移行しました。詳細 は http://git.gnus.org を見てください (可能なら http://www.gnus.org はそ の情報で更新されるでしょう。)

接頭語を持った版の Gnus—“(ding) Gnus”,“September Gnus”,“Red Gnus”,“Quassia Gnus”,“Pterodactyl Gnus”,“Oort Gnus”,“No Gnus”—に出会っても、混乱しないでください。あなたが恐がっていることを 知られてはいけません。後ろに下がりなさい。ゆっくりと。他に何をしても、走っ てはいけません。それが届かくなるまで、静かに歩き去りなさい。正しくリリー スされた版の Gnus を見つけて、代わりにそれにすり寄りなさい。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.2 他の Gnus のバージョン

Lars さんが調製してリリースした Gnus に加えて、日本では Semi-gnus の開発 が行なわれています。これは SEMI という MIME の機能を 実現するためのライブラリーを使うことを前提としています。

これらの gnus は、主に Gnus 5.6 と Pterodactyl Gnus を元にしています。そ れらは“Semi-gnus”と総称され、T-gnus, Nana-gnus および Chaos の異なった 系統があります。これらは強力な MIME の機能と各国語対応の機能を 提供するもので、特に日本人の利用者にとって大事なものです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.3 なぜ?

Gnus の目的は何ですか?

私は、あなたの考え付くことをすべてできる「いかす」「盛り上がってる」「かっ こいい」「しゃれた」ニュースリーダーを提供したいと思います。これは私の大 元の動機だったのですが、Gnus の作業をしている間に、この世代のニュースリー ダーは本当に石器時代に属していることが明らかになりました。ニュースリーダー は、インターネットの揺籃期からほとんど発展していませんでした。もし現在の 増加率で流通量が増加しつづければ、すべての現在のニュースリーダーはまった く役に立たなくなるでしょう。毎日何千もの新しい記事がやってくるニュースグ ループを扱うにはどうすれば良いのでしょう? 数百万の投稿者に遅れないように 付いていくにはどうすれば良いのでしょう?

Gnus はこれらの質問に真の解決を提供するわけではありませんが、私 は Gnus がニュースを読み、取得するための新しい方法を実験する場として使わ れることを、是非とも見届けたいのです。ニュースリーダーをバックエンドから 分離するという梅田さんの賢明な方針を拡張することによって、今や Gnus はメー ルを取得したり、異なる出所からニュースを取得するための新しいバックエンド を書きたい人のために、シンプルなインターフェースを提供しています。私は役 に立ちそうなすべての場所に、カスタマイズのためのフックを加えました。それ によって、探検し、発明したいすべての人を招いているのです。

おそらく Gnus は完成することはないのかもしれません。 C-u 100 M-x all-hail-emacsC-u 100 M-x all-hail-xemacs で す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.4 互換性

Gnus は GNUS と完全に互換性があるように設計されています。ほとんどす べてのキーの割り当てはそのまま残っています。もちろん、多くのキーの割り当 てが追加されましたが、一つか二つの目に付かないものを除いて、古い割り当て が変更されたことはありません。

私たちのモットーは:

鋼鉄の骨組みの空高く

です。(訳注: チャールズ・レズニコフの詩“The Bridge”の引用。この詩の本 体はたった一行“In a cloud bones of steel.”だけ。直訳すれば「雲の中に鋼 の骨たち」。)

すべての命令は名前が変わっていません。いくつかの内部関数は名前を変えまし た。

gnus-uu パッケージは劇的に変化しています。See section 記事のデコード.

主要な互換性の問題の一つは、複数の概略バッファーが存在することです。グルー プを読んでいるときに関連するすべての変数は、それが属する概略バッファーで バッファーローカルです。概略バッファーでコマンドが実行されるときはいつで も、多くの重要な変数がそれのグローバルな値にも複製されますが、あなたが注 意していないと、その変更は正しくない値が使われることをもたらすかもしれま せん。

GNUS の内部の知識に依存したすべてのコードは実行できないでしょう。二 つ例を挙げます: gnus-newsrc-alist の並べ替え (もしくは、実際は何 らかの方法でそれを変更すること) は厳しく禁止されています。Gnus はこの連 想リストの項目を指し示すハッシュテーブルを維持しており (それは多くの関数 の速度を上げます)、直接連想リストを変更することは異常な結果をもたらすで しょう。

古い hilit19 のコードはまったく動作しません。実際のところ、おそらくすべ ての hilit コードをすべての Gnus のフッ ク (gnus-group-prepare-hook およ び gnus-summary-prepare-hook) から取り除くべきです。Gnus はハイラ イトのためのいろいろな統合された関数を提供します。これらはもっと速くもっ と正確です。すべての人の人生を楽にするために、Gnus はディフォルトですべ ての hilit フックからすべての hilit 呼び出しを取り除きます。きたないも の! 失せろ!

expire-kill のようなパッケージはもう動作しません。実際 Gnus を使 い始めたときには、おそらくすべての古い GNUS パッケージ (と他のコー ド) を消去するべきでしょう。GNUS に実行させるために書いたコードは、 Gnus がすでに実行しているということは良くあることです。(くすくす。)

ものごとを実行する古いやり方はまだ使うことができますが、新しいやり方だけ がこのマニュアルに記載されています。もしこのマニュアルを読んでいる間に何 かをする新しいやり方を発見しても、古いやり方を止めなければならないという ことではありません。

Gnus はすべての GNUS の起動ファイルを理解します。

全体として、GNUS の内部に依存したコードをほとんど書いていない普通の 利用者は、問題に苦しむことはないでしょう。もし問題が起こったら、魔法 の M-x gnus-bug 命令を実行することによって私に知らせてください。

非常に よくバグ報告を送る習慣があるのなら、あなたの役に立とうとす る help バッファーが、しばらくするとうるさく感じるかもしれません。そうな らば、それが表示されないようにするために、 gnus-bug-create-help-buffernil に設定してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.5 標準への準拠

理由無き反抗などと申すものはございませんよ、奥様。私たちはすべての知られ ている標準に準拠しています。もちろん私たちが賛成できない標準と/もしくは 習慣は除きますが。

RFC (2)822

この標準への知られている違反はありません。

RFC 1036

この標準も知られている違反はありません。

Son-of-RFC 1036

これにはいくつかの違反があります。

X-Newsreader
User-Agent

これらは「つまらないヘッダー」と見なされていますが、私は消費者の情報であ ると考えています。tinNetscape から送られてくる非常に多 くの酷い記事を見た後では、私は記事を投稿するためにはそれらを使わない方が 良いということを知っています。もし X-Newsreader ヘッダーが無けれ ば、私はその情報を得ることはなかったでしょう。

USEFOR

USEFOR は、Son-of-RFC 1036 に基づいて IETF の作業部会が RFC 1036 の後継 として書いているものです。ニュース記事の様式に対して、いろいろな変更を提 案した草稿を作成しました。その草稿が RFC として受け入れられたときに、 Gnus タワーはその変更の実装を調べることになるでしょう。

MIME - RFC 2045-2049 etc

MIME 関連のすべての RFC がサポートされています。

Disposition Notifications - RFC 2298

Message Mode は受信者からの開封確認を要求することができます。

PGP - RFC 1991 and RFC 2440

RFC 1991 は最初の PGP メッセージの規格で、Informational RFC (訳注: 後述の標準化トラックではないが有用な情報) として発行されまし た。現在 Open PGP と呼ばれる後継の RFC 2440 が、標準化トラック (訳注: Standards Track—国際標準とすべき仕様) に乗せられました。どちらも 非-MIME メッセージのための PGP の様式を定義します。 Gnus はエンコード (署名および暗号化) とデコード (認証および暗号のデコー ド) の両方をサポートします。

PGP/MIME - RFC 2015/3156

RFC 2015 (RFC 1991 の代わりに RFC 2440 に基づいた 3156 で置き換えられま した) は、RFC 1991/2440 を MIME で囲う様式について述べています。 Gnus はエンコードとデコードの両方をサポートします。

S/MIME - RFC 2633

RFC 2633 は S/MIME の形式について述べています。

IMAP - RFC 1730/2060, RFC 2195, RFC 2086, RFC 2359, RFC 2595, RFC 1731

RFC 1730 は IMAP バージョン 4 で、RFC 2060 (IMAP 4 改定 1) で多少更新されています。 RFC 2195 は IMAP の CRAM-MD5 認証について述べています。 RFC 2086 は IMAP の使用制限一覧 (ACL) について述べています。 RFC 2359 は IMAP のプロトコルの拡張について述べています。 RFC 2595 は IMAP における適切な TLS の統 合 (STARTTLS) について述べています。 RFC 1731 は IMAP の GSSAPI/Kerberos4 の手法について述べていま す。

上に書かれている文章に関することで、Gnus がそれを満たしていないような動 作をしていることに気付いたら、ためらわずに Gnus タワーと私たちに知らせて ください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.6 Emacsen

このバージョンの Gnus は以下のもので動作します:

この Gnus の版はこれより古いどんな Emacsen でも完全に動作しないでしょう。 少なくとも信頼できる動作はしないでしょう。古い版の Gnus は古い Emacs の 版でも動作するでしょう。特に Gnus 5.10.8 は Emacs 20.7 と XEmacs 21.1 で も動くはずです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.7 Gnus の開発

Gnus は二つのサイクルで開発されています。最初のサイクルでは開発メーリン グリスト ‘ding@gnus.org’ でたくさんの議論を行ないます。そこでは人々 が変更や新しい機能の提案をしたり、パッチや新しいバックエンドを投稿します。 この段階は「アルファ」段階と呼ばれています。というのは、この段階でリリー スされた Gnusae は「アルファリリース」もしくは (他の団体ではより良く使わ れる)「スナップショット」と呼ばれるものだからです。この段階では Gnus は 不安定で、一般の利用者によって使われるべきではないと考えられています。 Gnus のアルファリリースは“Oort Gnus”や“No Gnus”のような名前になって います。See section Gnus Versions.

のらくらと 10-100 くらいのアルファリリースをした後で、Gnus は「凍結」さ れたと宣言され、バグ修正のみが適用されます。Gnus は接頭語を失い、その代 わりに“Gnus 5.10.1”のように呼ばれます。これらは普通の人が使うことがで きるものと考えられ、主に ‘gnu.emacs.gnus’ ニュースグループで議論さ れています。このニュースグループは ‘info-gnus-english@gnu.org’ メー リングリストにミラーされていて、それは ‘gmane.emacs.gnus.user’ とし て Gmane にも載っています。これらのリリースは最終的に Emacs に統合されま す。

アルファ版の Gnus とリリースされた版の Gnus ではいくつかの変数、特 に mail-source-delete-incoming、のディフォルトが異なります。これ はメールを扱っている際に、アルファリリースがしゃっくりをしてメールを失な うことを避けるためです。See section メールソースのカスタマイズ.

ding メーリングリストと Gnus ニュースグループにおける議論は、純粋に公衆 の関心によって分離されているわけではありません。アルファ Gnus リリース が (ときどき) するかもしれない恐ろしいことを公衆の場で書くのは、皆を恐れ させるというのも真実ですが、もっと重要なことは、導入された新しい実験的な 機能について話すことが、一般の利用者を混乱させるかもしれないということで す。新しい機能は頻繁に導入され、いじくられ、不十分であると判断され、そう すると捨てられるか、完全に書き換えられるかのどちらかです。メーリングリス トを読んでいる人は普通はこの速い変更に付いていきますが、ニュースグループ の人もそうであると見なすことはできません。

したがってアルファ版の問題やそれに関する質問があるなら、それらは ding メー リングリスト ‘ding@gnus.org’ に向けてください。このリスト は Gmane に ‘gmane.emacs.gnus.general’ としてもあります。

いくつかの変数、特に mail-source-delete-incoming のディフォルト値 はアルファ Gnus とリリースされた Gnus で異なっています。これはアルファ版 がメールを扱っているときに、もし、しゃっくりをしても、メールが失われてし まうことを防ぐためです。 See section メールソースのカスタマイズ.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.8 貢献者

新しい Gnus の版は (ding) メーリングリストのすべての人たちの助けが無けれ ばできなかったでしょう。一年以上にわたって、私は毎日彼らから莫大な数の素 敵なバグレポートを受け取り、そのそれぞれが私を喜びで満たしました。投げキッ ス。このリストの人たちは、私のリリース方針のために耐え難きを耐える試練に 遭いました: 「あぁ、それはすばらしい考えだ <かしゃかしゃかしゃ…> よしっ、 すぐにリリースだ <えいやっ> あれれっ、まったく動かないぞ <かしゃかしゃか しゃ…> よしっ、すぐに出そう <ほらよっ> おっと、待った、ぜんぜん動作しな い…」。Micro$oft—あっかんべーだ。アマチュアめ。私は もっと 悪 い。(それとも「より悪い」?「もっと悪い」?「最悪」?)

私はこの機会に学会に感謝を… おおっと、違った。

このマニュアル (Gnus 英語版) は Adrian Aichner と Ricardo Nassif, Mark Borges によって校正され、Jost Krieger によって一部分を校正されました。

以下の人々は多くのパッチと提案で貢献しました:

Christopher Davis, Andrew Eskilsson, Kai Grossjohann, Kevin Greiner, Jesper Harder, Paul Jarc, Simon Josefsson, David K,Aegedal, Richard Pieri, Fabrice Popineau, Daniel Quinlan, Michael Shields, Reiner Steib, Jason L. Tibbitts, III, Jack Vinson, 山岡 克美, and Teodor Zlatanov.

それと、以下の人にもパッチやその他のものを感謝します:

Jari Aalto, Adrian Aichner, Vladimir Alexiev, Russ Allbery, Peter Arius, Matt Armstrong, Marc Auslander, Miles Bader, Frank Bennett, Alexei V. Barantsev, Robert Bihlmeyer, Chris Bone, Mark Borges, Mark Boyns, Rob Browning, Lance A. Brown, Kees de Bruin, Martin Buchholz, Joe Buehler, Kevin Buhr, Alastair Burt, Joao Cachopo, Zlatko Calusic, Massimo Campostrini, Castor, David Charlap, Dan Christensen, Kevin Christian, Jae-you Chung, James H. Cloos, Jr., Laura Conrad, Michael R. Cook, Glenn Coombs, Andrew J. Cosgriff, Neil Crellin, Frank D. Cringle, Geoffrey T. Dairiki, Andre Deparade, Ulrik Dickow, Dave Disser, Rui-Tao Dong, Joev Dubach, Michael Welsh Duggan, Dave Edmondson, Paul Eggert, Mark W. Eichin, Karl Eichwalder, 榎並 嗣智, Michael Ernst, Luc Van Eycken, Sam Falkner, Nelson Jose dos Santos Ferreira, Sigbjorn Finne, Sven Fischer, Paul Fisher, Decklin Foster, Gary D. Foster, Paul Franklin, Guy Geens, Arne Georg Gleditsch, David S. Goldberg, Michelangelo Grigni, Dale Hagglund, D. Hall, Magnus Hammerin, 半田 剣一, Raja R. Harinath, 林 芳樹, P. E. Jareth Hein, ひさしげ けんじ, Scott Hofmann, Tassilo Horn, Marc Horowitz, Gunnar Horrigmo, Richard Hoskins, Brad Howes, Miguel de Icaza, Fran,Agois Felix Ingrand, 市川 達 哉, 石川 一郎, Lee Iverson, 岩室 元典, Rajappa Iyer, Andreas Jaeger, Adam P. Jenkins, Randell Jesup, Fred Johansen, Gareth Jones, Greg Klanderman, Karl Kleinpaste, Michael Klingbeil, Peter Skov Knudsen, 小林 修平, Petr Konecny, 小関 吉則, Thor Kristoffersen, Jens Lautenbacher, Martin Larose, Seokchan Lee, Joerg Lenneis, Carsten Leonhardt, James LewisMoss, Christian Limpach, Markus Linnala, Dave Love, Mike McEwan, Tonny Madsen, Shlomo Mahlab, Nat Makarevitch, Istvan Marko, David Martin, Jason R. Mastaler, Gordon Matzigkeit, Timo Metzemakers, Richard Mlynarik, Lantz Moore, 守岡 知彦, Erik Toubro Nielsen, Hrvoje Niksic, Andy Norman, Fred Oberhauser, C. R. Oldham, Alexandre Oliva, Ken Olstad, 大西 雅 晴, 小野 秀貴, Ettore Perazzoli, William Perry, Stephen Peters, Jens-Ulrik Holger Petersen, Ulrich Pfeifer, Matt Pharr, Andy Piper, John McClary Prevost, Bill Pringlemeir, Mike Pullen, Jim Radford, Colin Rafferty, Lasse Rasinen, Lars Balker Rasmussen, Joe Reiss, Renaud Rioboo, Roland B. Roberts, Bart Robinson, Christian von Roques, Markus Rost, Jason Rumney, Wolfgang Rupprecht, Jay Sachs, Dewey M. Sasser, Conrad Sauerwald, Loren Schall, Dan Schmidt, Ralph Schleicher, Philippe Schnoebelen, Andreas Schwab, Randal L. Schwartz, Justin Sheehy, Danny Siu, Matt Simmons, Paul D. Smith, Jeff Sparkes, Toby Speight, Michael Sperber, Darren Stalder, Richard Stallman, Greg Stark, Sam Steingold, Paul Stevenson, Jonas Steverud, Paul Stodghill, 須藤 清一, Kurt Swanson, Samuel Tardieu, Teddy, 戸沢 晶彦, Chuck Thompson, Philippe Troin, James Troup, Trung Tran-Duc, Jack Twilley, Aaron M. Ucko, Aki Vehtari, Didier Verna, Vladimir Volovich, Jan Vroonhof, Stefan Waldherr, Pete Ware, Barry A. Warsaw, Christoph Wedler, Joe Wells, Lee Willis, and Lloyd Zusman.

Gnus のアルファ配布に含まれている ChangeLog は、それぞれの人たちが行なっ たことの完全な大要を伝える豊かな読み物です。(550KB といくらか)。(訳 注: 非常に古い ChangeLog の記述が何度かばっさり捨てられましたが、それで も現在は非常に大きなサイズになっています。)

私が忘れてしまったすべての人に謝罪します。間違いなくたくさんの人を忘れて しまったことでしょう。

わぁ、こんなに人がいるとは思わなかった。これは本当に Gnus を使っている人 がいるということなんでしょう。そんなことを誰が想像したでしょうか!


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.9 新しい機能

これらのリストは、もちろん たいていの 重要な新しい機能に関す る 短い 要約でしかありません。いいえ、実は違います。もっともっと たくさんのものがあるのです。そう、事実上私たちは十分に用の無いも の (feeping creaturism) を持っているのです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.9.1 (ding) Gnus

Gnus 5.0/5.1 の新しい機能:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.9.2 September Gnus

Gnus 5.2/5.3 の新しい機能:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.9.3 Red Gnus

Gnus 5.4/5.5 の新しい機能:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.9.4 Quassia Gnus

Gnus 5.6 の新しい機能:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.9.5 Pterodactyl Gnus

Gnus 5.8 の新しい機能:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.9.6 Oort Gnus

Gnus 5.10 の新しい機能:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2.9.7 No Gnus

No Gnus の新しい機能:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.3 マニュアルを書く

おそらく、たいていのマニュアルは事後に書かれていると思います。つまり、す でにあるプログラムを文書化しているということです。このマニュアルはそうい う方法で書かれていません。何かを実装するときは、何かをそのままマニュアル の一節に書きます。それから機能の説明が難しいことを発見して、それがどのよ うにあるべきであるかを書き、次には実装を変更します。文書とコードを書くこ とは協調して行なわれていきます。

もちろん、これはこのマニュアルには流れ構造がほとんど無いか、あっても少し だということを意味します。Gnus の完全にすべてのことが説明されていますが、 あなたが探している場所ではないということがよくあります。これはリファレン スマニュアルであって、Gnus を始めるための手引きではありません。

それはこのリファレンスマニュアルを元にして書かれた、まったく違った本にな るでしょう。とても違ったものになるはずです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.4 用語

ニュース (news)

これは、あなたがそれを読むために使うことになっているもの、つまり、それと いうのがニュースです。ニュースは一般的には近くの NNTP サーバー から取得され、一般的にはすべての人が公に利用することができます。もしニュー スを投稿すると、あなたがまさに書いたものを全世界の人たちが読むことになる でしょう。そして、みんながいたずらっぽくクスクス笑うでしょう。あなたの知 らないところで。

メール (mail)

あなたに個人的に配送されるすべてのものがメールです。いくつかのニュース/ メールリーダー (Gnus のような) はメールとニュースの区別を曖昧にしますが、 違いがあります。メールは私的です。ニュースは公的です。メールを送信するこ とは投稿ではなく、返信はフォローアップではありません。

返信 (reply)

あなたが読んでいるものを書いた人にメールを送ることです。

フォローアップ (follow up)

あなたが読んでいる記事に応答して、現在のニュースグループに記事を投稿する ことです。

バックエンド (back end)

Gnus はメールとニュースがほとんど同じだとみなします。本当に。違いは実際 の記事にどのようにアクセスするかだけです。メールメッセージはローカルディ スクのファイルから読めるのに対して、ニュース記事は一般 に NNTP プロトコルで取得します。Gnus の内部構造は、それらのた めに「フロントエンド」と数々の「バックエンド」から成り立っています。内部 的には、あなたがグループに入る (そう、<RET> をたたく) と、それによっ て Gnus のフロントエンドの機能を呼び出します。そうするとフロントエンドは、 バックエンドに「foo グループの記事のリストをくれ」とか「4711 番の記事を 見せてよ」と「話す」のです。

そういうわけで、バックエンドは主にプロトコルか、ファイルの形式とディレク トリーの配置のどちらかを定義します。前者は nntp バックエンド が NNTP でニュースにアクセスしたり、nnimap バックエンド が IMAP でメールにアクセスすることを指します。また、後者 は nnspool バックエンドが共通の「スプールディレクトリー」形式にア クセスしたり、それととてもよく似たファイルの形式とディレクトリーの配置を 介して nnml バックエンドがメールにアクセスすることを指します。

Gnus は基礎的なメディアを扱いません。言わばこれは、すべてバックエンドに よって行なわれるということです。バックエンドは記事にアクセスするための機 能の集成です。

しかし、「バックエンド」という用語は「サーバー」と言った方がふさわしい場 面でときどき使われます。そして同じことを指すことができる「選択方法」 (select method) という用語があります。かように Gnus の用語はとても混乱し ています。

基本 (native)

Gnus はいつも一つの方法 (とバックエンド) を、ニュースを得るための「基本」 もしくはディフォルトの手段として使います。

外部 (foreign)

同時に任意の数の外部グループをアクセスできる状態にすることもできます。こ れらはニュースを取得するための、基本ではなく、二次のでもないバックエンド を使うグループです。

二次の (secondary)

二次のバックエンドは、基本と外部の間くらいに位置するバックエンドですが、 ほとんど基本と同じように動作するものです。

記事 (article)

ニュースとして投稿されたメッセージです。

メールメッセージ (mail message)

メールで送られたメッセージです。

メッセージ

メールメッセージもしくはニュース記事です。

ヘッド (head)

メッセージの最上部で、管理情報 (等) が入れられているところです。

本文 (body)

記事の残りの部分です。ヘッドに無いものはすべて本文です。

ヘッダー (header)

記事のヘッドの行です。

ヘッダー群 (headers)

そのような行の集合もしくは、ヘッドの集合です。もしくは、NOV 行 の集合です。

NOV

NOV は News OverView の略です。それらはニュースサーバーのヘッ ダーの一つの形式で、記事の簡潔なヘッダーの情報を含むデータを提供するため に、サーバーが自ら作ります。nntp バックエンドで は Gnus は NNTP サーバーが作るものを使いますが、いくつかのサー バー (特に nnml) のためには Gnus 自身が作ります。

グループに入ると、Gnus はグループのすべての未読記事のヘッダーをバックエ ンドに要求します。ほとんどのサーバーは News OverView 様式をサポートして います。それは標準の HEAD 様式よりコンパクトで、とても速く、読んで 解析することができます。

NOV データは一つ以上のテキスト行 (see (elisp)Text Lines section ‘Motion by Text Lines’ in The Emacs Lisp Reference Manual) から成り、それぞ れの行は一つの記事のヘッダー情報を持っています。ヘッダー情報はタブで区切 られた一連のヘッダーの内容で、記事番号、表題、著者、日付、Message-ID、 References などを含んでいます。

それらのデータは Gnus が概略行をすばやく生成することを可能にします。しか しサーバーが NOV をサポートしていなかったり、故意にまたはある 理由でそれを使わないようにしてしまうと、Gnus はそれぞれの記事のヘッダー を一つずつ解析することによってヘッダー情報を生成しようとするでしょう。そ れには時間がかかります。したがって、サーバーが間違った NOV デー タを作ることがわかっている場合以外は、nn*-nov-is-evil (see section 遅くて高価な接続) を nil ではない値にすることは、 通常は良い考えではありません。

レベル (level)

それぞれのグループは何らかの「レベル」(1-9) で購読されています。低いレベ ルのものは高いレベルのものより「より」購読されています。実際のところ、レ ベル 1-5 のグループは「購読」; 6-7 は「未購読」; 8 は「ゾンビ」; 9 は 「切られた」(killed) と見なされます。グループの一覧を表示したり、新しい 記事を走査する命令は、すべて数値接頭引数を「動作レベル」として使います。

切られたグループ (killed groups)

切られたグループの情報は保存されたり更新されたりしないので、切られたグルー プを扱うのは購読されているグループよりも簡単です。

ゾンビグループ (zombie groups)

ほとんど切られたグループと同じで、それより少し死んでいるだけです。

アクティブファイル (active file)

ニュースサーバーは、どの記事を持っているかとどのグループが存在するかを記 録しておかなければなりません。アクティブファイルに格納されるすべてのこの 情報は、あなたが推測するように比較的大きいです。

偽グループ (bogus groups)

.newsrc’ ファイルに存在するけれどもサーバーが知らないグループ (す なわち、それはアクティブファイルにありません) は 偽グループ です。 おそらくそのグループは (もはや) 存在していないのでしょう。

活性化 (activating)

サーバーにグループの情報を尋ねて未読記事の数を演算する行為は「グループを 活性化 (activate) する」と呼ばれています。活性化されていないグループは、 グループバッファーに ‘*’ とともに一覧表示されます。

スプール (spool)

ニュースサーバーは何らかのやり方で記事をローカルに保存します。ある古い流 儀の保存方法は、単に記事毎に一つのファイルを持つことです。それは伝統的な スプール (traditional spool) と呼ばれます。

サーバー (server)

接続して、ニュース (もしくはメール) を取得することができるマシンです。

選択方法 (select method)

バックエンドと、サーバーおよび仮想サーバーの設定を指定する構造です。

仮想サーバー (virtual server)

名前が付けられていて、その名前で指定することができる選択方法です。選択方 法は (物理的な) サーバーに関するすべてを定義するので、ものごとを全体とし て捉えるのは仮想サーバーになります。

洗濯 (washing)

バッファーを持ってきて、何らかの種類のフィルターにかけることです。結果 は (たいてい) 元のものよりもよりきれいで喜ばしいものになるでしょう。

一時グループ (ephemeral groups)

たいていのグループはどの記事を読んだかのデータを保存します。「一時」グルー プはデータが溜められないグループです—グループを出ると、それは天空のか なたに消え去ります。

固定グループ (solid groups)

これは一時グループの反対です。グループバッファーに一覧表示されているすべ てのグループは固定グループです。

まばら記事 (sparse articles)

gnus-build-sparse-threads が有効にされているときに、それらは概略 バッファーに表示される (存在しない) 記事のための場所取りです。

スレッド化 (threading)

応答の記事を、それが応答した元記事の直後に置くことです—階層的な流儀で。

根 (root)

スレッドの最初の記事が根です。それはスレッドのすべての記事の祖先です。

親 (parent)

応答が得られた記事です。

子 (child)

それとは別の記事、すなわち親に応答する記事です。

まとめ送り (digest)

複数のメッセージを一つのファイルに集めたものです。最も一般的なまとめ送り の様式は、RFC1153 で規定されています。

分割 (splitting)

ある規則によってメールを区分けする行為です。ときどき間違ってメールの濾 過 (filtering) と呼ばれます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.5 カスタマイズ

すべての変数は、このマニュアルのどこか他のところで適切に説明されています。 この章は、非常に良くある状況でどのように Gnus をカスタマイズすれば良いか を調べるための、総合的な案内になるように作られています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.5.1 遅くて高価な接続

Emacs をローカルのマシンで実行していて、非常に細いひもの向こうのマシンか らニュースを取り寄せているとしたら、Gnus がサーバーから取って来なければ ならないデータの総量を減らしたくなるでしょうね。

gnus-read-active-file

これを nil にしてください。これは Gnus がサーバーにアクティブファ イル全体を要求することを禁止します。このファイルはしばしば非常に大きいで す。さらに、Gnus が不意にアクティブファイルをとにかく取り寄せようと決意 しないように、gnus-check-new-newsgroups およ び gnus-check-bogus-newsgroupsnil に設定する必要があり ます。

gnus-nov-is-evil

通常これは 常に nil にしておかなければなりません (それがディ フォルトです)。例えばもし nntp バックエンド で NOV (see section 用語) を使わないようにした い (see section クロスポストの扱い) のであれば、これを設定する代わり に nntp-nov-is-evilnil 以外の値にしてください。しか し Gnus は NNTP サーバーが NOV をサポートするかどう かを自分で調べるので、通常 nntp-nov-is-evil を設定する必要はあり ません。とにかく Gnus が NOV を利用しないようにすると、 NNTP サーバーから記事のヘッダーを掴み取ってくる動作が、あまり 速くなりません。

他のバックエンドのための変数として nndiary-nov-is-evil, nndir-nov-is-evil, nnfolder-nov-is-evil, nnimap-nov-is-evil, nnml-nov-is-evil およ び nnspool-nov-is-evil があります。 gnus-nov-is-evilnil 以外の値を与えると、それらすべての 変数を上書きしてしまうことに注意してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.5.2 遅いターミナル接続

Emacs と Gnus を実行しているシステムに、家のコンピューターをダイアルアッ プで接続しているとしましょう。モデムが遅い場合は、電線を伝って送られてい るデータの総量を (可能な限り) 減らしたくなるでしょう。

gnus-auto-center-summary

Gnus が概略バッファーをリセンターする (訳注: 現在の記事が真ん中に表示さ れるようにする) するために、これを nil に設定してください。これ が vertical だったら、垂直方向のリセンターだけをします。 nil でも vertical でも無ければ、水平方向と垂直方向の両方で リセンターを行ないます。

gnus-visible-headers

記事に含まれるヘッダーを最小限に減らします。実際のところ、それらが無くて もすべて間に合わせることができます—たいていの役に立つデータは、とにか く概略バッファーにありますから。この変数 を ‘^NEVVVVER’ や ‘From:’ や、何でも必要になりそうなものに設定 してください。

利用できるすべての「隠す」機能を有効にするために、以下を使ってください:

 
(setq gnus-treat-hide-headers 'head
      gnus-treat-hide-signature t
      gnus-treat-hide-citation t)
gnus-use-full-window

これを nil に設定することによって、すべてのウィンドウを小さくする ことができます。これは総じてそんなに減らしませんが、この記事は何が何でも 読みたくなかったんだと決心する前に、それを少ししか見ないで済みます。

gnus-thread-hide-subtree

これを nil ではない値にしておくと、すべての概略バッファーのスレッ ド (の親以外) は、初めは隠されているようになります。

gnus-updated-mode-lines

これを nil にすると、Gnus はバッファーのモード行に情報を表示しな いので、いくらか時間を節約できるでしょう。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.5.3 少ないディスク容量

起動ファイルはやや大きくなり得るので、空き容量が少なくなってきているとき は、そのサイズを少し小さくする必要があるでしょう。

gnus-save-newsrc-file

これを nil にすると、Gnus は決して ‘.newsrc’ を保存しませ ん—‘.newsrc.eld’ だけを保存します。これは Gnus 以外のニュースリー ダーが使えなくなることを意味します。この変数はディフォルトで t で す。

gnus-read-newsrc-file

これが nil であれば、Gnus は ‘.newsrc’ を決して読みませ ん—‘.newsrc.eld’ だけを読みます。これは Gnus 以外のニュースリーダー が使えなくなることを意味します。この変数はディフォルトでは t です。

gnus-save-killed-list

これが nil であると、Gnus は死んだグループのリストを保存しません。 この変数を nil に設定したときは、 gnus-check-new-newsgroupsask-server に、 gnus-check-bogus-newsgroupsnil に設定するべきでしょう。 この変数はディフォルトで t です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.5.4 遅いマシン

遅いマシンを持っているか、または本当は単に忍耐力が無いだけでも、Gnus を 速く走らせるためにできることが少しあります。

起動を速くするために gnus-check-new-newsgroups およ び gnus-check-bogus-newsgroupsnil に設定してください。 概略バッファーに入ることと抜けることを速くするため に、gnus-show-threadsgnus-use-cross-reference、それ に gnus-nov-is-evilnil に設定してください。 遅くて高価な接続 も参照してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.6 問題解決

Gnus は箱から出してすぐに 非常に よく動作します—どんな問題が起 きることも想像できません、本当に。

オッホン。

  1. コンピューターの電源が入っていることを確かめてください。
  2. 現在通用している版の Gnus を本当に読み込んでいることを確認してください。 今まで GNUS を実行してきたのであれば、Gnus が動作するように一 度 Emacs を終了して再起動する必要があります。
  3. M-x gnus-version を試してください。もし ‘No Gnus v0.17’ のよ うなものが出てきたなら、正しいファイルが読み込まれています。そうならない のは古い ‘.el’ ファイルが散らかっているせいでしょう。それらを消して ください。
  4. FAQ と入門書を読むために、ヘルプグループ (グループバッファー で G h) を読んでください。
  5. Gnus は多くの再帰構造で動作しているので、何か極端な (そして非常に希 な) 場合には、Gnus は再帰を「あまりに深く」降りすぎてしまい、Emacs があ なたにビープ音を鳴らすことがあります。もしこれが起こったなら、 max-lisp-eval-depth を 500 かそこいらの値に設定してください。

もし他のすべてが失敗したなら、バグとして問題を報告してください。

もし Gnus のバグを見つけたなら、M-x gnus-bug 命令で報告することが できます。M-x set-variable RET debug-on-error RET t RET とタイプし て、私にバックトレースを送ってください。私はバグを修正しようとしますが、 あなたがバグを再現させる方法を正確に書いてくれないと、それを修正すること ができません。

バグ報告では、詳細すぎることは決してありません。バグ報告をするときは、い つも M-x gnus-bug 命令を使ってください。それを使うたびに 10KB のメー ルができてしまっても、そしてあなたの環境のことを以前私に 500 回送ったこ とがあったとしてもです。

私がどんなたぐいの記憶も持っていないことを、覚えておくことも重要です。も しあなたがバグ報告を送ると、私は返答を送ります。その後で、あなたが「いや、 そうじゃない! このうすのろめっ!」とだけ送り返してきても、私はあなたが何 について私を侮辱しているかがわかりません。常に、すべてを説明し過ぎてくだ さい。それは私たちすべてにとって、もっとやり易くなります—もし私が必要 なすべての情報を得られなかったら、私はあなたにメールを送ってさらなる情報 を求め、その結果すべてがより多くの時間を費やすことになります。

もしあなたの直面している問題が非常に視覚的で、それをうまく説明できない場 合は、Emacs のウィンドウをファイルにコピーして (例えば、xwd で)、 それをどこか手の届くどこかにおいて、その画像の URL をバグ報告に含めてく ださい。

もしあなたがバグの修正や改善のためのパッチを寄稿してくださるのでしたら、 すみませんがそのパッチは ‘diff -u’ で作ってください。

問題を報告する前にもっとデバッグしたければ、あなた自身で問題を解決してパッ チを送るために edebug を使うことができるでしょう。Lisp コードのデバッグ については ELisp マニュアル (see (elisp)Debugging section ‘Debugging Lisp Programs’ in The GNU Emacs Lisp Reference Manual) に書かれています。edebug を 始めるには、もし c を押したときにある変な振舞いが発見されるならば、 第一歩は C-h k c をタイプし、ドキュメンテーション・バッファー中で ハイパーリンクをクリック (Emacs のみ) して、その関数定義を参照することで す。そしてその関数名の場所で M-x edebug-defun RET をタイプし て Gnus に戻り、そのコードを呼び出すために c を押しでください。 Lisp バッファーでは、SPC でシングルステップ動作、M-: で式を 評価、C-h v で変数を検査、q で実行を中断、あるい は cg で実行を再開することができます。

ときどき、直接に elisp のエラーを起こさないものの、Gnus が非常に遅くなる ために明らかになる問題があります。そんな場合には M-x toggle-debug-on-quit を使って、遅くなったときに C-g を押し、しか る後にバックトレースを解析してください (その手続きを繰り返すことは、真の 問題領域を分離するのに役立ちます)。

より上等なやり方は elisp プロファイラー (訳注: プログラムの実行時の動き を分析する道具) ELP を使うことです。プロファイラーについてはどこか他 の場所で完全に文書化されているはずですが、それを始めるために必要な手順を 少々書いておきましょう。第一に、プロファイルしてみたい Gnus の部分を計測 するための設定を、例えば M-x elp-instrument-package RET gnusM-x elp-instrument-package RET message で行なってください。 そして、遅い動作を行なわせてから M-x elp-results を押しましょう。 すると、どの動作が時間を食っているかを見て、それらをさらにまたデバッグす ることができます。動作全体が、プロファイラーの出力の中で最も遅い関数で費 やされた時間よりはるかに長くかかるのは、たぶん Gnus の間違っている部分を プロファイルしたせいでしょう。プロファイルの統計をリセットするに は M-x elp-reset-all を使ってください。 M-x elp-restore-all はプロファイルする動作を取り除くことになってい ますが、Gnus によって複雑にされかつ動的なコード生成の影響を受けるため、 それは必ずしも完全には動作しないかもしれません。

もし手助けが欲しいだけであれば、‘gnu.emacs.gnus’ で尋ねるのが良いで しょう。私はあまり役に立ちません。また、ding メーリングリス ト—ding@gnus.org で尋ねることもできます。購読するに は ding-request@gnus.org にメールを送ってください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7 Gnus リファレンスガイド

誰かが Gnus でできる何か粋なものに知恵を働かせて、その粋なものを書いても くれることが私の願いです。それを促進するためには、Gnus の内部動作を説明 するのが良いだろうと思いました。それに、さほど内部ではない動作をいくつか と、私が今やっていることも。

プログラムの内部の仕様が変更されることはない、などと思ってはいけませんが、 Gnus とそのバックエンドの間のインターフェース (これは完全に記述されてい ます) や、スコアファイルの形式 (同じく)、データ構造 (これは他のものほど には変更されないでしょう)、それに一般的な操作のメソッドを、(細部にわたっ て) 定義していきます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.1 Gnus の有用な関数

フックなどから実行される小さな関数を書くときは、Gnus の内部関数や変数に アクセスすることが絶対に必要です。以下が最もよく使われるものの一覧です。

gnus-newsgroup-name

この変数は現在のニュースグループの名前を持っています。

gnus-find-method-for-group

group の選択方法を返す関数です。

gnus-group-real-name

正規の (接頭語付きの) Gnus グループ名を受け取って、接頭語が無い名前を返 します。

gnus-group-prefixed-name

接頭語が無いグループ名と選択方法を受け取って、正規の (接頭語付き の) Gnus グループ名を返します。

gnus-get-info

group のグループ情報のリストを返します。

gnus-group-unread

group の未読記事の数か、それが分からない場合は t を返します。

gnus-active

group に関するアクティブファイルの項目を返します。

gnus-set-active

group に関するアクティブファイルの項目を設定します。

gnus-add-current-to-buffer-list

Gnus を終了するときに消去するバッファーのリストに、現在のバッファーを追 加します。

gnus-continuum-version

引数として Gnus のバージョン文字列を受け取って、浮動小数点の数値を返しま す。古いバージョンは必ず新しいバージョンよりも小さい数になります。

gnus-group-read-only-p

group が読み出し専用かどうかを示します。

gnus-news-group-p

group がニュースバックエンドかどうかを示します。

gnus-ephemeral-group-p

group が一時ニュースグループかどうかを示します。

gnus-server-to-method

server に対応している選択方法を返します。

gnus-server-equal

二つの仮想サーバーが同一かどうかを示します。

gnus-group-native-p

group が基本グループかどうかを示します。

gnus-group-secondary-p

group が二次グループかどうかを示します。

gnus-group-foreign-p

group が外部グループかどうかを示します。

gnus-group-find-parameter

group のパラメーターのリストを返します。二つ目の引数を与えると、 group 用のそのパラメーターの値を返します。

gnus-group-set-parameter

三つの引数 group, parameter, value を与えて、パラメー ターとして設定します。

gnus-narrow-to-body

現在のバッファーを、記事の本文に狭めます。

gnus-check-backend-function

二つの引数 functiongroup を取ります。group のバッ クエンドが function をサポートしているなら、nil ではない値 を返します。

 
(gnus-check-backend-function "request-scan" "nnml:misc")
⇒ t
gnus-read-method

利用者に選択方法を入力してもらう関数です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.2 バックエンドインターフェース

Gnus は NNTP やスプール、メール、仮想グループについては何も知 りません。ただ仮想サーバー virtual servers と対話する方法を知って いるだけです。仮想サーバーはバックエンド back end といくつかのバッ クエンド変数 back end variables からなります。前者の例として は nntp, nnspool, nnmbox などがあります。後者の例と しては nntp-port-numbernnmbox-directory があります。

Gnus がバックエンド—例えば nntp—に何かの情報を要求するとき、 通常は関数の引数として仮想サーバー名を含めます。(無い場合は、バックエン ドは「現在の」仮想サーバーを使うべきです。) 例え ば nntp-request-list は、その唯一の (省略可能な) 引数として仮想サー バーを使います。もしこの仮想サーバーとの接続が開かれていないと、この関数 の実行は失敗するはずです。

仮想サーバー名は、物理的なサーバー名とは何の関係も無いことに注意してくだ さい。例を挙げましょう:

 
(nntp "odd-one"
      (nntp-address "ifi.uio.no")
      (nntp-port-number 4324))

ここで物理サーバー名は ‘ifi.uio.no’ であるのに対して、仮想サーバー 名は ‘odd-one’ です。

バックエンドは複数の仮想サーバーを切り替えることができなければなりません。 標準のバックエンドは、必要なときに仮想サーバーの環境を取り出し・押し込み を行なう連想リストを保持することによって、これを実現しています。

インターフェース関数には二つのグループがあります。必ず存在しなければなら ない必須関数 required functions と、呼び出す前にそれが存在するかど うかを常に Gnus が確認する任意関数 optional functions です。

これらすべての関数は、その戻り値のデータを nntp-server-buffer (‘ *nntpd*’) バッファーに返すことが求められます。これはちょっと 不運な名前付けですが、これで我慢しなければなりません。私が結果のデー タ resulting data と言ったときは、そのバッファーの中のデータを指し ています。戻り値 return value と言ったときは、関数呼び出しによって 返される関数の値のことを言っています。関数が失敗したときは、戻り値とし て nil を返さなくてはいけません。

バックエンドにはサーバー型 server-forming のバックエンドと呼ばれる ものがあり、またそう呼ばれないものもあります。後者は一般には、同時には一 つのグループだけしか操作しないバックエンドで、「サーバー」の概念がありま せん。このサーバーとは、グループを持ち、そのグループの情報を配送するもの で、それ以上のものではありません。

Gnus はグループ名と記事番号によって、それぞれのメッセージを特定します。 それら記事番号に関するちょっとした説明をすることは有益かもしれません。ま ず第一に、その数値は正の整数です。第二に Gnus を混乱させることなく古い記 事番号を、後で「再使用」することは普通はできません。すなわち、もしあるグ ループにかつて 42 番の記事があったとしたら、別の記事がその番号を持つこと ができないか、または Gnus が激しく混乱してしまうということです。 (3) 第三に、記事番号はそのグループでの 到着順になっていなければならないことです。メッセージの日付も、必ず到着順 になっているわけではありませんが。

すでに前の節で、記事番号は一回使われただけで役目を終わらなければならな い「厳しい」制限について説明しました。しかし、記事番号の並びに抜けがある と Gnus はとても混乱してしまうので、連続した 通し 番号を付けるこ とが有用なのかもしれません。ただし「再使用不可」の制限があるので、完全に 番号の抜けを回避できるとは限りません。また、可能な限り記事番号を 1 から 始めることは、番号を使い切ってしまうことを避けるために役立ちます。

慣例として、バックエンドは nnなんたら と名付けられますが、 Gnus には ‘nnheader.el’、‘nnmail.el’ および ‘nnoo.el’ の ように、いくつかのバックエンドではない nnかんたら があることに注 意してください。

ここでの例と定義では、想像上のバックエンド nnchoke を引き合いに出 すことにします。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.2.1 必須バックエンド関数

(nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD)

articles は記事番号の範囲か、Message-ID のリストのどちらか です。現在のバックエンドは、どちらも完全にサポートしているわけではありま せん—記事番号のひと続き (リスト) だけで、多くのバックエンド は Message-ID による取得をサポートしていません。でも、それらは両 方サポートすることに努めるべきです。

結果のデータは HEADs か NOV 行のいずれかであるべきで、戻り値は これを反映した headersnov のどちらかでなければなりませ ん。これは今後、HEADs と NOV 行が混在する various に拡 張されるかもしれませんが、現在の Gnus ではサポートされていません。

fetch-oldnil ではなかったら、ある意味での「余分なヘッ ダー」を取得しようとします。これは通常、articles の中の最小番号の 記事よりも小さい番号を持っている (最大で) fetch-old 個の記事と、 articles の中で欠番になっている記事の、余分なヘッダーを取得します。 もしバックエンドがこの要求に従うことを煩わしいと思った場合には、このパラ メーターの存在は無視されることもあります。この値が nil でも数値で もなかったら、最大限の取得を行ないます。

これが HEAD の例です:

 
221 1056 Article retrieved.
Path: ifi.uio.no!sturles
From: sturles@ifi.uio.no (Sturle Sunde)
Newsgroups: ifi.discussion
Subject: Re: Something very droll
Date: 27 Oct 1994 14:02:57 +0100
Organization: Dept. of Informatics, University of Oslo, Norway
Lines: 26
Message-ID: <38o8e1$a0o@holmenkollen.ifi.uio.no>
References: <38jdmq$4qu@visbur.ifi.uio.no>
NNTP-Posting-Host: holmenkollen.ifi.uio.no
.

そういうわけで、headers という戻り値は、データバッファーにその要 素数と同じ個数のヘッダーがあることを暗示します。

これがそういうバッファーの BNF 定義です:

 
headers        = *head
head           = error / valid-head
error-message  = [ "4" / "5" ] 2number " " <error message> eol
valid-head     = valid-message *header "." eol
valid-message  = "221 " <number> " Article retrieved." eol
header         = <text> eol

(ここで使った BNF の版は RFC822 で使われているものです。)

戻り値が nov だった場合は、データバッファーに は network overview database 行が含まれていなければなりません。こ れは基本的には複数の欄をタブで区切ったものです。

 
nov-buffer = *nov-line
nov-line   = field 7*8[ <TAB> field ] eol
field      = <text except TAB>

これらの欄に何が含まれるべきかをきちんと調べたいのならば、 ヘッダー を参照してください。

(nnchoke-open-server SERVER &optional DEFINITIONS)

ここでの server は仮想サーバー名です。definitions はこの仮想 サーバーを定義する (VARIABLE VALUE) の組のリストです。

サーバーと接続できなかった場合でも、エラーをシグナルして処理を中断しては いけません。バックエンドは、これ以後さらにこのサーバーに接続しようとする 試みを、拒否することを選ぶことができます。実際、そうすべきです。

すでにそのサーバーと接続されていた場合には、この関数は nil ではな い値を返さなければなりません。このとき、返される結果のデータはありません。

(nnchoke-close-server &optional SERVER)

server との接続を閉じて、これに関連するすべてのリソースを開放しま す。もし何らかの理由でサーバーを閉じることができない場合は、 nil を返します。

返される結果のデータはありません。

(nnchoke-request-close)

すべてのサーバーとの接続を閉じて、バックエンドが保有していたすべてのリソー スを開放します。このバックエンドによって作られたすべてのバッファーを削除 しなければなりません。(もっとも nntp-server-buffer は削除されませ んが。) 普通この関数は Gnus が終了するときにのみ呼び出されます。

返される結果のデータはありません。

(nnchoke-server-opened &optional SERVER)

server が現在の仮想サーバーで、かつその物理サーバーへの接続が生き ている場合、この関数は nil ではない値を返さなければなりません。ど んな状況でも、この関数は接続が失われたサーバーへの再接続を試みてはいけま せん。

返される結果のデータはありません。

(nnchoke-status-message &optional SERVER)

この関数は server からの最後のエラーメッセージを返します。

返される結果のデータはありません。

(nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER)

この関数の結果のデータは、article で指定された記事でなければなりま せん。Message-ID か番号のいずれかを指定することができます。 Message-ID による記事の取得を実装するかどうかは任意ですが、それが 可能になっている方が良いでしょう。

to-buffernil ではなかったら、結果のデータは通常のデータ バッファーの代わりに、このバッファーに返さなければなりません。Gnus は主 に、記事バッファーに直接記事を挿入するように要求しますが、これによって、 多量のデータをあるバッファーから別のバッファーにコピーするのを避けること が可能になります。

もし少しでも可能なら、この関数は cons セルを返すべきです。そ の car は取得した記事があるグループ名で、cdr は記事の番号 です。これによって、Message-ID で記事を取得したときに、Gnus が本 当のグループと記事番号を知ることができるようになるでしょう。これが不可能 な場合は、記事の取得に成功したときに t を返さなければなりません。

(nnchoke-request-group GROUP &optional SERVER FAST INFO)

group のデータを取得します。この関数には group を現在のグルー プにするという副作用もあります。

fast が設定されたなら、有用なデータを返す面倒を行なわずに、単 に group を現在のグループにします。

info が与えられると、バックエンドがグループの情報構 造 (info) を更新することを可能にします。

これが結果のデータの例と、定義それ自体です:

 
211 56 1000 1059 ifi.discussion

最初の数値は状態で、これは 211 でなくてはなりません。次はそのグループに ある記事の総数、最小の記事番号、最大の記事番号、そして最後がグループ名で す。しかし、いくつかの記事はキャンセルされているかもしれないので、記事の 総数は、記事の最大・最小番号から単純に考えられる数よりも小さいかもしれな いことに注意してください。Gnus は総数を単に捨ててしまうので、(それが問題 であるときに) 正しい値を生成する面倒を負うべきかどうかは、読者への課題と して残してあります。もしそのグループに記事が無かったら、最小記事番号は 1、 最大は 0 として報告しなければなりません。

 
group-status = [ error / info ] eol
error        = [ "4" / "5" ] 2<number> " " <Error message>
info         = "211 " 3* [ <number> " " ] <string>
(nnchoke-close-group GROUP &optional SERVER)

group を閉じて、それに関連するすべてのリソースを開放します。ほとん どのバックエンドは何もすることが無いでしょう。

返される結果のデータはありません。

(nnchoke-request-list &optional SERVER)

server 上で利用可能なすべてのグループのリストを返します。本当 に 全部 という意味です。

これは、たった二つしかグループを持っていないサーバーの場合の例です:

 
ifi.test 0000002200 0000002000 y
ifi.discussion 3324 3300 n

各行にはグループ名、そのグループ内の最大の記事番号、最小の記事番号、そし て最後にフラグがあります。もしそのグループに記事が無かったら、最小記事番 号は 1、最大は 0 として報告しなければなりません。

 
active-file = *active-line
active-line = name " " <number> " " <number> " " flags eol
name        = <string>
flags       = "n" / "y" / "m" / "x" / "j" / "=" name

フラグは、そのグループが読み出し専用 (‘n’) か、司会者付 き (‘m’) なのか、死んでいる (‘x’) か、どこか他のグループの別 名 (‘=other-group’) なのか、それらのどれでもない (‘y’) のかを 示します。

(nnchoke-request-post &optional SERVER)

この関数は、現在のバッファーを投稿しなければなりません。投稿が成功したか どうかを返しても構いませんが、必須ではありません。例えば、投稿が非同期に 行なわれる場合は、この関数が終了した時点では、投稿は普通完了していません。 その場合この関数は、投稿を完了させることができないときに、それをはっきり と利用者に知らせる見張り (sentinel) のようなものを設定するべきでしょう。

この関数から返される結果のデータはありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.2.2 任意バックエンド関数

(nnchoke-retrieve-groups GROUPS &optional SERVER)

groups はグループのリストです。また、この関数はそれら全部のグルー プのデータを要求しなければなりません。どうやってそれを行なうかは Gnus の 知ったことではありませんが、これをできるだけ迅速な方法で行なうことに挑ま なければなりません。

この関数の戻り値は activegroup のどちらでも良く、それ が結果のデータの形式が何であるかを示します。前者 は nnchoke-request-list によるデータと同じ形式です。一方後者 は nnchoke-request-group が返すものと同じ形式の、バッファーを埋め る行です。

 
group-buffer = *active-line / *group-status
(nnchoke-request-update-info GROUP INFO &optional SERVER)

Gnus のグループ情報 (see section グループ情報) が、バックエンドのそれを改変す るために渡されます。これはバックエンドが (仮想グループや imap グループの 場合のように)、本当にすべての情報を持っている場合に役に立ちます。この関 数は、その要求に適合させる情報を破壊的に置き換えて、nil ではない 値を返さなければなりません (例外的に nntp-request-update-info は、 ネットワーク資源を浪費しないように常に nil を返します)。

この関数が返す結果のデータはありません。

(nnchoke-request-type GROUP &optional ARTICLE)

利用者が「ニュースを送信する」命令 (例えば、概略バッファーで F) を 実行したときに、Gnus は利用者がフォローアップしようとしている記事がニュー スなのかメールなのかを知っている必要があります。この関数 は group の中の article がニュースであれば news を、 メールであれば mail を、その種別を判定できない場合 は unknown を返さなければなりません。(article 引数は、メー ルグループとニュースグループがごちゃまぜになっているかもしれな い nnvirtual において必要です。) grouparticle は 両方とも nil であるかもしれません。

この関数が返す結果のデータはありません。

(nnchoke-request-set-mark GROUP ACTION &optional SERVER)

記事の印を設定/消去/追加します。通常 Gnus は記事の印 (既読、可視、期限切 れ消去など) を内部で扱い、‘~/.newsrc.eld’ に保存します。しかし、い くつかのサーバー (例えば IMAP) は記事のすべての情報をサーバー で持っているので、Gnus が印の情報をサーバーに伝搬させる必要があります。

action は印を設定する要求のリストで、以下の様式を持ちます:

 
(RANGE ACTION MARK)

range は印を付けたい記事の範囲です。actionadd ま たは del で、印を追加したり消すために使われます (言及されていない すべての印は保存します)。mark は印のリストです。それぞれの印はシン ボルです。現在使われている印は read, tick, reply, expire, killed, dormant, save, download, unsend, forward および recent です が、あなたのバックエンドは、可能ならこれらを制限をするべきではありません。

矛盾する動作が指定された場合は、リストの最後の動作が効力を持つものになる べきです。すなわち、action が記事 1 に 可視 印を追加する要 求を含んでいて、リストのおしまいの方で、同じ記事から印を消去することを要 求していたならば、印は実際には消去されるべきです。

action リストの例です:

 
(((5 12 30) 'del '(tick))
 ((10 . 90) 'add '(read expire))
 ((92 94) 'del '(read)))

関数は印を設定できなかった記事の範囲を返さなければなりません (現在はどん な目的のためにも使われていません)。

この関数が返す結果のデータはありません。

(nnchoke-request-update-mark GROUP ARTICLE MARK)

バックエンドが嫌う印を利用者が設定しようとしたら、この関数がその印を変更 することができます。この関数が返したどんなものでも、 Gnus は article への印として元の mark の代わりに使います。バッ クエンドがそれでも構わない場合には、元の mark を返さなければなりま せん。nil やその他のゴミを返してはいけません。

私に考えられるこれの利用法は、それで nnvirtual が行なっていること だけです—その仮想グループで既読の印を付けると、もし構成要素のグループ が自動期限切れ消去可能ならば、結果としてその記事に期限切れ消去の印が付け られます。

この関数が返す結果のデータはありません。

(nnchoke-request-scan &optional GROUP SERVER)

バックエンドが新着記事を検査する要求を (Gnus か他の何かによって) 行なう ときはいつでも、あれやこれやとこの関数が呼び出されるでしょう。この関数が 起動されると、一般にメールバックエンドはスプールファイルを読む か POP サーバーに問い合わせます。group に留意する必要は ありません—バックエンドが、一つのグループだけを走査するのが大変すぎる と判断した場合には、すべてのグループを総ががりで走査しても構いません。で すが、その方が実用的ならば、局所に限定するのが良いでしょう。

この関数が返す結果のデータはありません。

(nnchoke-request-group-description GROUP &optional SERVER)

この関数が返す結果のデータは、group の説明でなければなりません。

 
description-line = name <TAB> description eol
name             = <string>
description      = <text>
(nnchoke-request-list-newsgroups &optional SERVER)

この関数が返す結果のデータは、サーバー上で利用できるすべてのグループの説 明でなければなりません。

 
description-buffer = *description-line
(nnchoke-request-newgroups DATE &optional SERVER)

この関数から返される結果のデータは、‘date’ 以降に作成されたすべての グループでなければなりません。‘date’ は人間が読める普通の日付の形 式 (すなわち、メールやニュースのヘッダーで使われる形式で、ディフォルトは 関数 message-make-date が返すもの) です。データは active バッファー の形式でなければなりません。

この関数が「多すぎる」グループを返すのはオッケーです。いくつかのバックエ ンドでは、新しいグループだけではなくて、すべてのグループのリストを返す方 が安上がりに済むことを見出すかもしれません。しかし、たくさんのグループが あるバックエンドで、これをしてはいけません。普通、利用者が自分で作ったグ ループならば多すぎることはないでしょうから、nnml とそれに類するも のはたぶん心配ありません。しかし nntp のようなバックエンドでは、 グループはサーバーによって作られているので、いかにもたくさんのグループが ありそうです。

(nnchoke-request-create-group GROUP &optional SERVER)

この関数は group という名前の空のグループを作成しなければなりませ ん。

返されるデータはありません。

(nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE)

この関数は、articles の範囲のすべての記事に対して期限切れ消去の処 理を行ないます (現在 articles は記事番号の単純なリストです)。記事 がどれだけ古いかを、この関数で消去される前に判定することは、バックエンド に任されています。forcenil ではない値だったら、それらが どんなに新しくても、すべての articles を消去しなければなりません。

この関数は削除しなかった、あるいは削除することができなかった記事のリスト を返さなければなりません。

返される結果のデータはありません。

(nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM &optional LAST)

この関数は group にある記事 article (番号) を、 accept-form を呼び出すことによって移動しなければなりません。

この関数は、当の記事を移動させるための準備として、それが記事に付加したど んなヘッダー行をも削除して、記事を大体において「きれい」にしておく必要が あります。そして「きれい」な記事があるバッファーで、 accept-formeval しなければなりません 。これは実際に複製 を行ないます。もしこの evalnil 以外の値を返したら、そ の記事を削除しなければなりません。

もし lastnil だったら、それはこの直後にさらに要求が発行 される見込みが高いことを意味し、これによっていくらか最適化ができるように なります (訳注: 例えば nil だったらサーバーとの接続を閉じないでお くとか)。

この関数は、移動先のグループ名が car で、移動先の記事番号 が cdr である cons セルを返さなければなりません。

返されるデータはありません。

訳注: 移動先のグループは accept-form の中で指定します。そこで使わ れるのが、次の nnchoke-request-accept-article です。

(nnchoke-request-accept-article GROUP &optional SERVER LAST)

この関数は、現在のバッファーの中身を group に挿入します。 lastnil だったら、この関数へのさらなる呼び出しが直ちに 行なわれるだろうという意味です。

この関数はグループ名が car で、移動先の記事番号が cdr であ る cons セルを返さなければなりません。

そのグループは、記事を受け入れてもらうことをバックエンドが要求する前に存 在しなければなりません。

返されるデータはありません。

(nnchoke-request-replace-article ARTICLE GROUP BUFFER)

この関数は group から記事 article (番号) を削除して、代わり に buffer の中身をそこに挿入しなければなりません。

返されるデータはありません。

(nnchoke-request-delete-group GROUP FORCE &optional SERVER)

この関数は group を消去しなければなりません。もし force が設 定されていたら、そのグループ内のすべての記事を本当に消去して、そしてその グループ自身を消去しなければなりません。(もし「グループ自身」というもの があれば。)

返されるデータはありません。

(nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER)

この関数はグループ名を group から new-name に変更しなければ なりません。group 内にあるすべての記事は、new-name に移動し なければなりません。

返されるデータはありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.2.3 エラーメッセージの発行

バックエンドはエラーの状況の報告に nnheader-report を使わなければ なりません—要求を実行できないときにエラーを生起させてはいけません。こ の関数の最初の引数はバックエンド名のシンボルで、残りは、複数の引数があれ ば format への引数として解釈され、一つであればただの文字列です。 この関数は常に nil を返さなければなりません。

 
(nnheader-report 'nnchoke "You did something totally bogus")

(nnheader-report 'nnchoke "Could not request group %s" group)

一方 Gnus は、サーバーから nil を返されたとき に nnheader-get-report を呼び出します。するとこの関数が、当のバッ クエンドに対して最後に報告されたメッセージを返します。この関数は一つの引 数—サーバーのシンボルを取ります。

内部的には、これらの関数は back-end-status-string にアクセ スます、したがって nnchoke バックエンドはそのエラーメッセージ を nnchoke-status-string に格納します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.2.4 新しいバックエンドを書く

多くのバックエンドはよく似通っています。nnmlnnspool と 瓜二つですが、サーバー上の記事を編集することができます。nnmh はま るで nnml のようですが、アクティブファイルを使わないし、概要デー タベースも保持しません。nndirnnml にとても似ていますが、 これには「グループ」の概念は無く、記事の編集はできません。

新しいバックエンドを書くときに他のバックエンドから関数を「継承」できたら なあ、と思うのは理に適っています。そしてまさに、あなたがそうしたければ、 それができるのです。(あなたがそうしたくなければしなくても良いですよ、も ちろん。)

すべてのバックエンドは、公共変数と公共関数を nnoo というパッケー ジを使って宣言します。

他のバックエンドから関数を継承するには (そして現在のバックエンドから他の バックエンドに関数を継承できるようにするには)、以下のマクロを使用しなけ ればなりません:

nnoo-declare

このマクロは、最初の引数を、その後に続く引数の子供であることを宣言します。 例えば:

 
(nnoo-declare nndir
  nnml nnmh)

ここで nndir は、nnmlnnmh の両方から関数を継承 するつもりであることを宣言しています。

defvoo

このマクロは defvar と等価ですが、その変数を公共サーバー変数とし て登録します。ほとんどの状態志向型の変数は、defvar ではな く defvoo によって宣言するべきです。

通常の defvar の引数に加えて、このマクロは親バックエンドにおける 変数のリストを取ります。それらの親バックエンドで定義されている関数を子の バックエンドで実行するときに、その関数の中でアクセスされる親の変数を、子 の変数で置き換えます。

 
(defvoo nndir-directory nil
  "Where nndir will look for groups."
  nnml-current-directory nnmh-current-directory)

これは nndir のために nnml の関数が呼び出されたときに、 nnml-current-directorynndir-directory に設定されるとい う意味です。(nnmh も同様です。)

nnoo-define-basics

このマクロは、ほとんどすべてのバックエンドが持つべき共通関数をいくつか定 義します。

 
(nnoo-define-basics nndir)
deffoo

このマクロはまさに defun のようなもので、同一の引数を取ります。通 常の defun の処理に加えて、このマクロは他のバックエンドがそれを継 承できるように、その関数が公共物になっているものとして登録します。

nnoo-map-functions

このマクロは、現在のバックエンドの関数から親バックエンドの関数への、置き 換えができるようにします。

 
(nnoo-map-functions nndir
  (nnml-retrieve-headers 0 nndir-current-group 0 0)
  (nnmh-request-article 0 nndir-current-group 0 0))

これは nndir-retrieve-headers が呼び出されたときに、一番目、三番 目、および四番目の引数が nnml-retrieve-headers に渡され、一方、二 番目の引数は nndir-current-group の値として設定されるという意味で す。

nnoo-import

このマクロは他のバックエンドから関数を輸入します。これは単にまだ定義され ていない関数を定義するだけなので、ソースファイルの最後に書かなければなり ません。

 
(nnoo-import nndir
  (nnmh
   nnmh-request-list
   nnmh-request-newgroups)
  (nnml))

これは、nndir-request-list への呼び出しは単 に nnmh-request-list に引き渡されなければならず、一 方 nnml の公共関数でまだ nndir で定義されていないものをこ こで定義するということです。

以下は nndir バックエンドのちょっと短縮した版です。

 
;;; nndir.el --- 単一のディレクトリーをニュースグループにする
;; Copyright (C) 1995,1996 Free Software Foundation, Inc.

;;; Code:

(require 'nnheader)
(require 'nnmh)
(require 'nnml)
(require 'nnoo)
(eval-when-compile (require 'cl))

(nnoo-declare nndir
  nnml nnmh)

(defvoo nndir-directory nil
  "nndir がグループを探す場所。"
  nnml-current-directory nnmh-current-directory)

(defvoo nndir-nov-is-evil nil
  "*これが nil でなかったら NOV ヘッダーを取得しません。"
  nnml-nov-is-evil)

(defvoo nndir-current-group ""
  nil
  nnml-current-group nnmh-current-group)
(defvoo nndir-top-directory nil nil nnml-directory nnmh-directory)
(defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail)

(defvoo nndir-status-string "" nil nnmh-status-string)
(defconst nndir-version "nndir 1.0")

;;; インターフェース用の関数。

(nnoo-define-basics nndir)

(deffoo nndir-open-server (server &optional defs)
  (setq nndir-directory
        (or (cadr (assq 'nndir-directory defs))
            server))
  (unless (assq 'nndir-directory defs)
    (push `(nndir-directory ,server) defs))
  (push `(nndir-current-group
          ,(file-name-nondirectory
            (directory-file-name nndir-directory)))
        defs)
  (push `(nndir-top-directory
          ,(file-name-directory (directory-file-name nndir-directory)))
        defs)
  (nnoo-change-server 'nndir server defs))

(nnoo-map-functions nndir
  (nnml-retrieve-headers 0 nndir-current-group 0 0)
  (nnmh-request-article 0 nndir-current-group 0 0)
  (nnmh-request-group nndir-current-group 0 0)
  (nnmh-close-group nndir-current-group 0))

(nnoo-import nndir
  (nnmh
   nnmh-status-message
   nnmh-request-list
   nnmh-request-newgroups))

(provide 'nndir)

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.2.5 新しいバックエンドを Gnus に繋げる

あなたの新しいバックエンドを Gnus で使い始めるのはとても簡単です—単 に gnus-declare-backend 関数で宣言するだけです。これはバックエン ドを gnus-valid-select-methods 変数に追加します。

gnus-declare-backend は二つの引数を取ります—バックエンドの名前 と任意の数の能力 abilities です。

これが例です。

 
(gnus-declare-backend "nnchoke" 'mail 'respool 'address)

そして上記の行が ‘nnchoke.el’ ファイルに入ります。

能力には以下のものがあります:

mail

これはメール風バックエンドです—フォローアップは (たいていは) メールで 送られるはずです。

post

これはニュース風バックエンドです—フォローアップは (たいていは) ニュー スで送られるはずです。

post-mail

このバックエンドはメールとニュースの両方をサポートします。

none

これはニュースでもメールでもないバックエンドです—まったく違った何かで す。

respool

これは再スプールをサポートします—というか、その元の記事とグループを書 き換えることができます。

address

サーバーの名前が仮想サーバー名に含まれていなければなりません。これはほと んど全部のバックエンドに当てはまります。

prompt-address

グループバッファーで B などの命令を実行したときに、利用者はアドレ スの入力を求められるはずです。例えばこれは nntp のようなバックエ ンドに当てはまりますが、nnmbox はそうではありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.2.6 メール風バックエンド

メールバックエンドがその他のバックエンドに対して一線を画しているのは、ほ とんどのメールバックエンドが ‘nnmail.el’ で定義されている共通の関数 に強く依存しているという点です。例えばこれは nnml-request-scan の 定義です:

 
(deffoo nnml-request-scan (&optional group server)
  (setq nnml-article-file-alist nil)
  (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))

単に nnmail-get-new-mail にいくつか引数を与えて呼び出すだけで、 nnmail がメールの移動や分割のすべての面倒を見てくれます。

この関数は四つの引数を取ります。

method

これは、どのバックエンドがこの呼び出しの責任を負うかを指示するシンボルで なければなりません。

exit-function

この関数は、分割が実行された後で呼び出されるものでなければなりません。

temp-directory

一時ファイルを格納する場所です。

group

この引数は省略可能です。分割が一つのグループだけに対して行なわれる場合は、 この引数でグループ名を指定しなけれなばりません。

nnmail-get-new-mail は、それぞれの記事を保存するため に back-end-save-mail を呼び出します。 back-end-active-number は、この記事に割り当てられた記事番号 を調べるために呼び出されます。

この関数は次の変数も使用します: back-end-get-new-mail (この バックエンドの新着メールを受け取るかどうか)、新しいアクティブファイルを 生成するための back-end-group-alist およ び back-end-active-file です。 back-end-group-alist は、以下のようなグループとアクティブの 連想リストです:

 
(("a-group" (1 . 10))
 ("some-group" (34 . 39)))

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.3 スコアファイルの構文

スコアファイルは簡単に分析できるだけでなく、極めて柔軟な対応ができるよう になっています。それには Emacs Lisp のリストとして読み込むことができるよ うな構文がふさわしいだろうと判断されました。

これは良くあるスコアファイルです:

 
(("summary"
  ("win95" -10000 nil s)
  ("Gnus"))
 ("from"
  ("Lars" -1000))
 (mark -100))

スコアファイルの BNF 定義です。

 
score-file      = "" / "(" *element ")"
element         = rule / atom
rule            = string-rule / number-rule / date-rule
string-rule     = "(" quote string-header quote space *string-match ")"
number-rule     = "(" quote number-header quote space *number-match ")"
date-rule       = "(" quote date-header quote space *date-match ")"
quote           = <ascii 34>
string-header   = "subject" / "from" / "references" / "message-id" /
                  "xref" / "body" / "head" / "all" / "followup"
number-header   = "lines" / "chars"
date-header     = "date"
string-match    = "(" quote <string> quote [ "" / [ space score [ "" /
                  space date [ "" / [ space string-match-t ] ] ] ] ] ")"
score           = "nil" / <integer>
date            = "nil" / <natural number>
string-match-t  = "nil" / "s" / "substring" / "S" / "Substring" /
                  "r" / "regex" / "R" / "Regex" /
                  "e" / "exact" / "E" / "Exact" /
                  "f" / "fuzzy" / "F" / "Fuzzy"
number-match    = "(" <integer> [ "" / [ space score [ "" /
                  space date [ "" / [ space number-match-t ] ] ] ] ] ")"
number-match-t  = "nil" / "=" / "<" / ">" / ">=" / "<="
date-match      = "(" quote <string> quote [ "" / [ space score [ "" /
                  space date [ "" / [ space date-match-t ] ] ] ] ")"
date-match-t    = "nil" / "at" / "before" / "after"
atom            = "(" [ required-atom / optional-atom ] ")"
required-atom   = mark / expunge / mark-and-expunge / files /
                  exclude-files / read-only / touched
optional-atom   = adapt / local / eval
mark            = "mark" space nil-or-number
nil-or-number   = "nil" / <integer>
expunge         = "expunge" space nil-or-number
mark-and-expunge = "mark-and-expunge" space nil-or-number
files           = "files" *[ space <string> ]
exclude-files   = "exclude-files" *[ space <string> ]
read-only       = "read-only" [ space "nil" / space "t" ]
adapt        = "adapt" [ space "ignore" / space "t" / space adapt-rule ]
adapt-rule      = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"
local           = "local" *[ space "(" <string> space <form> ")" ]
eval            = "eval" space <form>
space           = *[ " " / <TAB> / <NEWLINE> ]

認識不可能なスコアファイルの要素は無視されるべきですが、捨ててしまっては いけません。

ご覧のように空白が必要ですが、空白の量と型は重要ではありません。つまり、 スコアファイルの様式はプログラマーに任されています—すべてを一つの長ーー い行に吐き出す方がより簡単なのであれば、それでも構いません。

いろいろなアトムの意味は、このマニュアルのどこかで説明されていま す (see section スコアファイル様式)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.4 ヘッダー

Gnus は記事のヘッダーを溜めておくために、内部的には NOV の規格 を怪しげなやり方で踏襲する様式を使っています。NOV の仕様を見た 作者が、恥知らずにもすべてを 盗んだ と思うかもしれませんが、それ は正しいです。

「ヘッダー」はひどく荷の重い用語です。「ヘッダー」は RFC1036 では記事の 頭の行 (例えば、From) について話すのに用いられています。それは多 くの人が「ヘッド」—「ヘッダーと本文」の同義語として使っています。(私に 言わせれば、これは避けるべきです。) そして Gnus は、私がここで話す「ヘッ ダー」と言う様式を内部的に使っています。これは基本的には九つの要素からな るベクトルで、それぞれのヘッダー (あ痛っ) が一つの場所を占めます。

これらの場所は、順番に number, subject, from, date, id, chars, lines, xref, およ び extra です。これらの場所を読み出したり設定するマクロがありま す—それらはすべて、それぞ れ mail-header-mail-header-set- いう予想しやすい名前を 持っています。

extra のための場所がヘッダーと値の対の連想リストであることを除い て、これらすべての場所には文字列が入ります (see section To From Newsgroups)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.5 範囲

GNUS は非常に有用な概念を導入してくれました。私はそれをたくさん使い、 かなり入念に仕上げました。

設問は単純です: 何か番号で呼ぶことができる大量のもの (粗雑な 例と しては、例えば記事) を持っていて、それらが「含まれている」ことを表現した いとしましょう。それらを順番に並べるのは、あまり便利ではありません。 (20,000 個を順番に並べたものは、ちょっと長たらしいですよね。)

解決策は設問と同じくらい単純です。単にその並びを折りたためば良いのです。

 
(1 2 3 4 5 6 10 11 12)

は次のように変形されます。

 
((1 . 6) (10 . 12))

単独のものを表すために ‘(13 . 13)’ のようなやっかいな要素を持たなく ても良いように、‘13’ は有効な要素になっています。例えば:

 
((1 . 6) 7 (10 . 12))

以下のような二つの範囲を比較して、それらが等しいがとうかを調べるのは、少 し手のこんだことになります:

 
((1 . 5) 7 8 (10 . 12))

 
((1 . 5) (7 . 8) (10 . 12))

は等しいです。実際のところ、下り順で並んでいないリストは範囲です:

 
(1 2 3 4 5)

これはかなり長ったらしいものですが、完璧に有効な範囲です。以下も有効です:

 
(1 . 5)

そして、これはその前の範囲と等しいものです。

これは範囲の BNF 定義です。もちろん、数値の並びが下り順であってはならな いことを覚えておかなければなりません。(同じ数値を任意の回数にわたって繰 り返すことができますが、範囲の扱いにおいて消え去る傾向があります。)

 
range           = simple-range / normal-range
simple-range    = "(" number " . " number ")"
normal-range    = "(" start-contents ")"
contents        = "" / simple-range *[ " " contents ] /
                  number *[ " " contents ]

現在 Gnus は既読記事と記事の印を維持するために範囲を使っています。当局が 私にそれをさせたがっているのなら、私は数の範囲の操作を C で実装しようと 思っています。(私はまだ尋ねていません。と言うのは、普通の連続体に変換し 直さずに、世の中を完全に範囲に基づいたものにするためには何が必要かを、私 はもっと考えなければならないからです。)


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.6 グループ情報

Gnus はグループのすべての永続的な情報を group info リストに格納し ます。このリストは 3 から 6 (またはそれ以上) の長さの要素で、徹底的にグ ループを記述します。

ここにあるのはグループ情報 (group info) の二つの例です。一つは非常に単純 なグループですが、二つ目はもっと複雑なものです:

 
("no.group" 5 ((1 . 54324)))

("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
                ((tick (15 . 19)) (replied 3 6 (19 . 3)))
                (nnml "")
                ((auto-expire . t) (to-address . "ding@gnus.org")))

最初の要素は「グループ名」—とにかく Gnus が知っているグループです。二 番目の要素は「購読度」で、普通は小さな整数です。(それは「階級」(rank) に なることもできます。car がレベルで cdr がスコアのコンスセ ルです。) 三番目の要素は既読記事の範囲のリストです。四番目の要素はいろい ろな種類の記事の印のリストのリストです。五番目の要素は選択方法です (もし くは、そう言いたければ仮想サーバーです)。六番目の要素は「グループパラメー ター」のリストで、この章はそのためにあります (訳注: ほんとうに?)。

最後の三つの要素はどれでも、必要が無ければ存在しないこともあります。実際、 グループの非常に大部分は最初の三つの要素だけを持ち、それは (最後の三要素 が省略できることは) 非常に多くのコンスセルを節約します。

これはグループ情報様式の BNF 定義です:

 
info          = "(" group space ralevel space read
                [ "" / [ space marks-list [ "" / [ space method [ "" /
                space parameters ] ] ] ] ] ")"
group         = quote <string> quote
ralevel       = rank / level
level         = <integer in the range of 1 to inf>
rank          = "(" level "." score ")"
score         = <integer in the range of 1 to inf>
read          = range
marks-lists   = nil / "(" *marks ")"
marks         = "(" <string> range ")"
method        = "(" <string> *elisp-forms ")"
parameters    = "(" *elisp-forms ")"

実は ‘marks’ の規則はごまかしです。‘marks’ は ‘range’ と ともに cons を構成する ‘<string>’ ですが、疑似 BNF でそれを現すのは 難しいのです。

情報の要素群にアクセスして、それらの値を取得または設定するために、 Gnus は一連のマクロを提供しています。

gnus-info-group
gnus-info-set-group

グループ名を取得/設定 (get/set) します。

gnus-info-rank
gnus-info-set-rank

グループの階級 (rank) を取得/設定します (see section グループのスコア)。

gnus-info-level
gnus-info-set-level

グループのレベルを取得/設定します。

gnus-info-score
gnus-info-set-score

グループのスコアを取得/設定します (see section グループのスコア)。

gnus-info-read
gnus-info-set-read

既読記事の範囲を取得/設定します。

gnus-info-marks
gnus-info-set-marks

印が付いている記事の範囲のリストを取得/設定します。

gnus-info-method
gnus-info-set-method

グループの選択方法を取得/設定します。

gnus-info-params
gnus-info-set-params

グループパラメーターを取得/設定します。

取得するためのすべての関数は一つの引数を取ります—情報のリストです。設 定するための関数は二つの引数を取ります—情報のリストと新しい値です。

グループ情報の最後の三つの要素は必須ではないので、要素を設定する前にグルー プ情報を拡張する必要があるでしょう。それが必要な場合、最後の三つの設定す るための関数の第三引数に nil ではない値を指定すれば、自動的に拡張 させることができます。(訳注: 例えば三つの要素しかない情報に四つ目の要素 を加える処理を第三引数を使わずに行なうと、(setcar (nthcdr 3 INFO) VALUE) というコードが実行される結果、エラーになってしまいます。)


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.7 対話形式の拡張

Gnus は Emacs 標準の interactive の仕様を、シンボル接頭引数を簡単 に使うことができるようにするために、少し拡張していま す (see section シンボルの接頭引数)。これはその使い方の例です:

 
(defun gnus-summary-increase-score (&optional score symp)
  (interactive (gnus-interactive "P\ny"))
  ...
  )

最上のものは interactive の式を返すマクロとし て gnus-interactive を実装することでしょうが、Emacs は関数が対話 的かどうかを調べるために、ラムダ式に対して単純に assq を行なうの で、これは不可能です。そこで、文字列を受け取って interactive で使 うことができる値を返す gnus-interactive 関数を、代わりに持つこと にしました。

この関数は (ほとんど) すべての interactive の指定を受け付けますが、 もう少し加えることにします。

y

現在のシンボル接頭引数—変数 gnus-current-prefix-symbol です。

Y

現在のシンボル接頭引数のリスト—変 数 gnus-current-prefix-symbol です。

A

現在の記事番号—関数 gnus-summary-article-number です。

H

現在の記事ヘッダー —関数 gnus-summary-article-header です。

g

現在のグループ名—関数 gnus-group-group-name です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.8 Emacs/XEmacs コード

Gnus は Emacs, XEmacs と Mule で動作するので、そのうちの一つを主環境とす ることに決めました。私は Emacs を選びました。私が XEmacs や Mule を好き ではないということではなく、それがアルファベット順で最初に来たからです。 (訳注: 現在 Gnus がサポートしている (X)Emacs については Emacsen を 参照してください。)

これは、Gnus は Emacs で少しの警告も無くバイトコンパイルできるのに対して、 XEmacs はバイトコンパイルをしている間にギガバイトくらいの警告を出すとい うことでもあります (訳注: 現在はそんなことはありません)。私は些細な失敗 を見つけ出すことに役立てるためにバイトコンパイルの警告を使っているので、 それはとても助けになります。

さらに、私は首尾一貫して Emacs の関数のインターフェースを使ってきました が、それらの関数のために Gnus の別名 (aliases) を使ってきました。例を出 しましょう: Emacs が関数 run-at-time を定義している一方で、 XEmacs は関数 start-itimer を定義しています。そこで、私 は Emacs の run-at-time と同じ引数を受け取 る gnus-run-at-time という関数を定義しました (訳注: 現在 は run-at-time に統一されています)。Gnus を Emacs で実行している ときは、gnus-run-at-time は単に run-at-time の別名になって います。しかし XEmacs で実行したときは、gnus-run-at-time は次の関 数の別名となっています (訳注: 現在こういうものはありません):

 
(defun gnus-xmas-run-at-time (time repeat function &rest args)
  (start-itimer
   "gnus-run-at-time"
   `(lambda ()
      (,function ,@args))
   time repeat))

この種のことが多くの関数のために行なわれています。Gnus は XEmacs で実行 しているときに、元からある Emacs の関数を再定義しません—代わりにそれは、 Gnus の等価なものに defalias をすることによって行ないます。その方 が、よりきれいです。

XEmacs の関数のインターフェースの方が明らかにきれいな場合は、私は代わり にそれを使います。例えば、gnus-region-active-p は XEmacs で は region-active-p の別名であるのに対して、Emacs では関数です。

もちろん XEmacs を私の基本プラットフォームに選んで、関数の割り当てを逆に することもできましたが、私はそうしませんでした。XEmacs で Gnus を実行す るときの、これらの遠回しな割り当てが強いる性能への打撃は、僅かなはずです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.9 いろいろなファイル様式


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.9.1 アクテイブファイルの様式

アクティブファイルは、対象になっているサーバーのすべての使用可能なグルー プの目録を保持します。そこには、それぞれのグループの最高と最低の記事番号 の目録もあります。

これは普通のアクティブファイルからの抜粋です:

 
soc.motss 296030 293865 y
alt.binaries.pictures.fractals 3922 3913 n
comp.sources.unix 1605 1593 m
comp.binaries.ibm.pc 5097 5089 y
no.general 1000 900 y

これはこのファイルの疑似 BNF 定義です:

 
active      = *group-line
group-line  = group spc high-number spc low-number spc flag <NEWLINE>
group       = <non-white-space string>
spc         = " "
high-number = <non-negative integer>
low-number  = <positive integer>
flag        = "y" / "n" / "m" / "j" / "x" / "=" group

このファイルの完全な説明は、‘innd’ のマニュアルページ、特 に ‘active(5)’ を見てください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7.9.2 ニュースグループファイルの様式

ニュースグループファイルは、グループの目録をそれらの説明とともに保持しま す。サーバーにあるすべてのグループがある必要は無いし、そのファイルにある すべてのグループがサーバーに存在しなければならないこともありません。この ファイルは純粋に利用者の情報のためにあります。

様式はとても単純です: グループ名、タブ、そして説明です。これが定義です:

 
newsgroups    = *line
line          = group tab description <NEWLINE>
group         = <non-white-space string>
tab           = <TAB>
description   = <string>

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.8 異教徒への Emacs

信じるかどうかはともかく、Gnus Love Boat の旅に搭乗する前にあま り Emacs を使ったことが無いという Gnus の利用者たちがいます。 “C-M-a”や「リージョンを kill する」、それに 「gnus-flargblossen を連想リストに設定してください。そのキーはグ ループ名に合致するために使われる正規表現です。」といったことが、あなたに とって少しかまったく意味の無い魔法の言葉ならば、この付録はあなたのために あります。もしあなたがすでに Emacs に親しんでいるのであれば、これを無視 してあなたの猫を可愛がりに行ってください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.8.1 打鍵

はい、Emacs を使うとコントロールキー、シフトキー、メタキーをたくさん使う ようになるでしょう。これは一部の人々 (主に vi 利用者) には非常に 煩わしいものですが、私たちはその地獄を愛します。諦めてそれを甘受してくだ さい。Emacs は本当は“Escape-Meta-Alt-Control-Shift”の略で、あなたがい かがわしい (Emacs の作者のような) 出どころから聞いているかもしれない “Editing Macros”ではありません。

シフトキーは普通は両手の小指の近くにあって、普通は大文字などを打つために 使われています。あなたは絶え間なくそれを使いますよね。コントロールキーに は普通“CTRL”のような印が付いています。メタキーは奇妙なことにどのキーボー ドでもそういう印が付いていません。それは普通はキーボードの左手側にあって、 最下段にあるのが一般的です。

さて、私たち Emacs 人は、それがひどく不便なので「meta-control-m キーを押 す」とは言いません。私たちが使うのは「C-M-m を押す」です。 M- は「メタ」を現す接頭語で、“C-”は「コントロール」を意味する接 頭語です。ですから「C-k を押す」は、「コントロールキーを押し続けな がら次に k を押す」ということです。「C-M-k を押す」は「メタ キーとコントロールキーを押し続けながら次に k を押す」ということで す。簡単です、よね?

このことは、すべてのキーボードがメタキーを持っているわけではないという事 実によって、多少ややこしくなっています。そういう場合には「エスケープ」キー を使えばよいでしょう。ただしメタキーを持っているときより作業が増えるので、 メタキーのあるキーボードを手に入れていただくことを謹んでお勧め申し上げま す。それ無しでは生きて行けないでしょう。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9 よく尋ねられる質問

要約

これは新しい Gnus のよく尋ねられる質問のリストです。

機能に関することや提案は ding list に送ってくだ さい。

変更履歴

これは Gnus のよく尋ねられる質問のリストです。

Gnus は Emacs の要素として実装された Usenet ニュースリーダーおよび電子メー ルのユーザーエージェントです。それはほぼこの十年間何らかの形で存在してお り、その期間の多くにおいて Emacs の標準要素として配布されてきました。 Gnus 5 は最新の (そして最も偉大な) 作品です。オリジナルの版は GNUS と言 い、梅田政信さんが書きました。1994年の秋が忍び寄る頃、退屈していたラルス・ マッグヌ・イングブリグットスン (Lars Magne Ingebrigtsen) は Gnus を書き 直そうと決心しました。

その最大の強みは、極めてカスタマイズに適しているという事実にあります。こ のことを始めて目にすると引いてしまうかもしれませんが、それを利用する準備 ができるまでは、複雑なもののほとんどは無視することができます。そこそこの 量の (いろんなメーリングリストに配信される) 電子メールがやって来るのなら ば、流通量が多いメーリングリストを読みたいけれども遅れずについていくこと ができないのならば、流通量が多いニュースグループを読んでいるのならば、あ るいは単に退屈しているのならば、Gnus はあなたが望むものです。

この FAQ は 2002年3月まで Justin Sheehy によって維持されていました。彼は、 それ以前にすばらしい仕事をしてくれた Steve Baur と Per Abrahamsen に感謝 を表明しています。私たちも同じことをしましょう - ありがとう Justin!

この版は、ユトレヒト大学、オックスフォード、Smart Pages、オハイオ州立大 学に保存されている非公式なハイパーテキスト版や他の FAQ のアーカイブに比 べて、はるかに良いものです。別のフォーマットでそれを手に入れるための情報 が欲しいなら、以下にある質問集を見てください。

ここにある情報は、Gnus 開発メーリングリストの援助でコンパイルされました。 どんなエラーあるいはミスプリントも Gnus チームが犯した誤りです。すみませ ん。

訳注: そしてどんな誤訳の責任も gnus-doc-ja チームにあります。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.1 インストールに関する FAQ

質問 1.1

Gnus の最新版は何ですか?

回答

ジャーン: Gnus 5.10 がリリースされました。熱いうちに召し上がれ!
バージョン番号の歩みがいささか小さいのに反して、Gnus 5.10 には見逃せない 何トンもの新しい機能があります。現在のリリース (5.13) は、少なくと も 5.8 系のリリースの最新版と同じくらい安定なはずです。

質問 1.2

5.10 では何が新しいですか?

回答

第一に Gnus tarball の先頭のディレクトリーにある GNUS-NEWS ファイルに目 を通すべきです。そこでは最も重要な変更が羅列されています。ここでは特に重 要/興味深いものの短いリストを挙げるに留めます:

質問 1.3

Gnus はどこで、どうやって取得することができますか?

回答

Gnus は Emacs や XEmacs のリリースとは別に、独自にリリースされます。その ため Emacs に同梱されている版や XEmacs パッケージにある版は、最新ではな いかもしれません (例えば Emacs 21 に同梱されている Gnus 5.9 は、使用期限 が切れています)。 リリースされた最新版 の Gnus は、http://www.gnus.org/dist/gnus.tar.gz から、または匿 名 ftp で ftp://ftp.gnus.org/pub/gnus/gnus.tar.gz から手に入れる ことができます。

質問 1.4

tarball で何をすれば良いですか?

回答

tar xvzf gnus.tar.gz’ でアーカイブを展開して、ありふれた
./configure; make; make install’ の手順を実行してください。

MS-Windows では http://www.cygwin.com から Cygwin の環境も取得し てください。それによって上述のことを行なうこと、またはある梱包 器 (packer) (例えば http://www.winace.com にあ る Winace) で tarball を開梱すること、そして tarball に含まれてい る Gnus をインストールするためのバッチファイル ‘make.bat’ を使うこ とができるようになります。

Gnus をシステム領域にインストールしたくない (またはその権限が与えられて いない) ならば、ホームディレクトリーにインストールすることもできます。そ の場合は ‘~/.xemacs/init.el’ ファイルか ‘~/.emacs’ ファイルに 以下の行を加えてください。

 
(add-to-list 'load-path "/path/to/gnus/lisp")
(if (featurep 'xemacs)
    (add-to-list 'Info-directory-list "/path/to/gnus/texi/")
  (add-to-list 'Info-default-directory-list "/path/to/gnus/texi/"))

この行より前に、どんな Gnus に関係するものも確実に無いようにしてください。 MS Windows では "C:/path/to/lisp" のように書いてください (そう、"/" です)。

質問 1.5

ときどき目にする No Gnus と Oort Gnus って何ですか?

回答

Oort Gnus は Gnus の開発版の名前で、2003年の秋に Gnus 5.10 になりました。 No Gnus は現行の開発版の名前で、Gnus 5.12 か Gnus 6 になるでしょう。(な ぜ 5.11 ではないのかが不思議ですか? 奇数のバージョン番号は通常 Emacs に 同梱される Gnus の版に使われるのです。)

質問 1.6

Emacs のどの版が必要ですか?

回答

Gnus 5.10 は Emacs 20.7 以上、または XEmacs 21.1 以上を必要とします。開 発版の Gnus (No Gnus として知られているも の) は Emacs 21 か XEmacs 21.4 を必要とします。

質問 1.7

Gnus を Emacs と XEmacs の両方で走らせるには、どうすれば良いですか?

回答

バイトコンパイルされた Gnus の同じコピーを両者で使うことはできません。 Emacs では Emacs でコンパイルしたものを、XEmacs では XEmacs でコンパイル したものを使ってください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.2 起動 / グループバッファー

質問 2.1

いつも Gnus を起動すると "Gnus auto-save file exists. Do you want to read it?" というメッセージを受け取るのですが、これは何を意味しているので すか? また、どうやったら回避できますか?

回答

このメッセージが意味するのは、最後に Gnus を使ったときに適切に終了させな かったために、ディスクにその情報 (例えばどのメッセージを読んだかの) を書 き込むことができなかったので、今、それらの情報を自動保存 (auto-save) ファ イルから復活させるかどうかを尋ねられているということです。

このメッセージが発せられるのを回避するには、Gnus を終了させるときに単 に Emacs を kill するのではなく、グループバッファーで q を使うよう にしてください。

質問 2.2

Gnus は私がどのグループを講読するかを覚えてくれません。どうしてですか?

回答

Gnus を起動したときに、上記の質問と回答 (see FAQ 2-1) で述べられてい るメッセージを受け取りませんでしたか? これは同じ問題の別の症状なので、 上記の回答を読んでください。

質問 2.3

グループバッファーの各行の形式を変更するには、どうしたら良いですか?

回答

変数 gnus-group-line-format の値を調整しなければなりません。その やり方についてはマニュア ル (see (gnus-ja)Group Line Specification section ‘グループ行の仕様’ in The Gnus Manual) を見てください。このための例です (質問者 の ‘~/.gnus.el’ ファイルからの推測です :-):

 
(setq gnus-group-line-format "%P%M%S[%5t]%5y : %(%g%)\n")

質問 2.4

私のグループバッファーはちょっと混んでいるのですが、それらを楽に巡回でき るように、カテゴリーごとにまとまるように並べ変える方法はありますか?

回答

Gnus はトピックモードを提供します。それによってグループをその中へ入れて 並べ変えることができるようになります。えーとトピックを使うというのは、例 えば Linux を扱うすべてのグループは linux というトピックに収め、音楽を扱 うすべては music というトピックに収め、スコットランド音楽を扱うすべて は scottish という music のサブトピックに収める、といったことです。

トピックモードに入るには、グループバッファーで単に t を叩いてくだ さい。すると T n を使って現在位置でトピックを作ったり、あるグルー プを T m を使って指定したトピックに移すことができます。さらなるコ マンドについてはマニュアルかメニューを見てください。グループ行をより良く 行下げ (indent) させるためには、gnus-group-line-format 変数の先頭 に %P 書法仕様を含ませる必要があるでしょう。

質問 2.5

グループバッファーを手で並べ変えるにはどうしたら良いですか? トピック内の グループを並べ変えるにはどうしたら良いですか?

回答

移動させたいグループの上にポイントを移動して C-k を叩き、次にその グループを移動させる目的の場所にポイントを移動して C-y を叩いてく ださい。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.3 メッセージの取得

質問 3.1

今まさに Gnus をインストールして M-x gnus で起動したのですが、 "nntp (news) open error" としか言ってくれません。どうしたら良いですか?

回答

どこからニュースを取得すべきかを Gnus に教えてあげなければなりません。や り方については文献を読んでください。初めて起動するのであれば、次のような ものを ‘~/.gnus.el’ ファイルに書き込んでみてください:

 
(setq gnus-select-method '(nntp "news.yourprovider.net"))
(setq user-mail-address "you@yourprovider.net")
(setq user-full-name "Your Name")

質問 3.2

Windows を使っているのですが ‘~/.gnus.el’ の意味がわかりません。

回答

~/’ とは Gnus と Emacs が設定ファイルを探す場所であるホームディレ クトリーのことです。でも、実はその意味を知らなくても構わないのです。 Emacs がわかっていれば十分ですから。:-) C-x C-f ~/.gnus.el RET と タイプすれば (そう、Windows でもスラッシュでいいのです) Emacs は正しいファ イルを開いてくれるでしょう (それが新規ファイルであるために中身が空っぽで あることは、おおいにあり得るでしょう)。しかしちょっと待ってください。 Emacs が選ぶディレクトリーは、きっとあなたの希望通りにはならないので、正 しいやり方でそれを行ないましょう。第一に、例えば c:\myhome のような適当 なディレクトリーを (ディレクトリー名に空白を含めないで) 作ってください。 そして、このディレクトリーを環境変数 HOME に設定しましょう。これ を Win9x か Me で行なうには、‘autoexec.bat’ ファイルに以下の行を追 加して、再起動してください。

 
SET HOME=C:\myhome

NT, 2000 および XP では、システム・オプションを入力するため に Winkey + Pause/Break を叩いて (もしそれが使えなかったら「コント ロールパネル -> システム -> 詳細」を辿って) ください。そこで環境変数を設 定できるでしょう。HOME という名前で値が C:\myhome のものを作ってください。 再起動は不要です。

では、Emacs に C-x C-f ~/.gnus.el RET C-x C-s を指示し て、‘~/.gnus.el’ ファイルを作りましょう。

質問 3.3

ニュースサーバーが認証を要求します。ディスクにユーザー名とパスワードを保 存しておくには、どうすれば良いですか?

回答

次のように、それぞれのサーバーに関する行を含んだ ‘~/.authinfo’ ファ イルを作ってください。

 
machine news.yourprovider.net login YourUserName password YourPassword

OS が対応しているならば、そのファイルを他人が読めないようにしておきましょ う。Unix ではシェル上で次のコマンドを実行してください。

 
chmod 600 ~/.authinfo

質問 3.4

Gnus はうまく起動したようなのですが、グループを講読する方法が見つけられ ません。

回答

そのグループの名前がわかっているのなら、グループバッファーで U name.of.group RET を使ってください (タブ補完を使え、ルーク (訳注: オ ビ=ワン・ケノービの声で))。あるいはグループバッファーで ^ を使いま しょう。これはあなたをサーバーバッファーへ連れて行きます。その場合は、目 的のグループがあるサーバーの上にポイント (カーソル) を置い て RET を叩き、読みたいグループにポイントを移動してから u で そのグループを講読しましょう。

質問 3.5

Gnus がすべてのグループを表示してくれません / このサーバーへの投稿が許可 されません。どうしてですか?

回答

プロバイダーのいくつかは匿名での接続を制限していて、認証してからでないと 完全なアクセスを許しません。Gnus に認証のための情報 (authinfo) を送出さ せるには、‘~/.authinfo’ ファイルの該当するサーバーの行の最後に

 
force yes

を追加してください。

質問 3.6

複数のサーバーからニュースを取り込みたいのですが、それは可能ですか?

回答

もちろん。変数 gnus-secondary-select-methods に、もっと多くの記事 の供給元を設定することができます。以下のようなもの を ‘~/.gnus.el’ ファイルに追加してください:

 
(add-to-list 'gnus-secondary-select-methods
             '(nntp "news.yourSecondProvider.net"))
(add-to-list 'gnus-secondary-select-methods
             '(nntp "news.yourThirdProvider.net"))

質問 3.7

それから、ローカル・スプール・ファイルからニュースを取り込むことは可能で すか?

回答

問題ありません。それは nnspool というもう一つの選択方法です。こん なふうに設定してください:

 
(add-to-list 'gnus-secondary-select-methods '(nnspool ""))

あるいは NNTP を第一ニュースソースとして使う必要が無いのであれ ば、こうしてください:

 
(setq gnus-select-method '(nnspool ""))

これで Gnus は ‘/usr/spool/news’ にあるスプール・ファイルを探します。 何か違うことをやりたいのならば、上記の行を次のようなものに変更してくださ い:

 
(add-to-list 'gnus-secondary-select-methods
             '(nnspool ""
                       (nnspool-directory "/usr/local/myspoolddir")))

これは、このサーバーだけのために、スプールが存在するディレクトリーを設定 します。さらに記事を投稿するために使うプログラムなどを設定する必要がある かもしれません。そういう場合にどうしたら良いかについては、Gnus のマニュ アルを参照してください。

質問 3.8

ニュースを読むのうまくいきましたが、Gnus でメールも読めるようにしたいの です。どうすれば良いですか?

回答

それは少しばかり難しいです。使うことができるメールソースはいっぱいあるし、 メールを格納する方法はたくさんあるし、送信するための方法も様々なので。最 もありふれているのは、次の二つの事例のようなものでしょう:

  1. POP3 サーバーからメールを読み、SMTP サーバーに直接メー ルを送信します。
  2. fetchmail のようなプログラムでメールを取り込んで、Gnus が読むことになっ ているディレクトリーに格納します。外に行くメールは Sendmail, Postfix ま たは他の MTA によって送出されます。

ときには、これらを併用する必要さえあります。

しかし最初に行なうことは、どの方法でメールを格納するか、Gnus の用語で言 うと、どのバックエンドを使うかを Gnus に指示することです。Gnus は多くの 異なるバックエンドをサポートしますが、最も一般的に使われているの は nnml です。それは一通のメールを一つのファイルに格納し、そのた め極めて高速です。でも、あなたが使っているファイルシステムがたくさんの小 さなファイルを扱う上で問題があるのならば、一つのグループのすべてのメール を一つのファイルに収める方法を使う必要があるかもしれません。おそらくそう いう場合の選択肢が nnfolder バックエンドです。

nnml を使うには、以下を ‘~/.gnus.el’ ファイルに加えてくださ い:

 
(add-to-list 'gnus-secondary-select-methods '(nnml ""))

nnfolder を使いたいのならば、あなたの想像した通り、こうすれば良い でしょう:

 
(add-to-list 'gnus-secondary-select-methods '(nnfolder ""))

次に、メールをどこから取得するかを Gnus に伝えなければなりません。それ が POP3 サーバーであるのなら、このように設定してください:

 
(add-to-list 'mail-sources '(pop :server "pop.YourProvider.net"
                                 :user "yourUserName"
                                 :password "yourPassword"))

もしそこにパスワードを書いておくのなら、他人が ‘~/.gnus.el’ ファイ ルを読めないようにしておいてください。メールをローカルマシンの伝統的なス プールファイルから読みたい場合は、以下のように設定してください:

 
(add-to-list 'mail-sources '(file :path "/path/to/spool/file"))

もしそれが Postfix, Qmail または (そういうふうに設定されている) fetchmail によって使われる、一通/一ファイル形式の Maildir であるのならば、 こんなふうにしましょう:

 
(add-to-list 'mail-sources '(maildir :path "/path/to/Maildir/"
                                     :subdirs ("cur" "new")))

そして最後に、メールを一つのディレクトリーにある複数のファイルから読むよ うにしたいのであれば (例えば procmail がすでに分割してあるという理由で)、 設定は以下のようになります:

 
(add-to-list 'mail-sources
             '(directory :path "/path/to/procmail-dir/"
                         :suffix ".prcml"))

ここで :suffix に指定した ".prcml" は、Gnus に拡張子が .prcml の ファイルだけを使うことを指示するためのものです。

さあ、後はどうやってメールを送信するかを Gnus に教えるだけです。メールの 送信に sendmail を使いたければ (または、あなたのシステムの MTA が何であ れ sendmail の役を演じるのならば)、何もしなくても良いのです。でも、も し SMTP サーバーにメールを送りたいのだったら、以下のようなもの が ‘~/.gnus.el’ ファイルに書かれている必要があります:

 
(setq send-mail-function 'smtpmail-send-it)
(setq message-send-mail-function 'smtpmail-send-it)
(setq smtpmail-default-smtp-server "smtp.yourProvider.net")

質問 3.9

それから、IMAP でメールを読めるようにするには、どうすれば良い ですか?

回答

Gnus で IMAP を使うには二つの方法があります。最初の は IMAPPOP3 のように使うもので、 Gnus は IMAP サーバーからメールを取得してディスクに格納します。 これをやりたいのなら (本当にそんなことをしたい人はいないでしょうけれど)、 以下の設定を ‘~/.gnus.el’ ファイルに加えてください:

 
(add-to-list 'mail-sources '(imap :server "mail.mycorp.com"
                                  :user "username"
                                  :pass "password"
                                  :stream network
                                  :authentication login
                                  :mailbox "INBOX"
                                  :fetchflag "\\Seen"))

:stream および/または :authentication の項はいじる必要があ るかもしれません。使うことができる値については Gnus マニュア ル (see (gnus-ja)Mail Source Specifiers section ‘メールソース指示子’ in The Gnus Manual) を参照してください。

IMAP をそれが意図された方法で使いたい場合は、違うやり方に従う 必要があります。そうするには選択方法に nnimap を加え、そこでサー バーに関する情報を与えてください:

 
(add-to-list 'gnus-secondary-select-methods
             '(nnimap "Give the baby a name"
                      (nnimap-address "imap.yourProvider.net")
                      (nnimap-port 143)
                      (nnimap-list-pattern "archive.*")))

さらに Gnus が正しいやり方を推測できない場合には、サーバーに認証しても らう方法を指定しなければならないでしょう。詳しい情報はマニュア ル (see (gnus-ja)IMAP section ‘IMAP’ in The Gnus Manual) を参照してください。

質問 3.10

職場で MS Exchange サーバーの一つを使っているのですが、Gnus を使ってそこ からメールを読むことはできますか?

回答

サーバーに IMAP という新しい運動靴を一足はかせてくれるように、 管理人にお願いしてください。そして上記の説明に従って、必要なことを行なっ てください。

質問 3.11

POP3 でメールを取得するサーバーで、メールを消さないように Gnus に指示す ることはできますか?

回答

そもそも POP3 はそういうふうに動作することが意図されていません。 それが可能なら、メッセージをサーバー上に残すためには IMAP プロ トコルを使うべきです。それでもなお、そういう機能を必要とする状況があるか もしれませんが、悲しいかな、Gnus 自体はそうするための既設の機能を持って いないのです。

しかしここは Gnus 村ですから、あなたの希望を達成する見込みが無いわけでは ありません。最も簡単な方法は、メールのコピーを取り込んで、それらをディス クに格納してくれる外部プログラムを手に入れることです。そうすれば Gnus は そこから読むことができます。例えば Unix システムでは fetchmail がそれで す。MS Windows では、優れたニュースとメールのサーバーである Hamster を使 うことができます。

別の解は、Gnus が POP3 サーバーからメールを取得する手段を、メー ルをサーバーに残すことができるもので置き換えることでしょう。XEmacs を使っ ているのであれば mail-lib パッケージを手に入れてください。それは拡張され た ‘pop3.el’ を含んでいます。ファイルの中身を見てください。それを使 うように Gnus に指示するやり方と、取得したメールを削除しない方法の説明が 書かれています。GNU Emacs を使っている場合は、同じことを行なうことができ る ‘epop3.el’ を探してください (そのファイルの元の出どころを知って いる人は、私 (訳注: Simon Josefsson さんだと思います、たぶん) にメールを 送ってください)。さらに Gnus に外部プログラム (例えば fetchmail) を使っ てメールを取り寄せるようにさせることもできます。やり方は Gnus マニュア ル (see (gnus-ja)Mail Source Specifiers section ‘メールソース指示子’ in The Gnus Manual) を参照してください。

訳注: T-gnus に含まれている ‘pop3.el’ は、XEmacs のやり方をさらに発 展させて、完全に Gnus とともに動作するようになっています (した)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.4 メッセージを読む

質問 4.1

グループに入ると、以前に読んだメッセージが全部なくなってしまっています。 もう一度読むには、どうしたら良いですか?

回答

グループバッファーにおいて、そのグループの上にポイントが置かれている状態 で RET を使うと、未読と可視記事の印 (ticked) が付いたメッセージだ けが現れます。存在するすべてのメッセージが表示されるようにするには、代わ りに C-u RET を使ってください。もし最新の、例えば 300通だけが所望 ならば、C-u 300 RET を使いましょう。

スレッド表示を有効にしていると、未読のメッセージだけを表示するのはじれっ たいかもしれません。スレッドがちぎれてしまうことを防止するのに十分な量の 古い記事を取り込むには、以下の設定を追加すれば良いでしょう:

 
(setq gnus-fetch-old-headers 'some)

somet に替えると、すべての記事を表示するようになりま す (警告: どちらの設定もグループに入ったときに取り込むデータ量を増加させ、 グループに入る処理を遅くしてしまいます)。

すでに Gnus 5.10 を使っているならば、最後の n 通のメッセージを取り 込むために、概略バッファーで /o N 命令を使うことができます。この機 能は 5.8.8 にはありません。

すべての古いメッセージは要らないけれども、今まさに読んでいるメッセージの 親を辿りたいならば ^ 命令を使ってください。今まさに読んでいるメッ セージが属しているスレッドのすべての記事を表示したい場合は、 ‘A T’ 命令があなたの望むものです。

質問 4.2

大事なメッセージを、すでに読んだことがあっても、グループに入ったときはい つでも見えるように Gnus に指示するには、どうすれば良いですか?

回答

大事なメッセージには可視記事の印 (ticked) を付けることができます。それに は、概略バッファーでポイントがその記事を指しているときに u を叩い てください。可視記事の印を消す命令は d (これは可視記事の印を消して から未読の印を付けます) または M c (そのメッセージに付いているすべ ての印を消します) です。

質問 4.3

メッセージのヘッダーを見るにはどうしたら良いですか?

回答

t 命令を使うとすべてのヘッダーを表示し、もう一度使うとそれらを隠し ます。

質問 4.4

整形されていない生のメッセージを見るには、どうすれば良いですか?

回答

C-u g 命令を使うと生のメッセージを表示し、g で通常の表示に戻 ります。

質問 4.5

記事バッファーの先頭に Gnus がディフォルトで表示するヘッダーを変更するに は、どうしたら良いですか?

回答

変数 gnus-visible-headers がどのヘッダーを表示するかを制御します。 その値は正規表現で、それに合致するヘッダー行が表示されます。したがって、 著者、表題、日付、そしてもし存在する場合は Followup-To と MUA / NUA を表 示したい場合には、‘~/.gnus.el’ ファイルで以下の設定を行なってくださ い:

 
(setq gnus-visible-headers
      '("^From" "^Subject" "^Date" "^Newsgroups" "^Followup-To"
        "^User-Agent" "^X-Newsreader" "^X-Mailer"))

質問 4.6

HTML メールを描画するのではなく、テキストのパートがある場合に は、そちらの方を Gnus に表示して欲しいです。どうすれば良いですか?

回答

~/.gnus.el’ ファイルで以下の設定を行なってください:

 
(add-to-list 'mm-discouraged-alternatives "text/html")
(add-to-list 'mm-discouraged-alternatives "text/richtext")

HTML のパートと同じ内容のテキストのパートが無い場合でさえ も HTML のパートを描画して欲しくないのであれば、以下の設定を追 加してください:

 
(setq mm-automatic-display (remove "text/html" mm-automatic-display))

質問 4.7

HTML メールを w3 以外のブラウザーを使って描画させることはでき ますか?

回答

Gnus 5.10 またはより新しいものを使う場合だけですが、w3, w3m, links, lynx および html2text の中から選ぶことができ、どれを使うかは変 数 mm-text-html-renderer で指定することができます。したがっ て links で HTML メールを描画したいときは、こうしてください:

 
(setq mm-text-html-renderer 'links)

質問 4.8

見苦しい体裁のメールをもっと読みやすくするための何かがありますか?

回答

Gnus は入ってきたメールを「洗濯」するために複数の関数を提供します。それ らはメニューの Article->Washing 項目を辿ることによって見つけることができ るでしょう。最も興味深いものを挙げてみましょう:

W w (Wrap long lines)

長い行を折り畳みます。

W r (Decode ROT13)

ROT13 をデコードします。

W Y f (Outlook Deuglify)

Outlook を見苦しくなくさせます。これは、マイクロソフトの製品を使っている 多くのユーザーが送ってくる間の抜けた引用付き返信 (訳注: 折り畳まれた長い 引用行の二行目以降に引用符が前置されないなど) を修繕します。

他の見苦しくなくさせる機能については W Y C-h を使うかメニューを眺 めてください。Outlook Deuglify は Gnus 5.10 以上で使うことができます。

質問 4.9

特定の著者が送信したものや、表題に特定の語が含まれているメッセージを、自 動的に無視する方法はありますか? また、より興味深いものを何らかの方法で 強調表示させることはできますか?

回答

あなたに必要なのはスコア付けです。スコア付けと言うのは、それぞれのメッセー ジに整数の値を割り付けるための規則を定義することです。値に基づいて概略バッ ファーでメッセージを強調表示したり (それが +2000 といった高い値だったら)、 自動的に既読にしたり (その値が例えば -800 のような低い値だったら)、ある いは他のいくつかの作用を行なったりします。

メッセージにスコアの値を割り付ける規則を設定するための、基本的な三つのや り方があります。

  1. 最初の最も簡単なやり方は、今まさに読んでいる記事に基づいて規則を設定する ことです。いつもたわごとを書いてよこすやつからのメッセージを読んで、今後 はそいつからのメッセージを無視しようと決心したならば、L を叩いてス コアを下げる規則を設定してください。

    すると Gnus は、スコアを下げる基準をどれにすれば良いかを尋ねてくるでしょ う。? を二回叩くと、すべての候補を見ることができますが、ここで選択 すべきなのは著者 (From ヘッダー) を意味する a です。

    次に Gnus はどの種類の合致を使うべきかを尋ねてくるので、厳密な合致のため の e を叩くか、あるいは文字の一部への合致を求める s を叩いて から、後ですべてを削除してください。どんな電子メールアドレスであっても、 それを持つすべての著者のスコアを下げるために、その名前が使われます。

    さらに、その規則をいつ適用するべきか、またどれくらいの時間続けるべきか を Gnus に伝える必要があります。例えば p では、その規則を今すぐ適 用して、それを永久に持続させます。

    スコアを下げるのではなくて上げたいのであれば、L の代わり に I を使ってください。

  2. 規則を手で設定することもできます。そうするには概略バッファー で V f 命令を使ってください。するとスコアファイルの名前を尋ねられ るでしょう。一つのグループだけで有効なのは ‘name.of.group.SCORE’ で、 すべてのグループに対して有効なのが ‘all.SCORE’ です。厳密な構文につ いては Gnus のマニュアルを参照してください。それは一つの大きなリストで、 その要素もまた多くのリストです。その後者の単位リストの第一要素はスコアの 対象であるヘッダーで、残りは、何に合致するか、いくらのスコアを割り当てる か、規則を期限切れ消去するのはいつか、そしてどうやって合致させるかを示す もう一つのリストです。私にとても興味を持ったならば、例えば以下のようなも のを ‘all.SCORE’ ファイルに加えてみてください:
     
    (("references" ("hschmi22.userfqdn.rz-online.de" 500 nil s))
     ("message-id" ("hschmi22.userfqdn.rz-online.de" 999 nil s)))
    

    これは私が書いたメッセージのスコアに 999 を加えて、それに対する (たぶん 間接的な) 回答のメッセージのスコアに 500 を加えるでしょう。もちろん分別 のある人は誰も、こんなことはしないでしょうが。:-)

  3. 三番目の選択肢は適応スコア付けです。これは、Gnus があなたを観察して、あ なたが何に興味を持って何に幻滅するかを見つけ出し、それらを反映した規則を 設定してくれるものです。流通量の多いグループを読むときに、適応スコア付け は大きな助けになるでしょう。適応スコア付けをやってみたいならば、 ‘~/.gnus.el’ ファイルで以下の宣言を行なってください:
     
    (setq gnus-use-adaptive-scoring t)
    

質問 4.10

いくつかの (例えばメールの) グループで、スレッド表示をさせなくすることは できますか? あるいは、いくつかのグループに固有の変数を設定することがで きますか?

回答

グループバッファーにいるときに、そのグループにポイントを移動してか ら G c を叩いてください。すると、そのグループのためのオプションを 設定することができるバッファーが開きます。そして、そのバッファーのおしま いの方で、そのグループでローカルに変数を設定するための項目を見つけること ができるでしょう。スレッド表示をさせなくするには、変数名とし て gnus-show-threads を、値として nil を入力してください。 作業を終えたら、そのバッファーの最初の方にある [done] ボタンを叩きましょ う。

質問 4.11

私が書いたメッセージとフォロー記事を、強調表示させることはできますか?

回答

「できますか?」なんて質問はやめてください。Gnus 村では答えはいつ も yes なのですから。:-) これは三段階の作業になります。まず、それらの投 稿のためのフェース (概略行がどんなふうに見えるかの仕様) を作りましょう。 続いて、それらにいくばくかの特別なスコアを与えましょう。最後に、その新し いフェースを使うように Gnus に指示しましょう。

質問 4.12

特にメールのグループで、Gnus がグループバッファーに表示するメッセージの 合計の数が非常に大きいのです。これはバグですか?

回答

いいえ、これは Gnus の設計上の問題で、これを直すには Gnus のバックエンド の主要な部分を実装し直さなければなりません。Gnus は最大の記事番号から最 小の記事番号を減算したものが合計の記事数であると解釈します。これ は Usenet のグループでは OK なのですが、メールのグループでたくさんのメッ セージを消去したり移動すると計算に失敗します。この病を治療するに は C-u RET でそのグループに入り (この命令は Gnus にすべてのメッセー ジを持って来させます)、M P b ですべてのメッセージに印を付けてから、 B m name.of.group でメッセージを全部、それらが元あったグループに移 動してください。この処理によってそれらは新しいメッセージ番号を持たせられ て、合計の記事数は再び正しくなるでしょう (またもやそれらを消したり別のグ ループに移動するまでは)。

質問 4.13

概略バッファーと記事バッファーの配置が気に入らないのですが、どうやったら 変更できますか? できるなら三面で表示させたいです。

回答

gnus-add-configuration 関数を呼ぶことによって、ウィンドウの配置を 制御することができます。構文はいささか複雑ですが、マニュアルで非常に良く 説明されています (see (gnus-ja)Window Layout section ‘ウィンドウの配置’ in The Gnus Manual)。いくつかのやさしい例を挙げてみましょう。

概略 25% 記事 75% というディフォルトの割合を、概略 35% 記事 65% の割合に 変更します (記事のための 1.0 は、残った空き地を取るという意味です):

 
(gnus-add-configuration
 '(article (vertical 1.0 (summary .35 point) (article 1.0))))

グループバッファーが左、概略バッファーが右上、記事バッファーが右下という 三面配置です:

 
(gnus-add-configuration
 '(article
   (horizontal 1.0
               (vertical 25
                         (group 1.0))
               (vertical 1.0
                         (summary 0.25 point)
                         (article 1.0)))))
(gnus-add-configuration
 '(summary
   (horizontal 1.0
               (vertical 25
                         (group 1.0))
               (vertical 1.0
                         (summary 1.0 point)))))

質問 4.14

概略バッファーを見せるやり方が好きではありません。調整するには、どうすれ ば良いですか?

回答

変数 gnus-summary-line-format をいじくり回す必要があります。その 値は著者、日付、表題などのようなものを表すシンボルの文字列です。使うこと ができる仕様のリストは see (gnus-ja)Summary Buffer Lines section ‘概略バッファーの行’ in The Gnus Manual と、しばしば忘れられてしまう see (gnus-ja)Formatting Variables section ‘書法仕様変数’ in The Gnus Manual およびその下位の各章 で見つかるはずです。そこでは書法仕様の概略を使うことができるようにしてく れる、カーソルの位置指定やタブ位置の指定のようなものを見つけることができ るでしょう。残念ながら 5.8.8 ではタブ位置を固定させる機能が壊れています。

5.10 から、Gnus は非常にみごとな新しい書法仕様変数を提供しています。例え ば %B はスレッド木を描き、また %&user-date は、どう表示するかが記事が発 信されてからの経過時間に依存している日付を表示します。これらの両方を使っ ている例です:

 
(setq gnus-summary-line-format
      ":%U%R %B %s %-60=|%4L |%-20,20f |%&user-date; \n")

結果はこんなふうになります:

 
:O     Re: [Richard Stallman] rfc2047.el          |  13 |Lars Magne Ingebrigt |Sat 23:06
:O     Re: Revival of the ding-patches list       |  13 |Lars Magne Ingebrigt |Sat 23:12
:R  >  Re: Find correct list of articles for a gro|  25 |Lars Magne Ingebrigt |Sat 23:16
:O  \->  ...                                      |  21 |Kai Grossjohann      | 0:01
:R  >  Re: Cry for help: deuglify.el - moving stuf|  28 |Lars Magne Ingebrigt |Sat 23:34
:O  \->  ...                                      | 115 |Raymond Scholz       | 1:24
:O    \->  ...                                    |  19 |Lars Magne Ingebrigt |15:33
:O     Slow mailing list                          |  13 |Lars Magne Ingebrigt |Sat 23:49
:O     Re: `@' mark not documented                |  13 |Lars Magne Ingebrigt |Sat 23:50
:R  >  Re: Gnus still doesn't count messages prope|  23 |Lars Magne Ingebrigt |Sat 23:57
:O  \->  ...                                      |  18 |Kai Grossjohann      | 0:35
:O    \->  ...                                    |  13 |Lars Magne Ingebrigt | 0:56

質問 4.15

やってきたメールをいろいろなグループに振り分けるには、どうしたら良いです か?

回答

Gnus はメールを分割するための二つの手段として、やさし い nnmail-split-methods と、もっと強力な特級メール分割の機能を提 供します。ここでは最初のものだけについて述べますが、後者についてはマニュ アル (see (gnus-ja)Fancy Mail Splitting section ‘特級メール分割’ in The Gnus Manual) を参照してください。

nnmail-split-methods の値はリストで、それぞれの要素は分割の規則を 表すリストです。それぞれの規則は「合致する記事が行くべきグループ」と「合 致すべき正規表現」の形式を持っていて、最初に合致した規則が勝ちます。最後 の規則は常に汎用の規則 (正規表現 ‘.*’) でなければなりません。それは 他のどんな規則にも合致しない記事が行くべき場所を示します。もしまだフォル ダーが無かったならば、それは記事がそこに着地するとすぐに作られるでしょう。 ディフォルトでは、メールは規則に合致するすべてのグループに送られます。そ れを望まないならば (たぶん望まないでしょう)、以下のもの を ‘~/.gnus.el’ ファイルに入れてください:

 
(setq nnmail-crosspost nil)

たった一つの例は千の言葉を並べるよりも勝ります。そこで、ここでは私 の nnmail-split-methods を紹介しましょう。私は、私が講読している いくつかのメーリングリストから来るか、私を直接に目指して来たすべてのメー ルを濾過器に通すので、私が特別のグループの複写を送ることと、ディフォルト のグループは ‘spam’ であることに注意してください。これらの規則は、 私宛てに届いた spam のおよそ 80% を殺してくれます (電子メールアドレス は spammers がそれらを使用するのを防ぐために変更されます)。

 
(setq
 nnmail-split-methods
 '(("duplicates" "^Gnus-Warning:.*duplicate")
   ("XEmacs-NT" "^\\(To:\\|CC:\\).*localpart@xemacs.invalid.*")
   ("Gnus-Tut" "^\\(To:\\|CC:\\).*localpart@socha.invalid.*")
   ("tcsh" "^\\(To:\\|CC:\\).*localpart@mx.gw.invalid.*")
   ("BAfH" "^\\(To:\\|CC:\\).*localpart@.*uni-muenchen.invalid.*")
   ("Hamster-src" "^\\(CC:\\|To:\\).*hamster-sourcen@yahoogroups.\\(de\\|com\\).*")
   ("Tagesschau" "^From: tagesschau <localpart@www.tagesschau.invalid>$")
   ("Replies" "^\\(CC:\\|To:\\).*localpart@Frank-Schmitt.invalid.*")
   ("EK" "^From:.*\\(localpart@privateprovider.invalid\\|localpart@workplace.invalid\\).*")
   ("Spam" "^Content-Type:.*\\(ks_c_5601-1987\\|EUC-KR\\|big5\\|iso-2022-jp\\).*")
   ("Spam" "^Subject:.*\\(This really work\\|XINGA\\|ADV:\\|XXX\\|adult\\|sex\\).*")
   ("Spam" "^Subject:.*\\(\=\?ks_c_5601-1987\?\\|\=\?euc-kr\?\\|\=\?big5\?\\).*")
   ("Spam" "^X-Mailer:\\(.*BulkMailer.*\\|.*MIME::Lite.*\\|\\)")
   ("Spam" "^X-Mailer:\\(.*CyberCreek Avalanche\\|.*http\:\/\/GetResponse\.com\\)")
   ("Spam" "^From:.*\\(verizon\.net\\|prontomail\.com\\|money\\|ConsumerDirect\\).*")
   ("Spam" "^Delivered-To: GMX delivery to spamtrap@gmx.invalid$")
   ("Spam" "^Received: from link2buy.com")
   ("Spam" "^CC: .*azzrael@t-online.invalid")
   ("Spam" "^X-Mailer-Version: 1.50 BETA")
   ("Uni" "^\\(CC:\\|To:\\).*localpart@uni-koblenz.invalid.*")
   ("Inbox" "^\\(CC:\\|To:\\).*\\(my\ name\\|address@one.invalid\\|adress@two.invalid\\)")
   ("Spam" "")))

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.5 メッセージの作成

質問 5.1

メールを送信したりニュース記事を投稿するために知っている必要がある基本的 なコマンドは何ですか?

回答

新しいメールの作成を始めるには、グループバッファーか概略バッファーのどち らかで m を叩いてください。ニュース記事を投稿する場合には、グルー プバッファーで a を叩いた後に手で Newsgroups ヘッダーに書き込むか、 投稿するグループの概略バッファーで a を叩いてください。

メールで返信する場合、元の記事を引用しないか後で手作業で引用するつもりな らば r を、引用文を最初から取り込んでしまうのならば R を使っ てください。ニュースグループでフォロー記事を投稿する場合であれ ば fF (rR の関係に似ています) を使いましょ う。

新たにヘッダーを挿入するならば ‘--text follows this line--’ の上に 書いて、本文はその下に書いてください。書き上がったメッセージを送信するコ マンドは C-c C-c で、後で仕上げるために ‘drafts’ グループに保 存するためのコマンドは C-c C-d です。後者は D e で再び編集す ることができます。

質問 5.2

メールを作成するとき、自動的に行を折り返すにはどうすれば良いですか?

回答

No Gnus の場合は自動で行を折り返す機能がディフォルトで ON になります。変 数 message-fill-column を参照してください。

他の Gnus の版では、こんなものを ‘~/.gnus.el’ ファイルに入れてくだ さい:

 
(unless (boundp 'message-fill-column)
  (add-hook 'message-mode-hook
            (lambda ()
              (setq fill-column 72)
              (turn-on-auto-fill))))

いつもの通りに M-q を使うことによって、段落を再整形することができ ます。

質問 5.3

From, Organization, Reply-To などのヘッダーを自動生成したり、定型の署 名 (signature) を自動的に挿入するには、どうしたら良いですか?

回答

他のやり方もありますが、これのためには投稿様式 (posting styles) を使うべ きです (理由は後で書きます)。この例ならば、その構文が明確にわかるはずで す:

 
(setq gnus-posting-styles
      '((".*"
         (name "Frank Schmitt")
         (address "me@there.invalid")
         (organization "Hamme net, kren mer och nimmi")
         (signature-file "~/.signature")
         ("X-SampleHeader" "foobar")
         (eval (setq some-variable "Foo bar")))))

".*" という設定はディフォルトのものです (FAQ 5-4 参照)。そ れ以降のリストの第一要素に使える値 (属性名) は signature, signature-file, organization, address, name または body です。属性名は文字列でも構いません。その場合、属性名 はヘッダー名として使われ、その値は記事のヘッダーに挿入されます。ただし値 が nil だったら、その名前のヘッダーは削除されます。

(eval (foo bar)) の形式を使うことも可能で、その場合 bar を 引数に与えられて関数 foo が評価され、結果は捨てられます。

質問 5.4

投稿するグループによって異なる From ヘッダーや署名を自動挿入するには、ど うすれば良いですか?

回答

これこそが投稿様式 (posting styles) の強みです。前の回 答 (see FAQ 5-3) では、すべてのグループのためのディフォルトを設定す るために ".*" を使いました。これに "^gmane" のような正規表 現を使うと、それ以降の設定を gmane ニュースグループの階層で投稿する記事 だけに適用させることができます。代わりに ".*binaries" を使うと、 名前などが ‘binary’ という文字列を含んでいるグループに投稿する記事 だけに、それらの設定が適用されます。

正規表現の代わりに関数を指定することもでき、それが評価されて真を返すとき だけ、それに対応する設定が有効になります。これの興味深い二つの候補は、 現在のグループがニュースグループだったら t を返 す message-news-p と、それと対になる message-mail-p です。

すべての合致する様式が適用されることに注意してください。以下を例にすれば、 ‘gmane.mail.spam.spamassassin.general’ に投稿すると ".*" で 始まる設定が適用され、message-news-p 以下の設定も適用され、 "^gmane" で始まる設定、それ に "^gmane\\.mail\\.spam\\.spamassassin\\.general$" 以下の設定の すべてが適用されるということです。このため、一般的な設定は先頭に置き、特 定の条件を持つものは下の方に置くのが良いでしょう。

 
(setq
 gnus-posting-styles
 '((".*" ;;default
    (name "Frank Schmitt")
    (organization "Hamme net, kren mer och nimmi")
    (signature-file "~/.signature"))
   ((message-news-p) ;;Usenet news?
    (address "mySpamTrap@Frank-Schmitt.invalid")
    (reply-to "hereRealRepliesOnlyPlease@Frank-Schmitt.invalid"))
   ((message-mail-p) ;;mail?
    (address "usedForMails@Frank-Schmitt.invalid"))
   ("^gmane" ;;this is mail, too in fact
    (address "usedForMails@Frank-Schmitt.invalid")
    (reply-to nil))
   ("^gmane\\.mail\\.spam\\.spamassassin\\.general$"
    (eval (set (make-local-variable 'message-sendmail-envelope-from)
               "Azzrael@rz-online.de")))))

質問 5.5

スペルチェッカーはありますか? できれば、書いたその場でチェックしてくれ るものがあれば良いのですが。

回答

Emacs では単語の綴りをチェックするために ‘ispell.el’ を使うことがで きます。したがって最初に行なうのは、外部プログラ ム ispell または同 aspell を適当 な path にインストールしておくことです。次 に ispell.el と、書いたその場でスペルチェックをしてくれ る flyspell.el を用意してください。‘ispell.el’ は Emacs とともに配布 されているだけではなく、XEmacs パッケージシステムによっても手に入れるこ とができます。‘flyspell.el’ も Emacs に同梱されているのとともに、パッ ケージシステムを介して入手することができ る XEmacs の text-modes パッケージの一部です。したがって、それら を個別にインストールする必要は無いはずです。

ispell.el’ は外部プログラム ‘ispell’ を使うことを想定していま す。‘aspell’ を選ぶなら、Emacs の設定ファイルで以下の宣言を行なって ください (訳注: Emacs 22 以上では、‘ispell.el’ がそれらを自動判別し ます):

 
(setq ispell-program-name "aspell")

送出するメッセージがスペルチェックされるようにしたいなら以下の行を

 
(add-hook 'message-send-hook 'ispell-message)

単語を書いたその場でスペルチェックすることを好むなら次の行を

 
(add-hook 'message-mode-hook (lambda () (flyspell-mode 1)))

~/.gnus.el’ ファイルに追加してください。

質問 5.6

投稿するグループに基づいて、辞書 (スペルチェッカーの) を切り替えることは できますか?

回答

はい、できます。こんなものを ‘~/.gnus.el’ ファイルに入れてください:

 
(add-hook 'gnus-select-group-hook
          (lambda ()
            (cond
             ((string-match
               "^de\\." (gnus-group-real-name gnus-newsgroup-name))
              (ispell-change-dictionary "deutsch8"))
             (t
              (ispell-change-dictionary "english")))))

"^de\\.""deutsch8" は、必要に応じて変更してください。

質問 5.7

全員の電子メールアドレスを思い出さなくても済むようにするための、アドレス 帳のようなものはありますか?

回答

そのための非常に基本的な解は「メールの別名」(mail aliases) です。以下の ように単純な別名の構文を使って、‘~/.mailrc’ ファイルにメールアドレ スを登録しておくことができます:

 
alias al        "Al <al@english-heritage.invalid>"

そうしておいて、メッセージバッファーの To: または Cc: 行で、別名に続いて スペースか句読点をタイプすることによって、Gnus に完全なアドレスを挿入し てもらうことができます。詳細は Message マニュアル (see (message-ja)Mail Aliases section ‘メールの別名’ in The Message Manual) を参照してください。

でも、あなたが本当に使いたいのは BBDB (the Insidious Big Brother Database) でしょう。XEmacs のパッケージシステムを使うか、 bbdb のホームページ から入手してく ださい。そして Gnus で BBDB を有効にするために、以下のもの を ‘~/.gnus.el’ ファイルに書き込んでください:

 
(require 'bbdb)
(bbdb-initialize 'gnus 'message)

さて、いくつかの一般的な BBDB の設定が必要かもしれません。それら は ‘~/.emacs’ ファイルに置きましょう。例です:

 
(require 'bbdb)
;; 北アメリカに住んでいるのでなければ、以下によって電話番号の
;; チェックをやめさせるべきです。
(setq bbdb-north-american-phone-numbers-p nil)
;; あなたの電子メールアドレスを BBDB に教えましょう。
(setq bbdb-user-mail-names
      (regexp-opt '("Your.Email@here.invalid"
                    "Your.other@mail.there.invalid")))
;; メールアドレスを補完するときに、候補をエンドレスで出します。
;; cycling while completing email addresses
(setq bbdb-complete-name-allow-cycling t)
;; BBDB のバッファーをポップアップさせません。
(setq bbdb-use-pop-up nil)

これで BBDB を使う準備ができたはずです。M-x bbdb RET RET で、すべ ての登録した項目を表示する BBDB のバッファーを開いてください。新たに登録 するには c、検索には b、そして登録してある項目に新しいフィー ルドを加えるには C-o を使いましょう。送信者を BBDB に登録するには、 概略バッファーのその記事の場所で単に : を叩くだけで、あなたの仕事 は終りです。一方、新規にメールを作成しているときに TAB を叩くこと によって、順繰りに現れる候補の中から受取人を選ぶことができます。

質問 5.8

記事バッファーの上の方で、ときどき小さな画像を目にします。あれは何ですか? また、どうしたら私も投稿するときに付けることができますか?

回答

あの画像は X-Face というものです。ヘッダー行で 48×48 画素の白黒画像がエ ンコードされています。それを送信する記事に含めたいなら、何かの画像 を X-Face に変換する必要があります。そうするには、何らかの画像を加工する ためのプログラム (例えば Gimp) に点火して、記事に含めたい画像のファイル を開き、必要な部分を切り抜いて、色の深度を 1-bit まで減らし、48×48 の大 きさに縮小または拡大して、bitmap としてファイルに保存してください。次 に ‘compface’ パッケージ を このサイト から入手して、 以下を実行することによって実際の X-Face を作りましょう:

 
cat file.xbm | xbm2ikon | compface > file.face
cat file.face | sed 's/\\/\\\\/g;s/\"/\\\"/g;' > file.face.quoted

compface’ を使うことができなくても、オンラインの X-Face 変換器 が http://www.dairiki.org/xface/ にあります。MS Windows を使って いるのならば、http://www.xs4all.nl/~walterln/winface/ か ら ‘WinFace’ プログラムを取って来て使うこともできます。後は、送信す る記事に X-Face を含めてくれるように Gnus に指示するだけです。それに は ‘~/.gnus.el’ ファイルに以下のようなものを入れてください:

 
(setq message-default-headers
      (with-temp-buffer
        (insert "X-Face: ")
        (insert-file-contents "~/.xface")
        (buffer-string)))

ただし Gnus 5.10 を使っているのであれば、単に次の項を

 
(x-face-file "~/.xface")

gnus-posting-styles に加えるだけで済みます。

質問 5.9

ときどきニュースグループで、f の代わりにうっかり r を打って しまいます。ニュースグループなのにもかかわらずメールで返信しようとしたと きに、Gnus に警告してもらうことはできますか?

回答

もう Gnus 5.10 を使っているのであれば、これを ‘~/.gnus.el’ ファイル に入れてください:

 
(setq gnus-confirm-mail-reply-to-news t)

まだ 5.8.8 や 5.9 を使っているのなら、代わりにこれをどうぞ:

 
(eval-after-load "gnus-msg"
  '(unless (boundp 'gnus-confirm-mail-reply-to-news)
     (defadvice gnus-summary-reply (around reply-in-news activate)
       "Request confirmation when replying to news."
       (interactive)
       (when (or (not (gnus-news-group-p gnus-newsgroup-name))
                 (y-or-n-p "Really reply by mail to article author? "))
         ad-do-it))))

質問 5.10

Gnus が sender ヘッダーを生成しないようにするには、どうしたら良いですか?

回答

Gnus 5.10 はディフォルトで sender ヘッダーを作らないのですけれどね。まだ 古い Gnus を使っているのなら、‘~/.gnus.el’ ファイルでこれを試してく ださい:

 
(add-to-list 'message-syntax-checks '(sender . disabled))

質問 5.11

送信したメールやニュースの控えをローカルに残しておきたいのですが、どうす れば良いですか?

回答

それを行なうためには変数 gnus-message-archive-group を設定しなけ ればなりません。それには、控えを保存しておくグループの名前を与える文字列 を設定することができます。あるいは以下の例のように、評価されるとグループ 名を返す関数 (訳注: と言うよりは Lisp の式) を設定することもできます。

 
(setq gnus-message-archive-group
      '((if (message-news-p)
            "nnml:Send-News"
          "nnml:Send-Mail")))

質問 5.12

送信に成功した後でそのバッファーを "Sent mail to..." として生かしたまま にしておく代わりに kill するにはどうしたら良いですか?

回答

~/.gnus.el’ ファイルにこれを加えてください:

 
(setq message-kill-buffer-on-exit t)

質問 5.13

Message-ID が不正だと言われてしまうのですが、それはなぜですか? また、ど うやって直したら良いですか?

回答

Message-ID は、送信したメッセージが、それがそれであることを確認するため のものです。それが、あるメッセージにとって固有であるようにするために、 Gnus は ‘@’ の後に置くマシン名を知る必要があります。Gnus が走って いるマシンの名前が適切ではないならば (ほとんどの個人のマシンが該当するで しょう)、Gnus が使う名前を以下のように ‘~/.gnus.el’ ファイルで設定 してください:

 
(setq message-user-fqdn "yourmachine.yourdomain.tld")

Gnus 5.9 かそれ以前のものを使っている場合は、代わりにこれを使ってくださ い (新しい版でも動作します):

 
(let ((fqdn "yourmachine.yourdomain.tld")) ;; <-- 変更してね!
  (if (boundp 'message-user-fqdn)
      (setq message-user-fqdn fqdn)
    (gnus-message 1 "Redefining `message-make-fqdn'.")
    (defun message-make-fqdn ()
      "Return user's fully qualified domain name."
      fqdn)))

"yourmachine.yourdomain.tld" に何を入れるかを決めることができない ならば、複数の選択肢があります。あなた が ‘yourUserName.userfqdn.provider.net’ のようなものを使っても良い かどうかをプロバイダーに尋ねてみても良いし、個人でドメイ ン ‘yourdomain.tld’ を保有している場合 は ‘somethingUnique.yourdomain.tld’ のようなものを使うことができま す。あるいは、ユーザーに無料で FQDN を提供してくれるサービスに登録するの も良いでしょう。

最後に、Gnus にニュース記事では Message-ID をまったく作らせない (そして その仕事はサーバーに任せる) ことができます。以下の設定を使ってください:

 
(setq message-required-news-headers
      (remove' Message-ID message-required-news-headers))

さらに次の設定によって、メールでも Gnus に Message-ID を作らせないことは 可能です:

 
(setq message-required-mail-headers
      (remove' Message-ID message-required-mail-headers))

しかしながら、メールサーバーのあるものは適切な Message-ID を作ってくれな いので、自分でメールを送信して Message-ID を眺めてみることによって、あな たのメールサーバーが正しく振る舞うかどうかをテストしてください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.6 古いメッセージ

質問 6.1

Gnus を使っていなかったときの古いメールを、Gnus に編入させるにはどうした ら良いですか?

回答

最も楽な方法は、古いメールプログラムにメッセージを ‘mbox’ 形式にま とめてもらうことです。ほとんどの Unix のメイラーはそれをすることができ、 あなたが MS Windows の世界の出身であって も http://mbx2mbox.sourceforge.net/ で、そのための道具を見つける ことができるでしょう。

では、この ‘mbox’ ファイルを Gnus に編入させましょう。それにはグルー プバッファーで G f /path/file.mbox RET を実行して、‘mbox’ ファ イルを扱うための nndoc グループを作ってください。そうすれば、あな たのメールに読み出し専用でアクセスできるようになります。そのメッセージを 通常の Gnus のメールグループの階層に編入させたいならば、たった今作っ た nndoc グループに C-u RET 命令で入って (つまりすべてのメッ セージが読めるようにしておいて)、すべてのメッセージに M P b で印を 付けてから、それらをお望みのグループに B c name.of.group RET でコ ピーするか、または nnmail-split-methods を使ってそれらを分割 (再 スプール) するために B r を使ってください。

質問 6.2

興味を持った記事を保存するにはどうすれば良いですか?

回答

例えば ‘gnu.emacs.gnus’ で興味深い記事に出くわして、それを保存しよ うと思ったときには、複数の解があります。第一の最もやさしい方法は、 O f 命令を使ってそれをファイルに保存することです。でもそれは、 Gnus から保存されたメッセージをより直接にアクセスする手段としては、とて も便利だとは言えないのではないでしょうか? それに同意してくれるのならば、 Frank Haun pille3003@fhaun.de が書いてくれたこのコードの切れ端 を ‘~/.gnus.el’ ファイルに入れてみてください:

 
(defun my-archive-article (&optional n)
  "一個以上の記事を、対応する `nnml:' グループにコピーします。
例えば `gnus.ding' の記事は `nnml:1.gnus.ding' グループに行き、
`nnml:List-gnus.ding' の記事は `nnml:1.List-gnus-ding' に行きます。

一個以上の記事を保存するには、概略バッファーでプロセス/接頭引数の
習慣を使ってください。"
  (interactive "P")
  (let ((archive-name
         (format
          "nnml:1.%s"
          (mm-replace-in-string gnus-newsgroup-name "^.*:" ""))))
    (gnus-summary-copy-article n archive-name)))

訳注: See (gnus-ja)Process/Prefix section ‘プロセス/接頭引数’ in The Gnus Manual.

これにより、概略バッファーで M-x my-archive-article を実行すれば、 指定した記事を nnml グループに保存することができます。

もちろん、以下の設定によってキャッシュを常に有効にすることもできます:

 
(setq gnus-use-cache t)

これによって、維持したい記事には可視 (ticked) か保留 (dormant) の印を付 けるだけで済むようになります。また、既読 (read) の印を付けることによって、 それらの記事はキャッシュから削除されます。

質問 6.3

指定したメッセージを探すにはどうしたら良いですか?

回答

これにも複数の方法があります。Usenet グループに投稿されたものについては、 おそらく groups.google.com に尋ねるのが 最も楽な解決方法です。そこで見つかったならば、Google に生の記事を表示し てもらって Message-ID を探し、概略バッファーで M-^ the@message.id RET を実行してください。さらに Gnus 5.10 以降で は ‘groups.google.com’ へのインターフェースがあるので、グループバッ ファーで G W を使うこともできます。

メールとニュースの両方のグループで動作するもう一つの方法は、探しているメッ セージが存在するグループに入って、Emacs の標準の探索コマンドであ る C-s を使うことです。それは壊れたスレッドにある記事を探すために も十分に賢いものです。本文の中で探したいのならば、代わりに M-s を 試してください。さらに付け加えると、これも役に立 つ gnus-summary-limit-to-* コマンド群があります。

もちろんローカルに保存されているメールを ‘grep’ で探すこともできま すが、大きなアーカイブが相手だと遅いし、見つかったメールを Gnus で表示す るわけではないので不便でもあります。そこで nnir の出番がやってき ました。nnir は ‘swish-e’, ‘swish++’ および他の検索エン ジンへのフロントエンドです。それらの検索エンジンの一つを使ってメールに索 引を付けておけば、nnir の助けを借りることによって、索引が付けられ たメールを探して、検索の基準に合致するすべてのメールを含む一時的なグルー プを作ることができます。これがクールに聞こえるなら、 ftp://ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/ また は ftp://ftp.is.informatik.uni-duisburg.de/pub/src/emacs/ か ら ‘nnir.el’ を持って来ましょう。使い方の説明は、そのファイルの始め の方にあります。

質問 6.4

要らなくなった古いメールを削除するにはどうすれば良いですか?

回答

もはや要らなくなったメールにポイントを置いて # で印を付けてから、 それらを B DEL で永久に消してしまうことは、もちろんできます。さら に、それらを実際に消してしまう代わりに B m nnml:trash-bin を使って ジャンク・グループ (それは時々消さなければなりません) に送ることもできる のですが、両方とも Gnus が意図するやり方ではありません。

Gnus では、ニュースサーバーでニュース記事が期限切れ消去されるように、メー ルも消します。そうするためには、概略バッファーのそのメールの上 で E を叩くことによって、そのメールが期限切れ消去可能であること を (「このメールはもう要らないよ」と) Gnus に伝えれば良いのです。すると、 そのグループを抜け出たときに、Gnus は以前に印が付けられたすべてのメッセー ジを検査して、十分に古くなった (ディフォルトでは一週間より古くなった) メー ルを消去します。

質問 6.5

読み終わったすべてのメッセージを期限切れ消去したいのですが (少なくともい くつかのグループで)、どうしたら良いですか?

回答

読み終わったすべてのメッセージが期限切れ消去されるようにしたいなら (例え ばオンラインのアーカイブが別に存在しているメーリングリストで)、 auto-expiretotal-expire という二つの選択肢があります。 auto-expire というのは、印が付いていないけれども読むために選択さ れたことがあるすべての記事に期限切れ消去可能の印が付けられることで、メッ セージを読むたびに Gnus が E を叩いてくれるようなものです。 total-expire は少し異なるやり方に従っていて、既読の印が付けられた すべての記事が期限切れ消去可能になります。

auto-expire を有効にするには、そのグループのグループパラメーター に auto-expire を含めてください (グループバッファーでグループパラ メーターを変更するグループの上にポイントを置いて G c を叩きます)。 total-expire の方は、グループパラメーター に total-expire を加えてください。

どちらの手段を選ぶかは、単に好みの問題です。auto-expire は速いの ですが、適応スコア付けと共存できないので、この機能を使いたい場合 は total-expire を使わなければなりません。

total-expireauto-expire が設定されているグループで、あ るメッセージを期限切れ消去の対象から外したい場合には、u で可 視 (ticked) の印を付けるか ? で保留 (dormant) の印を付けてください。 auto-expire を使っている場合は、さらに d で既読の印を付ける ことができます。

質問 6.6

期限が来たメールを削除するのではなくて、他のグループに移動させたいのです が。

回答

~/.gnus.el’ ファイルに、このようなものを書き込んでください:

 
(setq nnmail-expiry-target "nnml:expired")

(nnmail-expiry-target にグループによって異なる値を設定したい場合 には、質問「いくつかの (例えばメールの) グループで、スレッド表示をさせな くすることはできますか? あるいは、いくつかのグループに固有の変数を設定 することができますか?」(see FAQ 4-10) を参照してください。)


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.7 ダイアルアップ環境で Gnus を使う

質問 7.1

ネットに常時接続していないのですが、どうしたら接続する時間を最小限にでき ますか?

回答

二つのやり方があります。一つは Gnus エージェントを使うこ と (see FAQ 7-2) で、もう一方はニュース記事とメールをローカルディス クに取り込むプログラムをインストールして、Gnus にそれらをローカルマシン から読んでもらう方法です。

二つ目のやり方で行きたいのなら、ニュース記事を取り込んでそれらを Gnus に 渡すプログラム、同じことをメールに対して行なうプログラム、およびあなたが 書いたメールを Gnus から受け取って、オンラインになったらそれらを送信する プログラムが必要です。

最初に Unix システムについて書きましょう。ニュース記事を取り込むための最 も安易な解は、Leafnodesn のように小規模 な NNTP サーバーを使うことです。もちろ ん inn のような本格的なニュース サーバーをインストールすることもできます。メールの取り込みに使うもので人 気があるのは fetchmail およ び getmail です。それらにメー ルをディスクに書き込むように指示してください。Gnus はそこから読むことに なります。最後ですがおろそかにできないのはメールの送信です。これにはあら ゆる MTA、例えば sendmail, postfix, exim または qmail を使うことができます。

Windows 小屋のためには Hamster を推します。 それは小さくてフリーなオープンソースのプログラムで、遠隔サーバーからメー ルとニュースを取り込んで、NNTP および POP3 また は IMAP のそれぞれを介して Gnus (あるいは他のメール/ニュースリー ダー) に渡します。さらにそれは Gnus が送信するメールを受け取るため の SMTP サーバーも含んでいます。

質問 7.2

ならば、それのエージェントに関係するものは何ですか?

回答

Gnus エージェントは Gnus の一部で、メールとニュースを取り込んでディスク に格納し、後でオフラインのときにそれらを読むことができるようにします。そ れは、言うならば、例えば Forte Agent のようなオフライン・ニュースリーダー の真似をします。まだ 5.8.8 か 5.9 を使っていてエージェントを使いたければ、 以下の行を ‘~/.gnus.el’ ファイルに書き込んでください (これ は 5.10 からディフォルトになっています):

 
(setq gnus-agent t)

そうしたら、数あるグループをローカルに格納することができるサーバーを選ば なければなりません。そのためには、サーバーバッファーを開いて (グループバッ ファーで ^ を押して) ください。そして、選んだサーバー名の場所にポ イントを移動させましょう。最後に J a をタイプして、そのサーバーを エージェント化してください。もし間違ってしまったら、あるいは気が変わった ら、J r をタイプすれば元に戻すことができます。終わった ら q をタイプして、グループバッファーに戻ってください。次回エージェ ント化されたサーバーのグループに入るとヘッダーがディスクに格納され、その 次の回にグループバッファーに入ると、そこ (ディスク) から読むようになりま す。

質問 7.3

記事の本文もディスクに格納したいのですが、どうすれば良いですか?

回答

ある述語を満足させる記事の本文を自動的に取り込むように、エージェントに指 示することができます。それは、グループバッファーで J c 命令を使う ことによって行くことができる、特別なバッファーで行ないます。どの述語を使 うことができるか、およびそれを正しく行なう方法に関する情報について は Gnus のマニュアルを参照してください。

さらに、どの記事をディスクに格納するかを、手作業でエージェントに指示する こともできます。それには二つのやり方があります:

  1. 概略バッファーで、# 命令を実行してエージェントに格納されるべき記事 にプロセス印を付けてから、J s をタイプしてください。
  2. 概略バッファーで、@ 命令を実行して欲しい記事にダウンロード可能 印 (‘%’) を付けてから、J u をタイプしてください。

どんな違いがあるのかって? えーと、ダウンロード可能印が永久的なのに対し て、プロセス印は概略バッファーを抜け出たとたんに消される点です。実際、複 数のグループでダウンロード可能印を設定して、それらすべての記事を (グルー プバッファーで J s 命令を使うことによって) まとめて取り込むことが できます。唯一の欠点は、エージェント化されているサーバーの、選択されたす べてのグループのヘッダーをも取り込んでしまうことです。ヘッダーの量にもよ りますが、最初の取り込みには何時間もかかるかもしれません。

質問 7.4

オフラインのときに Gnus にメールやニュース記事を送信させないようにするに は、どうしたら良いですか?

回答

現在の状態がオンライン (plugged) かオフライン (unplugged) かを、Gnus に 言ってあげなければなりません。それ以外のもろもろのことは自動的にやってく れます。plugged と unplugged の切り替えは、グループバッファー で J j 命令を実行することによって行なうことができます。 Gnus を unplugged の状態で起動したいなら、M-x gnus の代わり に M-x gnus-unplugged を使ってください。ただし、これが働くためには エージェントを有効にしなければならないことに注意してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.8 助けを得る

質問 8.1

Emacs の中で情報を探したり助けを求めるには、どうすれば良いですか?

回答

最初に立ち寄るべき場所は Gnus マニュアルです (C-h i d m Gnus RET で Gnus マニュアルを開いたら、メニューを眺め回すか s でテキス ト全体を探してください)。一方 Emacs には標準のヘルプ・コマンドがあって、 それには C-h ともう一つのキーを使います (C-h ? ? をタイプす ると、利用可能なヘルプ・コマンドとそれらの意味が現れます)。さら に M-x apropos-command で利用可能なすべてのコマンドを、 ‘M-x apropos’ で存在する変数を探すことができます。

質問 8.2

Gnus のマニュアルの中で、あることがら (例えば添付ファイル、PGP、 MIME...) に関する情報を、何も見つけることができません。それらは書かれて いないのですか?

回答

Gnus マニュアル以外に message, emacs-mime, sieve および pgg のマニュアル があります。それらのパッケージは Gnus とともに配布され、Gnus によって使 われますが、真に Gnus の核心部分ではないので別の info ファイルで文書化さ れています。あなたはそれらのマニュアルも覗いてみるべきでしょう。

質問 8.3

私はどのウェブサイトを知っていなければなりませんか。

回答

最も重要なものは 公式 Gnus ウェブサイト です。

他にも興味深いサイトがあったら教えてください。

質問 8.4

どんなメーリングリストとニュースグループがありますか。

回答

Gnus の一般的な質問を取り扱うニュースグループとし て ‘gnu.emacs.gnus’ がありま す (gmane.emacs.gnus.user でも利用可) 。開発版の Gnus に対する質問があるの なら、ding メーリングリストで尋ねる方が良いはずです。以下を参照してくだ さい。

Big8 (訳注: comp, humanities, misc, news, rec, sci, soc, talk の八大ニュー スグループ) にとどまっていたいのならば、 ‘news.software.readers’ もまた、いくらかの Gnus のユーザーによって 読まれています (でも、的確な助けを得ることができる見込みという点では、上 記のグループの方がはるかに良いでしょう)。ドイツ語を話す人向けに は ‘de.comm.software.gnus’ があります。

ding メーリングリスト (ding@gnus.org) は Gnus の開発を扱います。ding リ ストは news.gmane.org にあ る gmane.emacs.gnus.general を NNTP 経由で読むこともできます。

質問 8.5

バグはどこに報告すれば良いですか?

回答

M-x gnus-bug 命令を使うことによって gnus bug メーリングリスト に送るメッセージを書き始めることができます。それに はあなたを助けやすくするための、あなたの環境に関する情報が添付されます。 (訳注: 2005年の暮れの時点では、このメーリングリストはまともに機能してい ません。)

質問 8.6

その場で即座に得られる助け (real-time help) が欲しいのですが、どこで見つ かりますか?

回答

あなたの IRC を ‘irc.freenode.net’ の ‘#mygnus’ チャ ンネルに接続してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.9 Gnus をチューンする

質問 9.1

Gnus の起動が本当に遅いのですが、どうしたら速くすることができますか?

回答

この原因は、Gnus が active ファイルを読む方法に関係していることがあり得 ます。Gnus マニュアルの see (gnus-ja)The Active File section ‘アクティブファイル’ in The Gnus Manual を参照してください。そこには、その処理を速くす るために試してみる価値があることがらがあります。もう一つの案 は、‘~/.gnus.el’ ファイルをバイトコンパイルするこ と (M-x byte-compile-file RET ~/.gnus.el RET を実行すること) です。 最後に、‘~/.gnus.el’ ファイルで require を使っているならば、 それらを eval-after-load で置き換えることができるでしょう。それは 対象のモジュールを起動時ではなく、必要になったときに読み込むようにします。 あなたの ‘~/.gnus.el’ ファイルに以下のようなものがある場合には、

 
(require 'message)
(add-to-list 'message-syntax-checks '(sender . disabled))

Gnus を起動したとたんに ‘message.el’ が読み込まれます。これを次のよ うに置き換えると、

 
(eval-after-load "message"
  '(add-to-list 'message-syntax-checks '(sender . disabled)))

それは必要になったときに読み込まれるようになります。

訳注: 原典の例は不適切です。現在の Gnus は多くの主要なモジュールを起動時 に load するようになっていて、例えば ‘message.el’ モジュール は ‘~/.gnus.el’ ファイルを読み込む時点ですでに load されています。 ですから少なくとも ‘message.el’ モジュールに対して は requireeval-after-load も使う必要がありません。実害 はありませんが何の効果もありません。変数 message-syntax-checks に 項目を追加する上記の例は、単に以下のように書けば十分です。

 
(add-to-list 'message-syntax-checks '(sender . disabled))

質問 9.2

グループに入るときの動作を速くするには、どうすれば良いですか?

回答

スピードの殺し屋は、nil 以外の値を設定され た gnus-fetch-old-headers 変数です。ですからスピードが問題なので あれば、それをやらないでください。概略バッファーの構築を速くするには、

 
(gnus-compile)

を ‘~/.gnus.el’ ファイルの最後に書き込んでください。これによっ て Gnus は gnus-summary-line-format のようなものをバイトコンパイ ルします。(訳注: それを行なうと ‘~/.newsrc.eld’ ファイルにバイナリー コードが書き込まれるので、非-ASCII テキストで表現されたトピック名などと 共存できなくなる危険があります。)

それから、‘~/.emacs’ に以下のようなものを書き込んで、 gc-cons-threshold の値を増やしてみてください。

 
(setq gc-cons-threshold 3500000)

CJK (中国語/日本語/韓国語) の文字の幅を気にしないのならば、または最近 の Emacs とともに Gnus 5.10 かそれより新しいものを使っているのならば、 次の行を ‘~/.gnus.el’ ファイルに入れましょう:

 
(setq gnus-use-correct-string-widths nil)

訳注: See (gnus-ja)Wide Characters section ‘Wide Characters’ in The Gnus Manual, も参照してください。

(これら二つの提言をしてくれた Jesper harder さんに感謝します。)

最後に、まだ 5.8.8 か 5.9 を使っていて、概略バッファーを構築する場合の速 度に問題があることを経験するのであれば、絶対に 5.10 に上げるべきです。そ こではそれを改善するための、並外れた作業が行なわれました。

質問 9.3

メールの送信が遅くなってしまいました。何が起きたのでしょう?

回答

その理由は、gnus-message-archive-group 変数の設定によって、送信メッ セージの控えを保存する場所や方法を変更したせいかもしれません。アーカイブ グループの代わりに nnml グループを使ってみてください。そうすれば 正常な速度が戻ってくるはずです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.10 用語集

~/.gnus.el

~/.gnus.el’ という用語が使われるとき、それは Gnus の設定ファイルを 指します。それを ‘~/.gnus’ と呼ぶか、あるいは別名を指定しても構いま せん。

Back End

Gnus の用語大系では、バックエンドは Gnus の核心部分と実際のサーバーの間 の層に位置を占める仮想サーバーのことです。実際のサーバーとは、 NNTP サーバー、POP3 サーバー、IMAP サーバー、 または、何であれ「メッセージの取得」や「ヘッダーの取得」を行なうサーバー の機能を持つ関数のことです。

Emacs

この FAQ で使われている Emacs という用語は、GNU Emacs か XEmacs のどちら かを指します。

Message

この FAQ で「メッセージ」はそれがどんな種類のものでも、メール、また は Usenet ニュースグループか他の何らかの特製のバックエンドに送られるニュー ス記事のどちらかを意味します。

MUA

MUA は Mail User Agent の頭字語で、電子メールを読んだり書いたりするため のプログラムのことです。

NUA

NUA は News User Agent の頭字語で、Usenet ニュースを読んだり書いたりする ためのプログラムのことです。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Yasutaka SHINDOH on May 11, 2011 using texi2html 1.82.