C 如何以终端不可知的方式正确打印带有terminfo的特殊密钥序列?

C 如何以终端不可知的方式正确打印带有terminfo的特殊密钥序列?,c,curses,terminfo,C,Curses,Terminfo,我试图模拟一个用户,按下诸如、、等特殊键。我听说curses/terminfo可能有助于以与终端无关的方式实现这一点,但当我尝试(使用下面的代码)打印第一个字符串“text”,然后将键置于左序列时,我没有得到(使用“|”作为光标)“tex | t”,而是“textD”。为什么?如何正确地做到这一点 #include <term.h> #include <stdio.h> static void putf(const char *name) { putp(name);

我试图模拟一个用户,按下诸如
等特殊键。我听说curses/terminfo可能有助于以与终端无关的方式实现这一点,但当我尝试(使用下面的代码)打印第一个字符串“text”,然后将
键置于左
序列时,我没有得到(使用
“|”
作为光标)
“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;
}
#包括
#包括
静态无效putf(常量字符*名称){
putp(姓名);
fflush(stdout);
}
int main(int argc,字符**argv){
setupterm((char*)0,1,(int*)0);
printf(“文本”);
fflush(stdout);
putf(左键);
//挂起,直到用户输入
fgetc(stdin);
返回0;
}
请注意,虽然我可以使用诅咒,但在我的用例中ncurses是不可接受的。
另外,请注意,我不想使用类似于
initscr()
,将当前终端屏幕替换为空白屏幕的东西,这不是一种理想的行为。

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


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

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


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

键序列不是光标移动命令。您不应该输出它们,只在输入中检测它们。我正在实现自己的读线,我需要以某种方式呈现编辑命令,以根据当前终端类型和设置转义序列。如果您想将光标向左移动,请使用
cursor\u left
,而不是
key\u left
。有关更多命令,请参见
man terminfo
。这是我可以接受的答案:)谢谢!键序列不是光标移动命令。您不应该输出它们,只在输入中检测它们。我正在实现自己的读线,我需要以某种方式呈现编辑命令,以根据当前终端类型和设置转义序列。如果您想将光标向左移动,请使用
cursor\u left
,而不是
key\u left
。有关更多命令,请参见
man terminfo
。这是我可以接受的答案:)谢谢!