首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terminfo:左箭头映射到默认OSX终端上的backspace代码(8)。为什么会这样呢?以及如何改变它?

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

Stack Overflow用户
提问于 2015-12-16 18:09:50
回答 1查看 340关注 0票数 0

我写的是简单的终端,所以我试着理解一些关于控制符号、转义序列的基本知识,以及它们是如何与termios和termios相关的。

我感到尴尬的是,根据我从tty获得的输入和tput,左键被映射到Backspace代码(ASCII代码8)。

代码语言:javascript
复制
tput cub1 | od -tx1
0000000    08                                                            
0000001

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

代码语言:javascript
复制
$ tput cuf1 | od -tx1
0000000    1b  5b  43                                                    
0000003

这就是\033[C码,根据各种有关终端代码的文件,它确实是正确的密钥。

所以这里不对称让我很困惑。这背后有什么具体原因吗?

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

我创建了raw终端示例,它演示了这种行为:RawTerminal

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-16 21:56:15

cub1功能不是左箭头,而是光标移动功能。提到终止(5),您可能会发现

代码语言:javascript
复制
   cursor_left               cub1   le   move left one space

它的命名类似于标记为“左箭头”的键:

代码语言:javascript
复制
   key_left                  kcub1  kl   left-arrow key

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

在这种情况下,这两种情况是不同的,因为这些终端描述的主要用途是用于诅咒应用程序,这些应用程序将发送到屏幕的字符数量最小化(以及最小化发送字符所花费的时间)。使cub1发送ASCII后空间比转义序列少。

虽然不需要,但长期的约定告诉您,以"k“开头的begin功能可能是用于键盘的。

bash使用readline读取键并更新正在键入的行。检查它的源代码,例如,从bash-4.2 (我正在查看lib/readline/intal.c),它有一个表,其中包含它可能使用的术语字符串:

代码语言:javascript
复制
    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 xterm",我可以看到以下内容:

代码语言:javascript
复制
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 nsterm":

代码语言:javascript
复制
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:“部分是你所看到的。

来自(国家诅咒)终止(5):

代码语言:javascript
复制
   cursor_left                   cub1       le        move left one space

如果您设置了一个术语(用于"xterm"),将其设置为\e[D,那么bash应该回显\e[D而不是^H。但是ncurses使用^H将字符数从3个(\e[D)减少到1个(^H)。

与其修改终端描述,不如修改程序,例如读取术语字符串并处理这些字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34319160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档