mecab-skkserv のテスト中、キー押下から反応が返ってくるまでやたら時間がかかる現象に陥ったことが一度あると前の記事に書いた。
調べてみると、この原因はまさに mecab-skkserv だった。発生する条件は、見出し語の編集中に Ctrl+I もしくは Tab を押す、つまり補完を開始するとそういう状態になる。
この補完機能は skkserv のプロトコルで言うと 4 に当たるのだけど、mecab-skkserv.cpp のメインループでそれに対応する応答を行っていないため、fcitx 側(正確には libskk)が応答を延々待ち続けることになるのだろう。知らないコマンドを無視する mecab-skkserv の問題とも言えるし、レスポンスを読む際にタイムアウトを考慮しない呼び出し側の問題とも言える。
--- mecab-skkserv-original.cpp 2020-01-17 17:37:19.897237779 +0900
+++ mecab-skkserv.cpp 2020-01-17 17:38:26.822432515 +0900
@@ -33,20 +33,10 @@
#include <stdexcept>
#include <set>
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
-#if defined HAVE_GETOPT_H && defined HAVE_GETOPT_LONG
-#include <getopt.h>
-#else
-#include "getopt.h"
-#endif
-
#define STDIN (fileno(stdin))
#define BUFSIZE 8192
#define DEFAULT_CAND_SIZE 20
@@ -155,6 +145,10 @@
case '3':
std::cout << "localhost:127.0.0.1: " << std::flush;
break;
+
+ case '4':
+ std::cout << '4' << std::endl;
+ break;
}
}
というわけで修正自体は数行付け足すだけでいいのだけど、このパッチを誰にどう投げればいいのかよく分からない。助けて偉い人。