如何使用terminfo以终端无关的方式正确打印特殊键序列?

时间:2013-03-31 10:10:08

标签: c curses 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 个答案:

答案 0 :(得分:1)

负责光标移动的转义序列和与箭头键相关联的转义序列通常是不同的,不应相互使用。在terminfo数据库中,前者的前缀为cursor,后者的前缀为key

因此,要将光标向左移动,应使用putp (cursor_left),而不是putp (key_left)