Как правильно печатать специальные последовательности клавиш с помощью terminfo терминально-независимым способом?

Я пытаюсь подражать пользователю, нажимая такие специальные клавиши, как <Left Arrow>, <Backspace>, <Delete> и так далее. Я слышал, что curses/terminfo может помочь сделать это не зависящим от терминала способом, но когда я пытаюсь (с помощью следующего кода) напечатать первую строку "text", а затем испустить key_left последовательность, я не получаю (с '|' как курсор) "tex|t", скорее "textD|", Зачем? Как это сделать правильно?

#include <term.h>
#include <stdio.h>

static void putf(const char *name) {
  putp(name);
  fflush(stdout);
}

int main(int argc, char **argv) {
  setupterm((char*)0, 1, (int*)0);

  printf("text");
  fflush(stdout);

  putf(key_left);

  // hang up until user input
  fgetc(stdin);

  return 0;
}

Пожалуйста, обратите внимание, хотя я в порядке с использованием curses, ncurses недопустим в моем случае использования. Кроме того, обратите внимание, что я не хочу использовать что-то вроде initscr(), заменяя текущий экран терминала пустым, это нежелательное поведение.

1 ответ

Решение

Escape-последовательности, отвечающие за перемещение курсора, и Escape-последовательности, связанные с клавишами со стрелками, обычно различны и не должны использоваться вместо друг друга. в terminfo базы данных, первые с префиксом cursor и последний с key,

Таким образом, чтобы переместить курсор влево, нужно использовать putp (cursor_left)не putp (key_left),

Другие вопросы по тегам