确定与终端类型无关的转义序列

时间:2012-08-19 22:56:25

标签: terminal ansi-escape

我的应用程序在原始模式下从终端读取转义序列。当它在xterm上运行时,我得到了像“\ eOQ”的F2。但是当它在linux tty终端中运行时(通过Ctrl-Alt-F1切换)我得到了“\ e [[[B”。
确定我是否在运行终端类型应用程序时独立于F2的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您想阅读终端按键,您可能希望查看类似libtermkey的内容,它会为您解决一般问题。在内部,它使用terminfo查找的组合,或者对已修改的按键的扩展xterm类似模型的硬编码知识,因此它可以理解Ctrl-Up之类的常规curses /等内容。 ..不能。

while((ret = termkey_waitkey(tk, &key)) != TERMKEY_RES_EOF) {
  termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_VIM);
  printf("You pressed key %s\n", buffer);

  if(key.type == TERMKEY_TYPE_FUNCTION &&
     !key.modifiers &&
     key.code.number = 2)
    printf("Got F2\n");
}

答案 1 :(得分:0)

好的,因为我得到了使用[n] curses库的最佳方法。它是读取terminfo(termcap)数据库并确定您依赖于终端类型的转义序列。 没有必要使用它的终端图形功能。要使用curses获取正确的转义序列,您可以执行以下操作: newterm(NULL, stdout, stdin);
raw();
noecho();
keypad();
ch = getch();
if (ch == KEY_F(2)) printf("Got F2");
endwin();
此外,它可能通过在您的app中读取terminfo数据库来手动完成。