旧 AT&T unix 上的 stty:如何添加“行结束”的结束键?

旧 AT&T unix 上的 stty:如何添加“行结束”的结束键?

如何在 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 设备驱动程序本身中完成的,应用程序(catsed...)看不到这些字符。

eol设置只是告诉驱动程序将换行符(又名换行符,又名换行符^J)中的不同(附加)字符识别为行结束字符。输入该字符后,线路规则会将目前输入的字符发送到阅读应用程序。

例如,要一次输入一个单词而不是一次一行输入文本,您可以这样做:

stty eol ' '; cat

您会看到每次按空格时,cat都会输出您输入的文本(包括空格字符)。

如果您处于实现其自己的行编辑器的命令的提示符处,则将End光标移动到当前缓冲区的末尾将不会通过stty而是通过该命令的特定配置(如果有的话)来完成。

例如,对于zshshell,可以通过以下方式完成:

bindkey '^[[F' end-of-line
bindkey '^[OF' end-of-line

假设当您按照“F”的建议按下该键时,您的终端发送<ESC>[F或字符序列。<ESC>OFEnd

某些应用程序会自动绑定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 系统一样现代,xtermterminfo 中有一个条目,但它缺乏该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

相关内容