繁体   English   中英

Terminfo:左箭头映射到默认OSX终端上的退格代码(8)。 为什么会这样呢? 以及如何改变呢?

[英]Terminfo: left arrow is mapped to backspace code (8) on default OSX terminal. Why is it so? And how to change it?

我正在编写简单的终端程序,因此我试图了解一些有关控制符号,转义序列以及与terminfo和termios的关系的基本知识。

我觉得很尴尬的是,根据我从tty中获得的输入,并根据tput左键,将其映射到Backspace代码(ASCII代码8)

tput cub1 | od -tx1
0000000    08                                                            
0000001

而我希望它是\\033[D因为

$ tput cuf1 | od -tx1
0000000    1b  5b  43                                                    
0000003

根据有关终端代码的各种文档,它确实是正确的键\\033[C代码。

因此,这里没有对称性使我很困惑。 其背后是否有特定原因?

第二个问题:有没有办法改变它?

我创建了原始终端的示例来演示此行为: RawTerminal

cub1功能不是左箭头 ,而是光标移动功能。 参考terminfo(5) ,您可能会发现

   cursor_left               cub1   le   move left one space

它的名称类似于标记为“左箭头”的

   key_left                  kcub1  kl   left-arrow key

光标移动功能可以做到这一点:在屏幕上四处移动光标。 在某些情况下,名称相似的光标移动和光标键具有相同的字符串,这是因为(很久以前)拥有可以设置为在本地回显(而不是发送到主机应用程序)的键很有用。

在这种特殊情况下,两者是不同的,因为这些终端描述的主要用途是用于curses应用程序,这可以最大程度地减少发送到屏幕的字符数量(并减少发送字符所花费的时间)。 使cub1发送ASCII退格符比转义序列少。

尽管没有要求,但是长期的约定告诉您,以“ k”开头的terminfo功能可能适用于键盘。

bash使用readline读取键并更新您正在键入的行。 检查它的源代码,例如从bash-4.2来的我正在看lib / readline / terminal.c,它有一个termcap字符串表,它可以使用:

    static const struct _tc_string tc_strings[] =
    {
      { "@7", &_rl_term_at7 },
      { "DC", &_rl_term_DC },
      { "IC", &_rl_term_IC },
      { "ce", &_rl_term_clreol },
      { "cl", &_rl_term_clrpag },
      { "cr", &_rl_term_cr },
      { "dc", &_rl_term_dc },
      { "ei", &_rl_term_ei },
      { "ic", &_rl_term_ic },
      { "im", &_rl_term_im },
      { "kD", &_rl_term_kD },        /* delete */
      { "kH", &_rl_term_kH },        /* home down ?? */
      { "kI", &_rl_term_kI },        /* insert */
      { "kd", &_rl_term_kd },
      { "ke", &_rl_term_ke },        /* end keypad mode */
      { "kh", &_rl_term_kh },        /* home */
      { "kl", &_rl_term_kl },
      { "kr", &_rl_term_kr },
      { "ks", &_rl_term_ks },        /* start keypad mode */
      { "ku", &_rl_term_ku },
      { "le", &_rl_term_backspace },
      { "mm", &_rl_term_mm },
      { "mo", &_rl_term_mo },
      { "nd", &_rl_term_forward_char },
      { "pc", &_rl_term_pc },
      { "up", &_rl_term_up },
      { "vb", &_rl_visible_bell },
      { "vs", &_rl_term_vs },
      { "ve", &_rl_term_ve },
    };

使用“ infocmp -Cr xterm”,我可以看到:

xterm|xterm terminal emulator (X Window System):\
        :am:bs:km:mi:msn:\
        :co#80:it#8:li#24:\
        :AL=\E[%dLC=\E[%dPL=\E[%dMO=\E[%dB:IC=\E[%d@:\
        :K2=\EOE:LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:\
        :UP=\E[%dA:ae=\E(B:al=\E[L:as=\E(0:bl=^G:bt=\E[Z:cd=\E[J:\
        :ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:\
        :cs=\E[%i%d;%dr:ct=\E[3gc=\E[Pl=\E[Mo=^J:ec=\E[%dX:\
        :ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[!p\E[?3;4l\E[4l\E>:\
        :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\
        :k7=\E[18~:k8=\E[19~:k9=\E[20~:kD=\E[3~:kI=\E[2~:kN=\E[6~:\
        :kP=\E[5~:kb=\177:kd=\EOB:ke=\E[?1l\E>:kh=\EOH:kl=\EOD:\
        :kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:\
        :me=\E[0m:mh=\E[2m:mm=\E[?1034h:mo=\E[?1034l:mr=\E[7m:\
        :nd=\E[C:rc=\E8:sc=\E7:se=\E[27m:sf=^J:so=\E[7m:sr=\EM:\
        :st=\EH:ta=^I:te=\E[?1049l:ti=\E[?1049h:ue=\E[24m:up=\E[A:\
        :us=\E[4m:vb=\E[?5h\E[?5l:ve=\E[?12l\E[?25h:vi=\E[?25l:\
        :vs=\E[?12;25h:

或使用“ infocmp -Cr nsterm”:

nsterm|Apple_Terminal|AppKit Terminal.app:\
        :am:hs:mi:msno:\
        :co#80:it#8:li#24:ws#50:\
        :AL=\E[%dLC=\E[%dPL=\E[%dMO=\E[%dB:IC=\E[%d@:\
        :K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:K5=\EOn:LE=\E[%dD:\
        :RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:bl=^G:cd=\E[J:\
        :ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
        :ct=\E[3gc=\E[Pl=\E[Mo=^Js=\E]2;\007:ei=\E[4l:\
        :fs=^G:ho=\E[H:ic=\E[@:im=\E[4h:k1=\EOP:k2=\EOQ:k3=\EOR:\
        :k4=\EOS:k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:\
        :k9=\E[20~:kD=\E[3~:kN=\E[6~:kP=\E[5~:kb=\177:kd=\EOB:\
        :ke=\E[?1l\E>:kh=\EOH:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
        :ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:me=\E[0m:mh=\E[2m:\
        :mr=\E[7m:nd=\E[C:rc=\E8:\
        :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:sc=\E7:se=\E[m:\
        :sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:te=\E[2J\E[?47l\E8:\
        :ti=\E7\E[?47h:ts=\E]2;:ue=\E[m:up=\E[A:us=\E[4m:\
        :vb=\E[?5h\E[?5l:ve=\E[?25h:vi=\E[?25l:

“:le = ^ H:”部分就是您所看到的。

从(ncurses)terminfo(5):

   cursor_left                   cub1       le        move left one space

如果您将termcap(用于“ xterm”)设置为\\ e [D,则bash应该回显\\e[D而不是^H 但是ncurses使用^H将字符数从3( \\e[D )减少到1( ^H

而不是修改终端描述,您应该修改程序,例如,读取termcap字符串并进行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM