Модифицированный интерпретатор Lua не поддерживает историю команд - PullRequest
1 голос
/ 26 июня 2019

Я модифицировал интерпретатор Lua в C ++ для работы с другими библиотеками. Проблема заключается в том, что он работает как терминал, но вы не можете использовать функцию, так же как и клавиши со стрелками для поиска предыдущих команд и т. Д.

Код похож на: http://www.wesnoth.org/devdocs/lua_8cpp_source.html с проблемой в функциях pushline (строка 259) и loadline (строка 280) Я думаю. АВТОРСКИЕ ПРАВА УВАЖАЮЩИХ ЛЮДЕЙ.

static int pushline (lua_State *L, int firstline) {
char buffer[LUA_MAXINPUT]; /* and using char affects the result as arrow UP keys is shown as ^[[A */
char *b = buffer;
size_t l;
const char *prmt = get_prompt(L, firstline);
int readstatus = lua_readline(L, b, prmt); /*readline does not accept arrow key but its characters */
lua_pop(L, 1); 
if (readstatus == 0)
    return 0; 
l = strlen(b);
if (l > 0 && b[l-1] == '\n') 
   b[l-1] = '\0'; 
if (firstline && b[0] == '=') 
    lua_pushfstring(L, "return %s", b+1);  
else
    lua_pushstring(L, b);
lua_freeline(L, b);
return 1;
}

static int loadline (lua_State *L) {
int status;
lua_settop(L, 0);
if (!pushline(L, 1))
    return -1;  
for (;;) {  
    size_t l;
    const char *line = lua_tolstring(L, 1, &l);
    status = luaL_loadbuffer(L, line, l, "=stdin"); /* I think the error is using stdin */
        if (!incomplete(L, status)) break;  
        if (!pushline(L, 0))  
            return -1;
    lua_pushliteral(L, "\n");  
    lua_insert(L, -2);  
    lua_concat(L, 3);  
    }
lua_saveline(L, 1);
lua_remove(L, 1);  
return status;
}

Ожидаемый результат:

 >> foo = 3 /*press enter after typing */
 >> /* pressing arrow keys should show 'foo = 3' or pressing down key should show the current typed words */ 

Реальная продукция:

 >> foo = 3 /*press enter after typing */
 >> /* pressing arrow keys should shows '^[[A' or pressing down key shows '^[[D' */ 

Понятия не имею, как это сделать. Я думал об использовании getch или getchar, но это не работает. ncurses хорошая идея? Кодовый ответ с объяснением очень помог бы мне! Кроме того, ссылки на документы для любой соответствующей документации по используемой функции.

...