stty no antigo AT&T unix: como adicionar a tecla End para “fim de linha”?

stty no antigo AT&T unix: como adicionar a tecla End para “fim de linha”?

Como posso usar a combinação ctrl+ eteclado no modo emacs para ir até o final da linha, mas também poder usar a Endtecla para fazer o mesmo? Como faço para definir isso com stty? Eu tentei esta combinação copiada do terminal Linux:

stty eol M-^?

mas quando pressiono Endentro Fno teclado.

O sistema é o antigo ATT System V no terminal minicom. Meu termo é 386AT e esta é a definição 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,   

Responder1

Essa eolconfiguração não é para a chave que levaria você ao final de algum buffer de edição de linha, é uma configuração da disciplina de linha tty.

É por seu editor de linha muito básico, aquele usado ao inserir entradas para aplicativos (como cat, sed) que não possuem seu próprio editor de linha. Esse editor não possui posicionamento de cursor, o únicoediçãoisso pode ser feito através de backspace ( stty erase), Ctrl+W ( stty werase) e Ctrl+U ( stty kill) possivelmente mais em alguns sistemas.

Isso é feito no próprio driver de dispositivo tty no kernel, os aplicativos ( cat, sed...) não veem esses caracteres.

A eolconfiguração serve apenas para dizer ao driver para reconhecer um caractere diferente (adicional) do linefeed (também conhecido como nova linha ^J) como o caractere de final de linha. Ao inserir esse caractere, a disciplina de linha enviaria os caracteres inseridos até o momento para o aplicativo de leitura.

Por exemplo, para inserir uma palavra por vez no texto, em vez de uma linha por vez, você poderia fazer:

stty eol ' '; cat

E você veria que cada vez que você pressiona espaço, cato texto digitado será exibido (incluindo o caractere de espaço).

Se você estiver no prompt de um comando que implementa seu próprio editor de linha, mover Endo cursor para o final do buffer atual não seria feito por meio sttyde uma configuração específica desse comando (se for o caso).

Por exemplo, com o zshshell, isso seria feito com:

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

Supondo que seu terminal envie a sequência de caracteres <ESC>[Fou <ESC>OFquando você pressiona essa Endtecla, como sugere seu "F".

Alguns aplicativos serão vinculados automaticamente Endà ação _end-of_line_. Para fazer isso, eles consultarão os bancos de dados locais do terminal termcap ou terminfo para descobrir qual sequência de caracteres seu terminal envia ao pressionar a tecla.

Para isso, eles usam a $TERMvariável. Se a entrada dessa chave nesse banco de dados não corresponder ao que o seu terminal envia, isso não funcionará.

Podes tentar:

tput kend | sed -n l

Para ver o que o banco de dados Endenvia a chave se o seu tput usar terminfo ou verifique sua entrada $ TERM em /etc/termcap se estiver usando termcap. Você pode encontrar uma entrada que corresponda mais ao comportamento do seu minicom (ou do emulador de terminal que o hospeda).

Editar com base em novas informações

Então, provavelmente, você está executando minicomum xtermterminal moderno e se comunicando via serial. No outro extremo da linha serial, gettyassume que você está executando um console at386 (que acredito ser na verdade o driver interno do console de antigos sistemas AT&T baseados em PC). Isso está muito longe de ser um xterm moderno.

Olhando aqui para um sistema Solaris que em muitos aspectos é tão moderno quanto o seu antigo sistema AT&T, há uma xtermentrada em terminfo, mas falta-lhe a kendcapacidade.

O que você pode fazer é carregar a definição terminfo do seu terminal na máquina em que você executa o minicom ( infocmp > file), transferi-la para a máquina SysV e tentar compilá-la lá tic(e definir $TERMcom o mesmo valor de lá, definir o TERMINFOambiente variável antecipadamente para algo como ~/.terminfose você não for administrador lá). Se isso não funcionar porque a versão da maldição é muito antiga, você pode usar a entrada vt100 do sistema AT&T e apenas editar no kend=\EOFseu terminal, alterar o nome e usar ticnovamente.

Como:

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

E adicione:

if [ "`tty`" = "the-serial-device" ] && [ "$TERM" = at386 ]; then
  TERMINFO=$HOME/.terminfo
  TERM=my-term
  export TERM TERMINFO
fi

para o seu ~/.profile(onde the-serial-deviceestá o ttyresultado quando você faz login via serial.

informação relacionada