\input texinfo                  @c -*- mode: texinfo; coding: iso-2022-jp -*-
@c %**start of header
@setfilename riece-ja.info
@settitle Riece -- An IRC client for Emacsen --
@c %**end of header
@set VERSION 1.0.6
@c @documentlanguage ja

@dircategory GNU Emacs Lisp
@direntry
* Riece-ja: (riece-ja).   An IRC client for Emacsen
@end direntry

@ifinfo
This file describes Riece.

Copyright (C) 2003,2004 Daiki Ueno.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts.  A copy of the license is included in the section entitled "GNU
Free Documentation License".
@end ifinfo

@tex

@titlepage
@title Riece

@author by Daiki Ueno
@page

@vskip 0pt plus 1filll
Copyright @copyright{} 2003 Daiki Ueno.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts.  A copy of the license is included in the section entitled "GNU
Free Documentation License".
@end titlepage
@page

@end tex

@node Top, Overview, (dir), (dir)
@top Riece user's manual

Riece は Emacs で IRC (Internet Relay Chat) に参加するためのプログラムです。

@menu
* Overview::                    Riece とは何か
* Getting started::             
* Basic usage::                 基本的な使い方
* Advanced usage::              進んだ使い方
* Tips::                        便利な設定
* Development::                 開発者向け情報
* Index::                       
* Function Index::              
* Variable Index::              
@end menu

@node Overview, Getting started, Top, Top
@chapter Overview

Riece は、長い間メンテナンス不可能な状態にあった Liece のコードを完全に
書き直したものです。ユーザインターフェースの大部分は Liece のものを踏襲
しています。

現在のところ IRC クライアントとしての機能は十分ではありませんが、Liece 
にはない特長がいくつかあります。以下にそれらの一部を挙げます。

@itemize @bullet
@item 複数の IRC サーバに同時に接続可能
@item アドオンにより機能の追加や取り外しが可能
@item 他の elisp パッケージに依存しないため、インストールが簡単
@item 設定が簡単で、前回起動時の設定を記録・復元する仕組みを提供
@item 段階的な操作説明書(現在は日本語のみ)が附属
@item 最新の IRC のクライアントプロトコル (RFC2812) に準拠
@end itemize

より詳しい情報は、以下のページを御覧ください。

@itemize @bullet
@item http://www.nongnu.org/riece/
@item http://wiliki.designflaw.org/index.cgi?Riece&l=jp
@item http://www.unixuser.org/~ueno/liece/
@end itemize

@node Getting started, Basic usage, Overview, Top
@chapter Getting started

@menu
* Required Environments::       動作環境
* Installation::                インストール方法
* Startup File::                設定ファイル
@end menu

@node Required Environments, Installation, Getting started, Getting started
@section Required Environments

次に挙げる環境で動作を確認しています。

@itemize @bullet
@item Emacs 20.7 以上
@item XEmacs 21.4 以上
@end itemize

@node Installation, Startup File, Required Environments, Getting started
@section Installation

