我尝试为游戏中的lua控制台制作自动完成和历史记录功能。我被建议使用readline库(其BSD模拟libedit,确切地说,但它有类似的apis和rl代码构建,略有标题更改),我选择lua-rlcompleter with history patches的lua绑定。历史很好,但我有readline函数的一些问题。对于自动完成,我需要将lua字符串传递给readline函数,但默认情况下此函数从stdin读取。我在将rl_instream更改为FILE *时发现solution。为此,我创建了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的控制台模拟器中还有另一种简单的自动完成和历史记录方法吗?