このマニュアルは WeeChat チャットクライアントについての文書で、WeeChat の一部です。

この文書の最新版を見るには以下のページを確認して下さい: http://weechat.org/doc

1. はじめに

WeeChat (Wee Enhanced Environment for Chat) は無料のチャットクライアントで、高速、軽量、多くのオペレーティングシステムで動くように設計されています。

このマニュアルは WeeChat プラグイン API についての文書で、C 言語プラグインはこの API を使って WeeChat の中核部と通信しています。

2. WeeChat プラグイン

プラグインは C 言語のプログラムであり、インターフェイスが定義する WeeChat 関数を呼び出すことができます。

この C 言語プログラムはコンパイルの際に WeeChat のソースを必要としません、WeeChat は /plugin コマンドでこのプログラムを動的に読み込むことができます。

プラグインを動的にオペレーティングシステムに読み込ませるために、プラグインは必ずダイナミックライブラリにしてください。ファイルの拡張子は GNU/Linux では ".so"、Windows では ".dll" です。

プラグインでは必ず "weechat-plugin.h" ファイルをインクルードしてください (WeeChat ソースコードに含まれています)。このファイルでは WeeChat と通信する際に使う構造体や型が定義されています。

2.1. マクロ

プラグインでは必ず以下のマクロを使ってください (いくつかの変数を定義するために必要です):

WEECHAT_PLUGIN_NAME("name")

プラグイン名

WEECHAT_PLUGIN_DESCRIPTION("description")

プラグインの短い説明

WEECHAT_PLUGIN_VERSION("1.0")

プラグインのバージョン番号

WEECHAT_PLUGIN_LICENSE("GPL3")

プラグインのライセンス

2.2. 重要な関数

プラグインでは必ず以下の 2 つの関数を使ってください:

  • weechat_plugin_init

  • weechat_plugin_end

2.2.1. weechat_plugin_init

WeeChat はプラグインを読み込む際にこの関数を呼び出します。

プロトタイプ:

int weechat_plugin_init (struct t_weechat_plugin *plugin,
                         int argc, char *argv[]);

引数:

  • plugin: WeeChat プラグイン構造体へのポインタ

  • argc: プラグインに対する引数の数 (ユーザがコマンドラインで指定)

  • argv: プラグインに対する引数

戻り値:

  • WEECHAT_RC_OK 成功した場合 (プラグインを読み込みます)

  • WEECHAT_RC_ERROR エラーが起きた場合 (プラグインを読み込みません)

2.2.2. weechat_plugin_end

WeeChat プラグインを再読み込みする際にこの関数を呼び出します。

プロトタイプ:

int weechat_plugin_end (struct t_weechat_plugin *plugin);

引数:

  • plugin: WeeChat プラグイン構造体へのポインタ

戻り値:

  • WEECHAT_RC_OK 成功した場合

  • WEECHAT_RC_ERROR エラーが起きた場合

2.3. プラグインのコンパイル

コンパイルするために WeeChat のソースは不要で、weechat-plugin.h ファイルだけが必要です。

1 つのファイル "toto.c" からなるプラグインは以下のようにコンパイルします (GNU/Linux の場合):

$ gcc -fPIC -Wall -c toto.c
$ gcc -shared -fPIC -o libtoto.so toto.o

2.4. プラグインを読み込む

libtoto.so ファイルをシステムのプラグインディレクトリ (例えば /usr/local/lib/weechat/plugins) またはユーザのプラグインディレクトリ (例えば /home/xxx/.weechat/plugins) にコピーしてください。

WeeChat の中で:

/plugin load toto

2.5. プラグインの例

コマンド /double を追加するプラグインの例: 引数を 2 倍して現在のバッファに表示するか、コマンドを 2 回実行する (これは実用的なコマンドというよりも、ただの例です!):

#include <stdlib.h>

#include "weechat-plugin.h"

WEECHAT_PLUGIN_NAME("double");
WEECHAT_PLUGIN_DESCRIPTION("Test plugin for WeeChat");
WEECHAT_PLUGIN_AUTHOR("Sébastien Helleu <flashcode@flashtux.org>");
WEECHAT_PLUGIN_VERSION("0.1");
WEECHAT_PLUGIN_LICENSE("GPL3");

struct t_weechat_plugin *weechat_plugin = NULL;