Riece の最新版は、
@uref{http://wiliki.designflaw.org/riece.cgi} で配布していま
す。展開したら、以下のコマンドを実行することで手元の環境にインストールで
きます

@example
./configure
make
make install
@end example

XEmacs のパッケージとしてインストールする場合には以下のようにします。

@example
./configure --with-xemacs[=xemacs-21.4.15]
make package
make install-package
@end example

XEmacs のパッケージとしてインストールした場合には必要ありませんが、
@kbd{M-x riece} で起動するためには、autoload の設定を御自分の Emacs の設
定ファイルに加える必要があります。

@lisp
(autoload 'riece "riece" "Start Riece" t)
@end lisp

@node Startup File,  , Installation, Getting started
@section Startup file

この章では、設定ファイルについて解説します。

試しに使ってみる場合には、特に何も設定する必要はありません。
この章は読み飛ばしても構いません。

Riece は設定ファイルを変数 @code{riece-directory} で指示されるディレクト
リ (デフォルトは @file{~/.riece/}) から読み込みます。このディレクトリに
は以下の 2 つの設定ファイルが配置されます。

@table @code
@item riece-saved-variables-file
@vindex riece-saved-variables-file
前回のセッションで更新された設定が自動的に保存されます(デフォルトは @file{~/.riece/save})
@item riece-variables-file
@vindex riece-variables-file
ユーザに固有の設定を記述します(デフォルトは @file{~/.riece/init})
@end table

起動時には、最初に @code{riece-saved-variables-file} を、次に 
@code{riece-variables-file} を読み込みます。つまり、
@file{~/.riece/save} に自動的に保存された内容は、@file{~/.riece/init} に
記述された内容で上書きされます。

@node Basic usage, Advanced usage, Getting started, Top
@chapter Basic usage

@kbd{M-x riece} とすることで起動します。サーバ名を聞かれるので答えます。
接続可能な IRC サーバは各 IRC ネットワーク毎に異なりますが、大抵は Web 
ページに一覧がまとめてあることが多いでしょう。

@itemize @bullet
@item http://irc.kyoto-u.ac.jp
@item http://freenode.net
@end itemize

もしニックネームが既に使用されている場合、別のニックネームの入力を促されます。
ニックネームの初期値は @code{riece-nickname} で設定します。デフォルトでは、
ユーザのログイン名がそのまま使われます。
@vindex riece-nickname

無事に接続できたら、次はチャンネルに参加して会話をしてみましょう。
@kbd{C-c j} とタイプすると参加するチャンネル名を尋ねられるので、適当なチャ
ンネル名を入力しましょう。IRCnet には @samp{#Riece} というチャンネルがあ
るので、テストにお使いください。

チャンネルに入ることができたら、文章を入力してリターンキーを押すと発言す
ることができます。他の人の会話は画面右上のバッファに表示されます。

@menu
* Windows::                     画面構成
* Indicators::                  自分の状態の表示
* Commands::                    コマンドの一覧
* Connecting to multiple servers::  複数のサーバにつなぐには
@end menu

@node Windows, Indicators, Basic usage, Basic usage
@section Windows

デフォルトの設定では、チャンネルに入ると、下の図に示すような 5 つのウィン
ドウからなる画面に切り替わります。

@example
+-----+-----------------+
|     |                 |
|     |                 |
| (1) |       (2)       |
|     |                 |
|     |                 |
+-----+-----------------+
|     |       (4)       |
|     +-----------------+
| (3) |                 |
|     |       (5)       |
|     |                 |
+-----+-----------------+
@end example

これらの各ウィンドウに表示されるバッファの役割は以下の通りです。

@enumerate
@item
ユーザリストバッファ (@samp{*Users XXX*})。チャンネルにいるユーザの一覧
が表示されます。

@item
チャンネルバッファ (@samp{*Channel XXX*})。チャンネル内の会話が表示され
ます。

@item
チャンネルリストバッファ (@samp{*Channels*})。参加しているチャンネルの一
覧が表示されます。

@item
コマンドバッファ (@samp{*Commands*})。文章やコマンドを送信するために使い
ます。

@item
アザーズバッファ (@samp{*Others*})。現在のチャンネル以外の会話が流れます。
@end enumerate

@node Indicators, Commands, Windows, Basic usage
@section Indicators

コマンドバッファやチャンネルバッファのモードラインの左端には、
自分の現在の状態を示す印が表示されます。

@example
Riece: --- ueno #Liece [n]
@end example

ここで、@samp{---} の部分には左から順に以下の意味があります。

@enumerate
@item
離席状態 (離席していれば @samp{A})

@item
オペレータ状態 (IRC オペレータであれば @samp{O})

@item
チャンネルバッファ、またはダイアログバッファのスクロール禁止状態
(完全に禁止していれば @samp{F}、自分の次回の発言まで禁止しているのであれ
ば @samp{f})
@end enumerate

@node Commands, Connecting to multiple servers, Indicators, Basic usage
@section Commands

文章を入力したバッファは、コマンドバッファと呼ばれ、コマンドバッファから
は様々なコマンドを発行することができます。以下に一部を挙げます。

@subsection IRC commands
@table @kbd
@item RET
@findex riece-command-enter-message
文章を送ります(@code{riece-command-enter-message})
@item C-RET
@findex riece-command-enter-message-as-notice
文章を NOTICE として送ります(@code{riece-command-enter-message-as-notice})
@item C-c j
@findex riece-command-join
チャンネルに参加します(@code{riece-command-join})
@item C-c C-p
@findex riece-command-part
チャンネルから離脱します(@code{riece-command-part})
@item C-c p
@findex riece-command-enter-message-to-user
宛先を指定して現在の行を送ります(@code{riece-command-enter-message-to-user})
@item C-c q
@findex riece-command-quit
IRC をやめます(@code{riece-command-quit})
@item C-c n
@findex riece-command-change-nickname
自分のニックネームを変更します(@code{riece-command-change-nickname})
@item C-c f
@findex riece-command-finger
ユーザの情報を調べます(@code{riece-command-finger})
@item C-c C-k
@findex riece-command-kick
ユーザをチャンネルから蹴り出します(@code{riece-command-kick})
@item C-c i
@findex riece-command-invite
ユーザをチャンネルに招待します(@code{riece-command-invite})
@item C-c l
@findex riece-command-list
パターンに対して LIST を発行します(@code{riece-command-list})
@item C-c C-n
@findex riece-command-names
パターンに対して NAMES を発行します(@code{riece-command-names})
@item C-c w
@findex riece-command-who
パターンに対して WHO を発行します(@code{riece-command-who})
@item C-c t
@findex riece-command-topic
チャンネルのトピックを設定します(@code{riece-command-topic})
@item C-c C-m
@findex riece-command-change-mode
チャンネルのモードを設定します(@code{riece-command-change-mode})
@item C-c o
@findex riece-command-set-operators
ユーザにオペレータ権限を与えます。前置引数 (@kbd{C-u}) を与えると、ユーザからオペレータ権限を奪います(@code{riece-command-set-operators})
@item C-c v
@findex riece-command-set-speakers
ユーザに発言権を与えます。前置引数 (@kbd{C-u}) を与えると、ユーザから発言権を奪います(@code{riece-command-set-speakers})
@item C-c V
@findex riece-version
Riece のバージョンを表示します。前置引数 (@kbd{C-u}) を与えると、より詳細な情報を表示します。
@item C-c /
@findex riece-command-raw
生の IRC コマンドを送ります(@code{riece-command-raw})
@end table

@subsection Window manipulating commands
@table @kbd
@item C-c r
@findex riece-command-configure-windows
ウィンドウを再描画します(@code{riece-command-configure-windows})
@item C-c C-j
@findex riece-command-next-channel
次のチャンネルに移ります(@code{riece-command-next-channel})
@item C-c <
@findex riece-command-previous-channel
前のチャンネルに移ります(@code{riece-command-previous-channel})
@item C-c >
@findex riece-command-next-channel
次のチャンネルに移ります(@code{riece-command-next-channel})
@item C-c ^
@findex riece-command-list-addons
アドオンの一覧を表示します(@code{riece-command-list-addons})
@item C-c 数字
@findex riece-command-switch-to-channel-by-number
@var{n}番目のチャンネルに移動します(@code{riece-command-switch-to-channel-by-number})
@item C-c C-c 数字
@findex riece-command-switch-to-channel-by-number
@var{n} + 10番目のチャンネルに移動します(@code{riece-command-switch-to-channel-by-number})
@item C-c Home
@findex riece-command-beginning-of-buffer
チャンネルバッファ、またはダイアログバッファのビューを上端まで移動します(@code{riece-command-beginning-of-buffer})
@item C-c $
@findex riece-command-end-of-buffer
チャンネルバッファ、またはダイアログバッファのビューを下端まで移動します(@code{riece-command-end-of-buffer})
@item C-c SPC
@findex riece-command-scroll-up
チャンネルバッファ、またはダイアログバッファを上方向にスクロールします(@code{riece-command-scroll-up})
@item C-c DEL
@findex riece-command-scroll-down
チャンネルバッファ、またはダイアログバッファを下方向にスクロールします(@code{riece-command-scroll-down})
@end table

@subsection Status toggle commands
@table @kbd
@item C-c C-t c
@findex riece-command-toggle-channel-buffer-mode
チャンネルバッファの表示・非表示を切り替えます(@code{riece-command-toggle-channel-buffer-mode})
@item C-c C-t C
@findex riece-command-toggle-channel-list-buffer-mode
チャンネルリストバッファの表示・非表示を切り替えます(@code{riece-command-toggle-channel-list-buffer-mode})
@item C-c C-t u
@findex riece-command-toggle-user-list-buffer-mode
ユーザリストバッファの表示・非表示を切り替えます(@code{riece-command-toggle-user-list-buffer-mode})
@item C-c C-t f
@findex riece-command-toggle-freeze
チャンネルバッファ、またはダイアログバッファを凍結(スクロールを禁止)しま
す(@code{riece-command-toggle-freeze})
@item C-c C-t o
@findex riece-command-toggle-own-freeze
チャンネルバッファ、またはダイアログバッファを、自分が発言するまで凍結し
ます(@code{riece-command-toggle-own-freeze})
@item C-c C-t a
@findex riece-command-toggle-away
自分の離席状態を切り替えます(@code{riece-command-toggle-away})
@end table

@node Connecting to multiple servers,  , Commands, Basic usage
@section Connecting to multiple servers

Riece の大きな特長に、複数のサーバに同時に接続する機能があります。

新たなサーバに接続し、そのサーバ上のチャンネルに参加する手順は以下のよう
になります。

@enumerate
@item
@kbd{C-c O} (@code{riece-command-open-server}) とします。サーバ名を聞かれるので答えます。

@item
@kbd{C-c j} (@code{riece-command-join}) でチャンネルに参加します。ここで、
チャンネル名の後に空白で区切ってサーバ名を続けます。空白を入力するには、
@kbd{C-q} を使います。たとえば、サーバ @samp{irc6} 上の @samp{#Liece} に参加するには @kbd{C-c j #Liece C-q SPC irc6} とタイプすることになります。
@end enumerate

チャンネルに入らずにコマンドを送るには、@kbd{C-c M}
(@code{riece-command-universal-server-name-argument}) が便利です。

サーバとの接続に関するコマンドは以下の通りです。

@table @kbd
@item C-c O
@findex riece-command-open-server
別のサーバに接続します(@code{riece-command-open-server})
@item C-c C
@findex riece-command-close-server
サーバとの接続を切断します(@code{riece-command-close-server})
@item C-c M
@findex riece-command-universal-server-name-argument
特定のサーバに対して、続くコマンドを発行します(@code{riece-command-universal-server-name-argument})
@end table

@node Advanced usage, Tips, Basic usage, Top
@chapter Advanced usage

この章では、もっと進んだ使い方を解説します。

@menu
* Server settings::             サーバの詳細設定
* Add-ons::                     アドオンとは
@end menu

@node Server settings, Add-ons, Advanced usage, Advanced usage
@section Server settings

起動時にデフォルトで接続する IRC サーバは @code{riece-server} で指定します。
@vindex riece-server

ここで @code{riece-server} は文字列であり、そのフォーマットは次のように
なります。
@example
 "<サーバのホスト名>:<ポート番号>[:<パスワード>]"
@end example

@code{riece-server-alist} を適切に設定すると、キーワードを使って、より詳
細な指定が可能になります。以下は筆者の設定から抜き出した例です。
@vindex riece-server-alist

@example
(setq riece-server-alist
      '(("irc6" :host "irc6.nara.wide.ad.jp")
        ("plum" :host "localhost" :service 26667
         :function relay-open-network-stream))
      riece-server "irc6")
@end example

@code{riece-server-alist} の各要素の意味は以下の通りです。

@itemize
@item
@samp{irc6} という略記名で @samp{irc6.nara.wide.ad.jp} に接続

@item
@samp{plum} という略記名で @code{relay-open-network-stream} を通じて (SSH 経由で) 接続
@end itemize

指定可能なキーワードは以下の通りです。

@table @code
@item :host
サーバのホスト名または IP アドレス
@item :service
サーバのサービス名またはポート番号 (デフォルトは 6667)
@item :nickname
接続時のニックネーム
@item :username
接続時のユーザネーム
@item :password
接続時のパスワード
@item :function
接続用関数
@item :coding
コーディングシステム (デフォルトは @code{riece-default-coding-system} の値)
@end table

@node Add-ons,  , Server settings, Advanced usage
@section Add-ons

Riece では、ユーザが新たな機能を追加し、自由に取り外しできるよう、アドオ
ンと呼ばれる機構を用意しています。アドオンは通常の elisp モジュールを拡
張したもので、ロードの順番だけではなく、初期化処理の依存関係も記述するこ
とができます。

現在、以下のモジュールがアドオンとして実装されています：

@table @samp
@item riece-highlight
バッファの色付け
@item riece-ctcp
CTCP (Client To Client Protocol)
@item riece-url
会話に現れた URL の収集
@item riece-unread
発言のあったチャンネルに@samp{!}マークをつける
@item riece-rdcc
DCC (Direct Client to Client protocol) によるファイル転送
(Ruby による実装)
@item riece-ndcc
DCC (Direct Client to Client protocol) によるファイル転送
(Emacs 21.3 の make-network-process による実装)
@item riece-mini
ミニバッファのみで IRC をする
@item riece-log
会話のログの収集
@item riece-doctor
doctor.el と連携して精神科医になりすます
@item riece-alias
チャンネル名やニックネームの別名を定義
@item riece-skk-kakutei
SKK 使用時に変換モードの印を発言から取り除く
@item riece-foolproof
チャンネルミスを防ぐ
@item riece-guess
色々な方法で移動先のチャンネルを推測
@item riece-history
チャンネル移動の履歴管理
@item riece-button
ボタンやポップアップメニューの表示
@item riece-keyword
キーワードの強調表示
@item riece-menu
メニューバーにメニューを登録
@item riece-async
Emacs が busy or suspend 状態になることに備え、
PING に応答する local proxy 経由で IRC サーバに接続
@item riece-lsdb
アドレス帳 LSDB (Lovely Sister Database)
@uref{http://lsdb.sourceforge.jp} と連携
@item riece-xface
ユーザリストバッファにユーザの X-Face を表示
@item riece-ctlseq
コントロールシーケンス (^B など) による強調表示
@item riece-ignore
指定したユーザの発言を無視
@item reice-hangman
チャンネル内で hangman(6) で遊ぶ
@item riece-biff
他のバッファにいる時に発言があるとモードラインに印 ("[R]") を表示
@item riece-kakasi
日本語の通らない端末で、日本語をローマ字で表示
@item riece-yank
@kbd{C-c y} で kill-ring から文字列を送信
@end table

これらのうち、@samp{riece-highlight} と @samp{riece-ctcp}、
@samp{riece-url}、 @samp{riece-unread}、 @samp{riece-guess}、
@samp{riece-history}、 @samp{riece-button}、@samp{riece-menu}、
@samp{riece-ignore} はデフォルトで組み込まれています。

アドオンを組み込むには @code{riece-addons} を設定します。たとえば 
@samp{riece-alias} を組み込む場合には、@file{~/.riece/init.el} に以下のよ
うに記述します。
@vindex riece-addons

@example
(add-to-list 'riece-addons 'riece-alias)
@end example

@node Tips, Development, Advanced usage, Top
@comment  node-name,  next,  previous,  up
@chapter Tips

この章では、よく聞かれる質問に対する答えや、便利な設定を紹介します。

@section チャンネル名「#ほげ:*.jp」を「%ほげ」と略記したい

以下の行を @file{~/.riece/init.el} に追加します：

@example
(add-to-list 'riece-addons 'riece-alias)
@end example

@section 直前にいたチャンネルに戻りたい
@vindex riece-guess-channel-try-functions

以下の行を @file{~/.riece/init.el} に追加することで、
@kbd{C-c g} で履歴を辿りつつ移動できます。

@example
(add-hook 'riece-guess-channel-try-functions
          'riece-guess-channel-from-history)
@end example

@section 発言があるとバッファがスクロールするのを止めたい

@kbd{C-c C-t f} です。(irchat では @kbd{C-c C-f}) "t"oggle "f"reeze と覚
えましょう。

@section 派手な装飾を抑制したい

@code{riece-addons} から、色付け (@samp{riece-highlight})、ボタン 
(@samp{riece-button})、アイコン (@samp{riece-icon}) を除きます。

たとえば色付けをやめたいのであれば、以下の行を @file{~/.riece/init.el} 
に追加します：

@example
(setq riece-addons (delq 'riece-highlight riece-addons))
@end example

@section キーワードに反応して音を鳴らしたい
@vindex riece-keyword-notify-functions

XEmacs では、以下の設定を @file{~/.riece/init.el} に加えることで、"ほげ" 
や "ふが" に反応して効果音(この例では、カッコーの鳴き声)を鳴らすことがで
きます。

@example
(load-default-sounds)
(setq riece-keywords '("ほげ" "ふが"))
(add-hook 'riece-keyword-notify-functions
          (lambda (keyword message) (play-sound 'cuckoo)))
@end example

Emacs の場合は,以下の設定を @file{~/.riece/init.el} に加えることで,
"ほげ" や "ふが" に反応して音を鳴らすことができます。

@example
(defun cuckoo ()
  "play cuckoo.au"
  (call-process "play" nil 0 t
                ".../cuckoo.au"))
  (setq riece-keywords '("ほげ" "ふが"))
  (add-hook 'riece-keyword-notify-functions
            (lambda (keyword message) (cuckoo)))
@end example

効果音ではなくシンプルにビープ音を鳴らしたい場合は、以下の設定を 
@file{~/.riece/init.el} に加えます。

@example
(setq riece-keywords '("ほげ" "ふが"))
(add-hook 'riece-keyword-notify-functions
          (lambda (keyword message) (ding)))
@end example

@section SKK を使っていて、変換モードの印 (▽) を送信したくない

以下の行を @file{~/.riece/init.el} に追加します：

@example
(add-to-list 'riece-addons 'riece-skk-kakutei)
@end example

@section チャンネルの番号を固定したい
@vindex riece-default-channel-binding

以下の行を @file{~/.riece/init.el} に追加します：

@example
(setq riece-default-channel-binding
     '("#Liece" "#emacsen" nil "#debianjp"))
@end example

1: #Liece, 2: #emacsen, 4: #debianjp のように割当てられます。nil はデフォ
ルトでは自動割当ての対象にならないこと意味し、新たなチャンネルに参加した
場合、そのチャンネルが 3 番目のチャンネルとして扱われます。

@section 起動時にパスワードつきのチャンネルに参加したい
@vindex riece-startup-channel-list
@vindex riece-startup-server-list

以下の行を @file{~/.riece/init.el} に追加します：

@example
(setq riece-startup-channel-list
     '(("#secret" "password") "#Liece"))
@end example

複数のサーバ上のチャンネルに参加するには、
@code{riece-startup-server-list} も併せて設定する必要があります。

例として、@code{riece-server} と @code{riece-server-alist} を以下のよう
に設定したとします。

@example
(setq riece-server "ircnet"
      riece-server-alist '(("ircnet" :host "irc6.nara.wide.ad.jp")
                           ("freenode" :host "irc.ipv6.freenode.net")))
@end example

この場合、デフォルトでは "ircnet" だけに接続しますが、
@code{riece-startup-server-list} を以下のように設定することで、
"freenode" にも接続するようになります。

@example
(setq riece-startup-server-list '("freenode"))
@end example

@section HTTP プロキシ越しに IRC サーバに接続したい
relay.el と connect.c を使うと、
HTTP プロキシを介して IRC サーバに接続することができます。

@table @asis
@item relay.el
@uref{http://www.taiyo.co.jp/~gotoh/lisp/relay.el}

@item connect.c
@uref{http://www.taiyo.co.jp/~gotoh/ssh/connect.html}
@end table

たとえば、"proxy.example.com:8080" 経由で irc.tokyo.wide.ad.jp に接続す
る場合には、以下の行を @file{~/.riece/init.el} に追加します：

@example
(require 'relay)
(setq relay-command-alist (cons '("^irc\.tokyo\.wide\.ad\.jp$"
                                  "connect" "-H" "proxy.example.com:8080"
                                  host service)
                                relay-command-alist)
      riece-server-alist (cons '("proxy-tokyo" :host "irc.tokyo.wide.ad.jp"
                                 :function relay-open-network-stream)
                               riece-server-alist))
@end example

@section IRC ログをファイルに保存したい
@vindex riece-log-directory-map

以下の行を @file{~/.riece/init.el} に追加します：

@example
(add-to-list 'riece-addons 'riece-log)
@end example

ログファイルはデフォルトでは @file{~/.riece/log} の下にサーバ名、チャン
ネル名のディレクリが作成され、その中に日にち毎に保存されます。ただしデフォ
ルトのサーバの場合は、サーバ名のディレクトリは省略されます。

US-ASCII 以外のディレクトリ名が文字化けするという人は、
@code{file-name-coding-system} の値を適切に設定するか、あるいは 
@code{riece-log-directory-map} でチャンネル名と保存先のディレクトリ名と
の対応リストを以下の例のように、US-ASCII のみを使用したディレクトリ名に
なるように設定する事で回避出来ます：

@example
(setq riece-log-directory-map '(("#りーす" . "riece")))
@end example

@node Development, Index, Tips, Top
@chapter Development

開発者募集中。

@menu
* CVS::                         開発中のソースの取得
* Debugging::                   デバッグのための設定
* Modules::                     構成モジュールの説明
* Namespace management::        
* Signals::                     
* Writing add-ons::             アドオンの書きかた
* Handler hooks::               
@end menu

@node CVS, Debugging, Development, Development
@section CVS

Riece の開発は CVS を利用して行っています。CVS サーバから最新のスナップ
ショットを取得するには以下のようにします。

@enumerate
@item
CVS サーバへのログイン

@example
cvs -d :pserver:anonymous@@cvs.m17n.org:/cvs/root login
CVS password: [CR] # NULL string
@end example

@item
モジュールのチェックアウト

@example
cvs -d :pserver:anonymous@@cvs.m17n.org:/cvs/root checkout riece
@end example

@item
@file{configure} の生成

@example
autoreconf -f -i -v
@end example
@end enumerate

@node Debugging, Modules, CVS, Development
@section Debugging

@code{riece-debug} を @code{t} に設定すると、デバッグ出力が有効になりま
す。また、サーバからの生の出力が " *IRC*[<サーバ名>]" バッファに消されず
に残ります。
@vindex riece-debug

@node Modules, Namespace management, Debugging, Development
@section Modules

基本的に依存関係の上位にあるものから：

@table @samp
@item riece-globals
大域変数の定義 
@item riece-options
ユーザオプションの定義 
@item riece-version
バージョンの定義 
@item riece-coding
コーディングシステム関連の関数の定義 
@item riece-complete
ミニバッファでの補完を助ける関数の定義 
@item riece-addon
アドオン管理

@item riece-mode
channel/user のモード管理
@item riece-identity
channel/user object の大域表記を操作する関数の定義 
@item riece-channel
channel object 関連の定義 
@item riece-user
user object 関連の定義 

@item riece-misc
雑多な関数の定義
@item riece-signal
シグナル(@pxref{Signals})管理

@item riece-layout
ウィンドウレイアウト管理
@item riece-display
表示用バッファの管理 
@item riece-server
IRCサーバとの接続管理 

@item riece-naming
名前管理のための mediator のようなもの 
@item riece-message
message object 関連の定義 

@item riece-filter
プロセスフィルタのエントリポイント 
@item riece-handle
通常のメッセージのハンドラ。riece-filter から呼ばれる 
@item riece-000
000番台の numeric reply のハンドラ。riece-filter から呼ばれる 
@item riece-200
200番台の numeric reply のハンドラ。riece-filter から呼ばれる 
@item riece-300
300番台の numeric reply のハンドラ。riece-filter から呼ばれる 
@item riece-400
400番台の numeric reply のハンドラ。riece-filter から呼ばれる 
@item riece-500
500番台の numeric reply のハンドラ。riece-filter から呼ばれる 

@item riece-commands
コマンドの定義 
@item riece-irc
IRC プロトコルインターフェース
@item riece
エントリポイント。各バッファのモード定義など 
@end table

@node Namespace management, Signals, Modules, Development
@section Namespace management

Riece は複数のサーバに同時に接続するため、サーバ毎に別々の名前空間を管理
しています。この名前空間には、サーバのプロセスに結び付けられたバッファの
ローカル変数を介してアクセスします。

@subsection Obtaining server buffer
サーバのプロセスを得るには、まずはじめにサーバの名前を得る必要があり
ます。サーバの名前は以下に挙げるいくつかの方法で取得できます。

@enumerate
@item
@vindex riece-overrinding-server-name
大域変数 @code{riece-overrinding-server-name} の値

@item
@vindex riece-server-name
@code{riece-server-name} がカレントバッファのローカル変数であるならば、
既にプロセスのバッファにいるとみなせるので、@code{riece-server-name} の
値そのもの

@item
@samp{riece-identity} オブジェクトに結び付けられたサーバ名(後述)
@end enumerate

こうして得たサーバ名で @code{riece-server-process} を呼出し、サーバの
プロセスを取得します。
@findex riece-server-process

@subsection Identity
複数のサーバに繋いだ場合、チャンネル名やニックを(サーバのバッファ上だ
けではなく)大域的に区別する必要が生じます。このような名前を表現するの
が @samp{riece-identity} オブジェクトです。

@samp{riece-identity} オブジェクトは以下の 2 つの要素をもつベクターです。

@table @samp
@item prefix
サーバローカルな名前
@item server
サーバの名前
@end table

@samp{riece-identity} オブジェクトに対する操作には以下のようなものがあります。

@defun riece-make-identity prefix &optional server
@samp{riece-identity} オブジェクトを作成します。server が省略された場合には、
riece-find-server-name を使って取得したサーバ名を使います
@end defun

@defun riece-identity-prefix identity
@samp{riece-identity} オブジェクトからサーバローカルな名前を取り出します。
@end defun

@defun riece-identity-server identity
@samp{riece-identity} オブジェクトからサーバの名前を取り出します。
@end defun

@defun riece-identity-equal ident1 ident2
2 つの@samp{riece-identity} オブジェクトが同等か調べます。
@end defun

@defun riece-identity-equal-no-server ident1 ident2
2 つの@samp{riece-identity} オブジェクトのサーバローカルな名前が同等か
調べます。
@end defun

@defun riece-identity-member elt list
@samp{riece-identity} オブジェクト @var{elt} が @var{list} に含まれる
か検査します。
@end defun

@subsection Channel and user management
@samp{riece-identity} オブジェクトによって識別される IRC のチャンネル
とユーザはそれぞれ @samp{riece-channel} オブジェクトと 
@samp{riee-user} オブジェクトにより表現されます。

@subsubsection Channels
@code{riece-channel} は、IRC のチャンネルを表すオブジェクトです。以下の
要素を持ちます。

@table @samp
@item users
参加しているユーザの名前(局所名)のリスト 
@item operators
オペレータ権限をもつユーザの名前のリスト 
@item speakers
発言権をもつユーザの名前のリスト 
@item modes
チャンネルのモード(文字のリスト) 
@item banned
@samp{MODE +b} で指定されたパターンの一覧 
@item invited
@samp{MODE +I} で指定されたパターンの一覧 
@item uninvited
@samp{MODE +e} で指定されたパターンの一覧
@end table

@subsubsection Users
@code{riece-user} は、IRC に参加しているユーザを表すオブジェクトです。以
下の要素を持ちます。

@table @samp
@item channels
参加しているチャンネルの名前(局所名)のリスト 
@item user-at-host
"<user>@@<host>" の形で与えられるユーザの情報 
@item modes
ユーザのモード(文字のリスト) 
@item away
AWAY 中かどうか 
@end table

@subsubsection Mediator
チャンネルとユーザの参加・離脱を管理するために、 @code{riece-naming} 
という上位のモジュールを用意しています。これは、デザインパターンでいう
ところの Mediator パターンに相当するものです。

@code{riece-naming} を介することで、前述のチャンネル・ユーザオブジェクト
に直接手を触れることなく、名前空間に安全にアクセスすることができます。

提供する主な関数は以下の 3 つです。

@defun riece-naming-assert-join user-name channel-name
ユーザがチャンネルに参加したことを表明します
@end defun

@defun riece-naming-assert-part user-name channel-name
ユーザがチャンネルから離脱したことを表明します 
@end defun

@defun riece-naming-assert-rename old-name new-name
ユーザの名前が変更されたことを表明します 
@end defun

@node Signals, Writing add-ons, Namespace management, Development
@section Signals

画面の再描画を効率良く行うために、イベントと描画対象のオブジェクト(バッ
ファや、モードラインの印 @pxref{Indicators})を結び付けるメカニズムを用意
しています。

何らかのイベントが発生すると、シグナルが送出されます。シグナルの概念は、
Qt や GTK+ といった GUI ツールキットに用意されているものと同様です。

シグナルを送出するには、@samp{riece-emit-signal} を使います。

@defun riece-emit-signal signal-name &rest args
@var{signal-name} で指示されるシグナルを、引数 @var{args} とともに送出します
@end defun

シグナルに応答するには、@samp{riece-connect-signal} を使います。

@defun riece-connect-signal signal-name slot-function &optional filter-function handback
@var{signal-name} で指示されるシグナルに応答する関数 @var{slot-function} 
を結び付けます。@var{slot-function} に指定された関数は 2 つの引数を取りま
す。第1の引数ははシグナルを表します。また、第2の引数として、
@var{handback} 引数に与えられたオブジェクトがそのまま渡されます。

@var{filter-function} は、受信したシグナルに応答すべきかどうかを判定する
関数です。この関数は引数としてシグナルオブジェクトを受け取り、@samp{nil}
または @samp{t} を返すことが期待されます。返り値が @samp{nil} の場合には、
@var{slot-function} が呼ばれることはありません。
@end defun

シグナルオブジェクトにアクセスするには、以下の関数を使います。

@defun riece-signal-name
シグナルの名前(シンボル)を返します。
@end defun

@defun riece-signal-args
シグナル送出時に与えられた引数を返します。
@end defun

現在、以下のシグナルが標準で登録されています：

@table @samp
@item channel-list-changed
参加しているチャンネルの一覧の変化
@item user-list-changed
チャンネルの参加者一覧の変化
(引数はチャンネルに相当する @samp{riece-identity} オブジェクト)
@item channel-switched
現在のチャンネルを移動
@item user-joined-channel
ユーザがチャンネルに参加
(引数は、ユーザおよびチャンネルに相当する @samp{riece-identity} オブジェクト)
@item user-left-channel
ユーザがチャンネルから離脱
(引数は、ユーザおよびチャンネルに相当する @samp{riece-identity} オブジェクト)
@item user-renamed
ユーザが名前を変更
(引数は、以前と現在の名前に相当する @samp{riece-identity} オブジェクト)
@item user-away-changed
ユーザの離席状態の変化
(引数は、ユーザに相当する @samp{riece-identity} オブジェクト)
@item user-operator-changed
ユーザのオペレータ状態の変化
(引数は、ユーザに相当する @samp{riece-identity} オブジェクト)
@item channel-topic-changed
チャンネルのトピックの変化
(引数は、チャンネルに相当する @samp{riece-identity} オブジェクト)
@item channel-modes-changed
チャンネルのモードの変化
(引数は、チャンネルに相当する @samp{riece-identity} オブジェクト)
@item channel-operators-changed
チャンネルでオペレータ権限を持つユーザの一覧の変化
(引数は、チャンネルに相当する @samp{riece-identity} オブジェクト)
@item channel-speakers-changed
チャンネルで発言権を持つユーザの一覧の変化
(引数は、チャンネルに相当する @samp{riece-identity} オブジェクト)
@item buffer-freeze-changed
バッファの凍結状態の変化
(引数はバッファ)
@end table

@node Writing add-ons, Handler hooks, Signals, Development
@section Writing add-ons

アドオンの条件を満たすモジュールは以下の関数を提供します。

@table @samp
@item <モジュール名>-requires
依存する他のアドオン(シンボルのリスト)を返します(オプション)
@item <モジュール名>-insinuate
初期化処理を行います
@end table

また、アドオンの説明を、変数 @samp{<モジュール名>-description} に設定す
ることもできます。この文字列は @kbd{M-x riece-command-list-addons} によ
るアドオンの一覧表示に使われます。

有効化・無効化に対応したアドオンは、変数 @samp{<モジュール名>-enabled} 
に現在の状態を保持します。値が @samp{nil} であれば無効、@samp{t} であれ
ば有効です。加えて、以下の関数を提供します。

@table @samp
@item <モジュール名>-enable
アドオンを有効にします
@item <モジュール名>-disable
アドオンを無効にします
@end table

Riece は起動時に以下の処理を行います。

@enumerate
@item
変数 @code{riece-addons} に列挙されたモジュールを読み込む

@item
それぞれのモジュールに対し、@samp{<モジュール名>-requires} が用意されていれば呼び出して依存グラフを作る

@item
依存グラフに対してトポロジカルソート (cf. tsort(1)) を行う

@item
得られた依存順序に従って @samp{<モジュール名>-insinuate} 呼び出す

@item
もし、アドオンが有効化・無効化に対応しており、明示的に無効化されていなければ、
@samp{<モジュール名>-enable}を呼び出す。
@end enumerate

作成したアドオンは、@code{load-path} の通ったディレクトリ、または 
@code{riece-addon-directory} (デフォルトでは @file{~/.riece/addons/}) に
置くことで組み込み可能な状態になります。
@vindex riece-addon-directory

@node Handler hooks,  , Writing add-ons, Development
@section Handler hooks

Riece には、ハンドラフックと呼ばれる特殊なフックがあります。これらは IRC 
のメッセージを受け取った前後で実行されるフックです。

説明のために @samp{message} を IRC のメッセージ名(PRIVMSG など)を全て小
文字にしたものとします。

@table @code
@item riece-<message>-hook
@samp{message} が届いたときに最初に呼ばれるフック
@item riece-after-<message>-hook
@samp{message} の処理が終わった後に呼ばれるフック
@end table

ここで @code{riece-<message>-hook} の返り値には意味があり、非 nil を返す
ものがあれば、その後の処理をおこないません。また、その場合には 
@code{riece-after-<message>-hook} も呼び出されません。

フックの引数は RFC2812 の @samp{prefix} と @samp{Parameters} に相当する 
2 つの引数が渡ります。

@node Index, Function Index, Development, Top
@chapter Index
@printindex cp

@node Function Index, Variable Index, Index, Top
@chapter Function Index
@printindex fn

@node Variable Index,  , Function Index, Top
@chapter Variable Index
@printindex vr

@summarycontents
@contents
@bye

@c End:
