如何在 emacs 模式下使用ctrl+e键盘组合转到行尾,同时也能够使用 键End执行相同操作?我如何用 stty 设置它?我尝试过从 linux 终端复制的组合:
stty eol M-^?
但是当我按下时End我就进入了F
键盘。
该系统是 minicom 终端上的旧 ATT System V。我的术语是 386AT,这是 terminfo 定义
# Reconstructed via infocmp from file: /usr/share/lib/terminfo/3/386AT
AT386|at386|386AT|386at|at/386 console @(#)386.ti 1.4,
am, bw, eo, xon,
colors#8, cols#80, lines#25, ncv#3, pairs#64,
acsc=``aaffggjYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~,
bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H,
cr=\r, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB,
cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%02d;%p2%02dH, cuu=\E[%p1%dA, cuu1=\E[A,
dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[1M,
ed=\E[J, el=\E[K, flash=^G, home=\E[H, ht=\t,
ich=\E[%p1%d@, ich1=\E[1@, il=\E[%p1%dL, il1=\E[1L,
ind=\E[S, indn=\E[%p1%dS, invis=\E[9m, is2=\E[0;10m,
kbs=\b, kcbt=^], kclr=\E[2J, kcub1=\E[D, kcud1=\E[B,
kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kend=\E[Y,
kf1=\EOP, kf10=\EOY, kf11=\EOZ, kf12=\EOA, kf2=\EOQ,
kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV,
kf8=\EOW, kf9=\EOX, khome=\E[H, kich1=\E[@, knp=\E[U,
kpp=\E[V, krmir=\E0, op=\E[0m,
pfx=\EQ%p1%{1}%-%d'%p2%s', rev=\E[7m, rin=\E[S,
rmacs=\E[10m, rmso=\E[m, rmul=\E[m, setab=\E[4%p1%dm,
setaf=\E[3%p1%dm,
setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
sgr=\E[10m\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;%?%p9%t;12%;%?%p7%t;9%;m,
sgr0=\E[0;10m, smacs=\E[12m, smso=\E[7m, smul=\E[4m,
答案1
该eol
设置不是用于将您带到某些行编辑缓冲区末尾的键,而是 tty 行规则的设置。
它适用于其非常基本的行编辑器,即为没有自己的行编辑器的应用程序(如cat
、 )输入输入时使用的编辑器。sed
该编辑器没有光标定位,唯一的编辑它可以通过退格键 ( stty erase
)、Ctrl+W ( stty werase
) 和 Ctrl+U ( stty kill
) 执行,在某些系统上可能更多。
它是在内核中的 tty 设备驱动程序本身中完成的,应用程序(cat
,sed
...)看不到这些字符。
该eol
设置只是告诉驱动程序将换行符(又名换行符,又名换行符^J
)中的不同(附加)字符识别为行结束字符。输入该字符后,线路规则会将目前输入的字符发送到阅读应用程序。
例如,要一次输入一个单词而不是一次一行输入文本,您可以这样做:
stty eol ' '; cat
您会看到每次按空格时,cat
都会输出您输入的文本(包括空格字符)。
如果您处于实现其自己的行编辑器的命令的提示符处,则将End光标移动到当前缓冲区的末尾将不会通过stty
而是通过该命令的特定配置(如果有的话)来完成。
例如,对于zsh
shell,可以通过以下方式完成:
bindkey '^[[F' end-of-line
bindkey '^[OF' end-of-line
假设当您按照“F”的建议按下该键时,您的终端发送<ESC>[F
或字符序列。<ESC>OF
End
某些应用程序会自动绑定End到它们的_end-of_line_操作。为此,他们将查询本地 termcap 或 terminfo 终端数据库,以找出您的终端在按下该键时发送的字符序列。
为此,他们使用$TERM
变量。如果该数据库中该密钥的条目与您的终端发送的内容不匹配,则该操作将不起作用。
你可以试试:
tput kend | sed -n l
要查看密钥发送的数据库内容End(如果您的 tput 使用 terminfo)或检查 /etc/termcap 中的 $TERM 条目(如果使用 termcap)。您也许可以在那里找到与您的 minicom(或托管它的终端仿真器)行为更匹配的条目。
根据新信息进行编辑
因此,最有可能的是,您正在类似minicom
现代的终端中运行xterm
并通过串行进行通信。在串行线的另一端,getty
假设您正在运行 at386 控制台(我相信它实际上是旧的基于 PC 的 AT&T 系统的内部控制台驱动程序)。这与现代的 xterm 相差甚远。
看看这里的 Solaris 系统,它在许多方面与旧的 AT&T 系统一样现代,xterm
terminfo 中有一个条目,但它缺乏该kend
功能。
您可以做的是将终端的 terminfo 定义上传到运行 minicom 的计算机上 ( infocmp > file
),将其传输到 SysV 计算机,然后尝试在那里编译它tic
(并设置$TERM
为与那里相同的值,设置TERMINFO
环境变量事先设置为类似~/.terminfo
如果您不是那里的管理员)。如果由于curses版本太旧而不起作用,您可以使用AT&T系统的vt100条目来代替,只需在kend=\EOF
终端中编辑,更改名称并tic
再次使用即可。
喜欢:
cat > my-term.info << \EOF
my-term|My VT100 compatible terminal with an end-key,
am, mir, msgr, xenl, xon,
cols#80, it#8, lines#24, vt#3,
acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
clear=\E[H\E[J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
cub=\E[%p1%dD, cub1=\b, cud=\E[%p1%dB, cud1=\n,
cuf=\E[%p1%dC, cuf1=\E[C$<2>,
cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>,
el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=\t,
hts=\EH, ind=\n, ka1=\EOq, ka3=\EOs, kb2=\EOr, kbs=\b,
kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB,
kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy, kf1=\EOP,
kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, rc=\E8,
rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmkx=\E[?1l\E>,
rmso=\E[m$<2>, rmul=\E[m$<2>,
rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e^O%;,
sgr0=\E[m^O$<2>, smacs=^N, smkx=\E[?1h\E=,
smso=\E[1;7m$<2>, smul=\E[4m$<2>, tbc=\E[3g, kend=\EOF
EOF
TERMINFO="$HOME/.terminfo" export TERMINFO
mkdir -p "$TERMINFO"
tic my-term.info
并添加:
if [ "`tty`" = "the-serial-device" ] && [ "$TERM" = at386 ]; then
TERMINFO=$HOME/.terminfo
TERM=my-term
export TERM TERMINFO
fi
到你的~/.profile
(当你通过串行登录时,the-serial-device
任何输出都在哪里。tty