![](/img/trans.png)
[英]In OSX 10.9, Apache is using a different php.ini then terminal. How do I change which one terminal uses?
[英]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.