ゲーム内 lua コンソールのオートコンプリートと履歴機能を作成しようとしています。readline ライブラリ (正確には BSD アナログ libedit ですが、同様の API と rl-code ビルドがあり、ヘッダーがわずかに変更されています) を使用するよう提案されました。履歴はうまく機能しますが、readline 機能に問題があります。オートコンプリートのために、lua 文字列を readline 関数に渡す必要がありますが、デフォルトのこの関数は stdin から読み取ります。rl_instream を FILE* に変更することで解決策を見つけました。この目的のために、tmpfile を作成して書き込みます。しかし、それは奇妙に動作します。この方法で文字列を読み取ると、 readline は何も返しません。
// This definitions is just example, not working code
// it shows the environment
static FILE *tempfile = tmpfile();
rl_instream = tempfile;
rl_initialize();
static int lreadline(lua_State *L)
{
const char *prompt = lua_tostring(L, 1);
char *line;
if(rl_instream == NULL)
// In case we using stdin
line = readline(prompt);
else{
fputs(prompt, tempfile);
/* maybe I need a fseek here? It not helps though.
* fseek(tempfile, -strlen(prompt), SEEK_CUR);
*/
line = readline(NULL);
}
lua_pushstring(L, line);
free(line);
return 1;
}
何が起こっているのかわかりませんが、 readline 関数のファイル内の読み取り位置に何らかの関係があるのではないかと思います。libedit のソースを読み取ろうとしましたが、コードが期待どおりに機能しない理由がわかりません。Eclipse を使用した共有ライブラリのデバッグに問題があるため、これをデバッグできませんでしたが、純粋な gdb を使用する予定であり、それが役立つかどうかはわかりません。
また、私は間違っているかもしれません.luaベースのコンソールエミュレーターでオートコンプリートと履歴を取得する別の簡単な方法はありますか?