【发布时间】:2012-08-20 18:40:10
【问题描述】:
我的应用程序以原始模式从终端读取转义序列。当它在 xterm 上运行时,我得到了 F2,例如“\eOQ”。但是当它在 linux tty 终端中运行时(通过 Ctrl-Alt-F1 切换)我得到了“\e[[[B”。
确定我的 F2 独立于运行的终端类型应用程序的正确方法是什么?
【问题讨论】:
标签: terminal ansi-escape
我的应用程序以原始模式从终端读取转义序列。当它在 xterm 上运行时,我得到了 F2,例如“\eOQ”。但是当它在 linux tty 终端中运行时(通过 Ctrl-Alt-F1 切换)我得到了“\e[[[B”。
确定我的 F2 独立于运行的终端类型应用程序的正确方法是什么?
【问题讨论】:
标签: terminal ansi-escape
如果您想阅读终端按键,您可能想查看类似 libtermkey 的内容,它可以为您抽象出一般问题。在内部,它使用terminfo 查找的组合,或用于修改按键的扩展xterm 类模型的硬编码知识,因此它可以理解诸如Ctrl-Up 之类的东西,而常规的curses/etc...不能。
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");
}
【讨论】:
libtermkey 的全部意义在于抽象出那些原始转义序列,并为您提供数据结构(即TermKeyKey 结构)来表示按键。
好的,因为我得到了使用 [n]curses 库的最佳方法。它是读取 terminfo (termcap) 数据库并确定您获得的平均转义序列取决于终端类型。
没有必要使用它的终端图形功能。要使用 curses 获得正确的转义序列,您可以执行以下操作:
newterm(NULL, stdout, stdin);
此外,它可能是通过在您的应用程序中读取 terminfo 数据库来手动完成的。
raw();
noecho();
keypad();
ch = getch();
if (ch == KEY_F(2)) printf("Got F2");
endwin();
【讨论】: