![](/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.