簡體   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