【问题标题】:Determine escape sequence independent from terminal type确定独立于终端类型的转义序列
【发布时间】:2012-08-20 18:40:10
【问题描述】:

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

【问题讨论】:

    标签: terminal ansi-escape


    【解决方案1】:

    如果您想阅读终端按键,您可能想查看类似 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");
    }
    

    【讨论】:

    • 是否可以按以下方式使用它:如果按下 F1-F9 键中的一个,那么我得到了一个常量或类似于您的示例的东西。但是,如果按下任何其他非字母数字键,例如F10-F12 我知道它的转义序列了吗?
    • 否; libtermkey 的全部意义在于抽象出那些原始转义序列,并为您提供数据结构(即TermKeyKey 结构)来表示按键。
    • 而且这个新结构没有产生它的序列?也许修补它以包含这些数据并不难?
    • 好吧,您可以轻松地再次创建转义序列,但原始输入数据现在已经丢失。
    • 能否请您解释一下如何重新创建转义序列?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      相关资源
      最近更新 更多