/* "/double" コマンドのコールバック*/

int
command_double_cb (void *data, struct t_gui_buffer *buffer, int argc,
                   char **argv, char **argv_eol)
{
    /* C 言語コンパイラ向けに必要 */
    (void) data;
    (void) buffer;
    (void) argv;

    if (argc > 1)
    {
        weechat_command (NULL, argv_eol[1]);
        weechat_command (NULL, argv_eol[1]);
    }

    return WEECHAT_RC_OK;
}

int
weechat_plugin_init (struct t_weechat_plugin *plugin,
                     int argc, char *argv[])
{
    weechat_plugin = plugin;

    weechat_hook_command ("double",
                          "Display two times a message "
                          "or execute two times a command",
                          "message | command",
                          "message: message to display two times\n"
                          "command: command to execute two times",
                          NULL,
                          &command_double_cb, NULL);

    return WEECHAT_RC_OK;
}

int
weechat_plugin_end (struct t_weechat_plugin *plugin)
{
    /* C 言語コンパイラ向けに必要 */
    (void) plugin;

    return WEECHAT_RC_OK;
}

3. プラグイン API

以下の章では API 関数をカテゴリごとに説明しています。

それぞれの関数について、以下の内容が記載されています:

  • 関数の説明、

  • C 言語のプロトタイプ、

  • 引数の詳細、

  • 戻り値、

  • C 言語での使用例、

  • Python スクリプトでの使用例 (他のスクリプト言語を使う場合も文法は似ています)。

3.1. プラグイン

プラグインに関する情報を取得する関数。

3.1.1. weechat_plugin_get_name

プラグインの名前を取得。

プロトタイプ:

const char *weechat_plugin_get_name (struct t_weechat_plugin *plugin);

引数:

  • plugin: WeeChat プラグイン構造体へのポインタ (NULL でも可)

戻り値:

  • プラグインの名前、WeeChat コアの場合は "core" (プラグインへのポインタが NULL の場合)

C 言語での使用例:

const char *name = weechat_plugin_get_name (plugin);

スクリプト (Python) での使用例:

# プロトタイプ
name = weechat.plugin_get_name(plugin)

# 例
plugin = weechat.buffer_get_pointer(weechat.current_buffer(), "plugin")
name = weechat.plugin_get_name(plugin)

3.2. 文字列

以下の多くの文字列関数は標準的な C 言語の関数でも定義されていますが、この API 関数を使うことを推奨します。なぜなら、これらの関数は文字列を UTF-8 とロケールに準じて取り扱うようになっているからです。

3.2.1. weechat_charset_set

新しいプラグインの文字セットを設定する (デフォルトの文字セットは UTF-8 です、このためプラグインで UTF-8 を使う場合は、この関数を呼び出す必要はありません。

プロトタイプ:

void weechat_charset_set (const char *charset);

引数:

  • charset: 新たに利用する文字セット

C 言語での使用例:

weechat_charset_set ("iso-8859-1");

スクリプト (Python) での使用例:

# プロトタイプ
weechat.charset_set(charset)

# 例
weechat.charset_set("iso-8859-1")

3.2.2. weechat_iconv_to_internal

文字列の文字セットを WeeChat の内部文字セット (UTF-8) に変換。

プロトタイプ:

char *weechat_iconv_to_internal (const char *charset, const char *string);

引数:

  • charset: 変換元の文字列の文字セット

  • string: 変換元の文字列

戻り値:

  • 文字セットを変換した文字列 (使用後には必ず "free" を呼び出して領域を開放してください)

C 言語での使用例:

char *str = weechat_iconv_to_internal ("iso-8859-1", "iso string: é à");
/* ... */
free (str);

スクリプト (Python) での使用例:

# プロトタイプ
str = weechat.iconv_to_internal(charset, string)

# 例
str = weechat.iconv_to_internal("iso-8859-1", "iso string: é à")

3.2.3. weechat_iconv_from_internal

文字列の文字セットを WeeChat の内部文字セット (UTF-8) から別の文字セットに変換。

プロトタイプ:

char *weechat_iconv_from_internal (const char *charset, const char *string);

引数:

  • charset: 変換先の文字列の文字セット

  • string: 変換元の文字列

戻り値:

  • 文字セットを変換した文字列 (使用後には必ず "free" を呼び出して領域を開放してください)

C 言語での使用例:

char *str = weechat_iconv_from_internal ("iso-8859-1", "utf-8 string: é à");
/* ... */
free (str);

スクリプト (Python) での使用例:

# プロトタイプ
str = weechat.iconv_from_internal(charset, string)

# 例
str = weechat.iconv_from_internal("iso-8859-1", "utf-8 string: é à")

3.2.4. weechat_gettext

翻訳済み文字列を返す (設定言語に依存)。

プロトタイプ:

const char *weechat_gettext (const char *string);

引数:

  • string: 翻訳元の文字列

戻り値:

  • 翻訳済み文字列

C 言語での使用例:

char *str = weechat_gettext ("hello");

スクリプト (Python) での使用例:

# プロトタイプ
str = weechat.gettext(string)

# 例
str = weechat.gettext("hello")

3.2.5. weechat_ngettext

count 引数を元に単数形または複数形で、翻訳済み文字列を返す。

プロトタイプ:

const char *weechat_ngettext (const char *string, const char *plural,
                              int count);

引数:

  • string: 翻訳元の文字列、単数形

  • plural: 翻訳元の文字列、複数形

  • count: 単数形と複数形のどちらを返すかの判断に使います (選択は設定言語に依存)

戻り値:

  • 翻訳済みの文字列

C 言語での使用例:

char *str = weechat_ngettext ("file", "files", num_files);

スクリプト (Python) での使用例:

# プロトタイプ
str = weechat.ngettext(string, plural, count)

# 例
num_files = 2
str = weechat.ngettext("file", "files", num_files)

3.2.6. weechat_strndup

複製した文字列を最大で length 文字分返す。

プロトタイプ:

char *weechat_strndup (const char *string, int length);

引数:

  • string: 複製元の文字列

  • length: 複製する文字列の最大文字数

戻り値:

  • 複製した文字列 (使用後には必ず "free" を呼び出して領域を開放してください)

C 言語での使用例:

char *str = weechat_strndup ("abcdef", 3);  /* result: "abc" */
/* ... */
free (str);
Note
スクリプト API ではこの関数を利用できません。

3.2.7. weechat_string_tolower

UTF-8 文字列を小文字に変換。

プロトタイプ:

void weechat_string_tolower (char *string);

引数:

  • string: 変換元の文字列

C 言語での使用例:

char str[] = "AbCdé";
weechat_string_tolower (str);  /* str is now: "abcdé" */
Note
スクリプト API ではこの関数を利用できません。

3.2.8. weechat_string_toupper

UTF-8 文字列を大文字に変換。

プロトタイプ:

void weechat_string_toupper (char *string);

引数:

  • string: 変換元の文字列

C 言語での使用例:

char str[] = "AbCdé";
weechat_string_toupper (str);  /* str is now: "ABCDé" */
Note
スクリプト API ではこの関数を利用できません。

3.2.9. weechat_strcasecmp

バージョン 1.0 で更新。

ロケールと大文字小文字を無視して文字列を比較。

プロトタイプ:

int weechat_strcasecmp (const char *string1, const char *string2);

引数:

  • string1: 1 番目の比較対象の文字列

  • string2: 2 番目の比較対象の文字列

戻り値:

  • string1 < string2 の場合は -1

  • string1 == string2 の場合は 0

  • string1 > string2 の場合は 1

C 言語での使用例:

int diff = weechat_strcasecmp ("aaa", "CCC");  /* == -2 */
Note
スクリプト API ではこの関数を利用できません。

3.2.10. weechat_strcasecmp_range

WeeChat バージョン 0.3.7 以上で利用可。バージョン 1.0 で更新。

大文字小文字を無視する文字範囲の幅を使い、ロケールと大文字小文字を無視して文字列を比較。

プロトタイプ:

int weechat_strcasecmp_range (const char *string1, const char *string2, int range);

引数:

  • string1: 1 番目の比較対象の文字列

  • string2: 2 番目の比較対象の文字列

  • range: 大文字小文字を無視する文字範囲の幅、例:

    • 26: "A-Z" を "a-z" のように変換して比較

    • 29: "A-Z [ \ ]" を "a-z { | }" のように変換して比較

    • 30: "A-Z [ \ ] ^" を "a-z { | } ~" のように変換して比較

Note
29 と 30 は IRC など一部のプロトコルで使います。

戻り値:

  • string1 < string2 の場合は -1

  • string1 == string2 の場合は 0

  • string1 > string2 の場合は 1

C 言語での使用例:

int diff = weechat_strcasecmp_range ("nick{away}", "NICK[away]", 29);  /* == 0 */
Note
スクリプト API ではこの関数を利用できません。

3.2.11. weechat_strncasecmp

バージョン 1.0 で更新。

ロケールと大文字小文字を無視して max 文字だけ文字列を比較。

プロトタイプ:

int weechat_strncasecmp (const char *string1, const char *string2, int max);

引数:

  • string1: 1 番目の比較対象の文字列

  • string2: 2 番目の比較対象の文字列

  • max: 比較する文字数の最大値

戻り値:

  • string1 < string2 の場合は -1

  • string1 == string2 の場合は 0

  • string1 > string2 の場合は 1

C 言語での使用例:

int diff = weechat_strncasecmp ("aabb", "aacc", 2);  /* == 0 */
Note
スクリプト API ではこの関数を利用できません。

3.2.12. weechat_strncasecmp_range

WeeChat バージョン 0.3.7 以上で利用可。バージョン 1.0 で更新。

大文字小文字を無視する文字範囲の幅を使い、ロケールと大文字小文字を無視して max 文字だけ文字列を比較。

プロトタイプ:

int weechat_strncasecmp_range (const char *string1, const char *string2, int max, int range);

引数:

  • string1: 1 番目の比較対象の文字列

  • string2: 2 番目の比較対象の文字列

  • max: 比較する文字数の最大値

  • range: 大文字小文字を無視する文字範囲の幅、例:

    • 26: "A-Z" を "a-z" のように変換して比較

    • 29: "A-Z [ \ ]" を "a-z { | }" のように変換して比較

    • 30: "A-Z [ \ ] ^" を "a-z { | } ~" のように変換して比較

Note
29 と 30 は IRC など一部のプロトコルで使います。

戻り値:

  • string1 < string2 の場合は -1

  • string1 == string2 の場合は 0

  • string1 > string2 の場合は 1

C 言語での使用例:

int diff = weechat_strncasecmp_range ("nick{away}", "NICK[away]", 6, 29);  /* == 0 */
Note
スクリプト API ではこの関数を利用できません。

3.2.13. weechat_strcmp_ignore_chars

バージョン 1.0 で更新。

一部の文字列を無視して、ロケールに依存して (オプションで大文字小文字の区別をしない) 文字列を比較。

プロトタイプ:

int weechat_strcmp_ignore_chars (const char *string1, const char *string2,
                                 const char *chars_ignored,
                                 int case_sensitive);

引数:

  • string1: 1 番目の比較対象の文字列

  • string2: 2 番目の比較対象の文字列

  • chars_ignored: 無視する文字

  • case_sensitive: 大文字小文字を区別して比較する場合は 1、区別しない場合は 0

戻り値:

  • string1 < string2 の場合は -1

  • string1 == string2 の場合は 0

  • string1 > string2 の場合は 1

C 言語での使用例:

int diff = weechat_strcmp_ignore_chars ("a-b", "--a-e", "-", 1);  /* == -3 */
Note
スクリプト API ではこの関数を利用できません。

3.2.14. weechat_strcasestr

ロケールと大文字小文字を区別して文字列を検索。

プロトタイプ:

char *weechat_strcasestr (const char *string, const char *search);

引数:

  • string: 文字列

  • search: string 内を検索する文字

戻り値:

  • 見つかった文字列へのポインタ、見つからない場合は NULL

C 言語での使用例:

char *pos = weechat_strcasestr ("aBcDeF", "de");  /* result: pointer to "DeF" */
Note
スクリプト API ではこの関数を利用できません。

3.2.15. weechat_strlen_screen

WeeChat バージョン 0.4.2 以上で利用可。

UTF-8 文字列をスクリーン上に表示するために必要なスクリーン幅を返す。非表示文字を 1 文字として数えます (これが weechat_utf8_strlen_screen 関数との違いです)。

プロトタイプ:

int weechat_strlen_screen (const char *string);

引数:

  • string: 文字列

戻り値:

  • UTF-8 文字列をスクリーン上に表示するために必要なスクリーン幅

C 言語での使用例:

int length_on_screen = weechat_strlen_screen ("é");  /* == 1 */

スクリプト (Python) での使用例:

# プロトタイプ
length = weechat.strlen_screen(string)

# 例
length = weechat.strlen_screen("é")  # 1

3.2.16. weechat_string_match

バージョン 1.0 で更新。

文字列がマスクにマッチするか確認。

プロトタイプ:

int weechat_string_match (const char *string, const char *mask,
                          int case_sensitive);

引数:

  • string: 文字列

  • mask: ワイルドカード ("*") を含むマスク、各ワイルドカードは文字列中の 0 個またはそれ以上の文字にマッチします

  • case_sensitive: 大文字小文字を区別する場合は 1、区別しない場合は 0

Note
バージョン 1.0 以上では、ワイルドカードをマスクの内部で使うことが可能です (マスクの最初および最後だけではありません)。

戻り値:

  • マスクにマッチした場合は 1、それ以外は 0

C 言語での使用例:

int match1 = weechat_string_match ("abcdef", "abc*", 0);   /* == 1 */
int match2 = weechat_string_match ("abcdef", "*dd*", 0);   /* == 0 */
int match3 = weechat_string_match ("abcdef", "*def", 0);   /* == 1 */
int match4 = weechat_string_match ("abcdef", "*de*", 0);   /* == 1 */
int match5 = weechat_string_match ("abcdef", "*b*d*", 0);  /* == 1 */

スクリプト (Python) での使用例:

# プロトタイプ
match = weechat.string_match(string, mask, case_sensitive)

# 例s
match1 = weechat.string_match("abcdef", "abc*", 0)   # 1
match2 = weechat.string_match("abcdef", "*dd*", 0)   # 0
match3 = weechat.string_match("abcdef", "*def", 0)   # 1
match4 = weechat.string_match("abcdef", "*de*", 0)   # 1
match5 = weechat.string_match("abcdef", "*b*d*", 0)  # 1

3.2.17. weechat_string_expand_home

WeeChat バージョン 0.3.3 以上で利用可。

文字列が ~ から始まる場合はこれをホームディレクトリで置換。文字列が ~ から始まっていない場合は同じ文字列を返す。

プロトタイプ:

char *weechat_string_expand_home (const char *path);

引数:

  • path: パス

戻り値:

  • ~ から始まるパスをホームディレクトリで置換したパス (使用後には必ず "free" を呼び出して領域を開放してください)

C 言語での使用例:

char *str = weechat_string_expand_home ("~/file.txt");
/* result: "/home/xxx/file.txt" */
/* ... */
free (str);
Note
スクリプト API ではこの関数を利用できません。

3.2.18. weechat_string_remove_quotes

文字列の最初と最後から引用符号を削除 (最初の引用符号の前と最後の引用符号の後にある空白文字は無視)。

プロトタイプ:

char *weechat_string_remove_quotes (const char *string, const char *quotes);

引数:

  • string: 文字列

  • quotes: 引用符号のリストを含む文字列

戻り値:

  • 最初と最後から引用符号を削除した文字列 (使用後には必ず "free" を呼び出して領域を開放してください)

C 言語での使用例:

char *str = weechat_string_remove_quotes (string, " 'I can't' ", "'");
/* result: "I can't" */
/* ... */
free (str);
Note
スクリプト API ではこの関数を利用できません。

3.2.19. weechat_string_strip

文字列の最初と最後から文字を削除する。

プロトタイプ:

char *weechat_string_strip (const char *string, int left, int right,
                            const char *chars);

引数:

  • string: 文字列

  • left: 0 以外の場合は左側の文字を削除

  • right: 0 以外の場合は右側の文字を削除

  • chars: 削除する文字を含む文字列

戻り値:

  • 文字を削除した文字列 (使用後には必ず "free" を呼び出して領域を開放してください)

C 言語での使用例:

char *str = weechat_string_strip (".abc -", 0, 1, "- .");  /* result: ".abc" */
/* ... */
free (str);
Note
スクリプト API ではこの関数を利用できません。

3.2.20. weechat_string_convert_escaped_chars

WeeChat バージョン 1.0 以