Readline(libedit)非标准输入

时间:2012-07-02 09:50:11

标签: c autocomplete lua readline

我尝试为游戏中的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的控制台模拟器中还有另一种简单的自动完成和历史记录方法吗?

1 个答案:

答案 0 :(得分:0)

如果您仍然遇到libedit问题,请查看linenoise

相关问题