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

1

Como eu posso usar a combinação de teclado ctrl + e no modo emacs para ir até o final da linha, mas também ser capaz de usar o Fim Tecla 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 End recebo F no teclado.

O sistema é 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,   
    
por elbarna 18.05.2016 / 17:38

1 resposta

5

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

É pelo seu editor de linhas muito básico, aquele usado ao inserir entrada para aplicativos (como cat , sed ) que não possuem seu próprio editor de linhas. Esse editor não tem posicionamento de cursor, a única edição que ele pode fazer é 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 vêem esses caracteres.

A configuração eol é apenas para informar que o driver reconhece um caractere diferente (adicional) do avanço de linha (aka newline aka ^J ) como o caractere de término de linha. Ao inserir esse caractere, a disciplina de linha enviaria os caracteres inseridos até o aplicativo de leitura.

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

stty eol ' '; cat

E você veria que cada vez que você pressionasse espaço, cat produziria o texto digitado (incluindo esse caractere de espaço).

Se você está no prompt de um comando que implementa seu próprio editor de linhas, fazer End mover o cursor para o final do buffer atual não seria feito via stty , mas por configuração específica desse comando (se houver).

Por exemplo, com o shell zsh , isso seria feito com:

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

Assumindo que seu terminal envia a seqüência de caracteres <ESC>[F ou <ESC>OF quando você pressiona a tecla End como seu "F" sugere.

Algumas aplicações ligam automaticamente End à sua ação _end-of_line_. Para isso, eles consultam os bancos de dados de terminais termcap ou terminfo locais para descobrir qual sequência de caracteres seu terminal envia quando pressiona a tecla.

Para isso, eles usam a variável $TERM . Se a entrada para aquela chave naquele banco de dados não corresponder ao que o seu terminal envia, então isso não funcionará.

Você pode tentar:

tput kend | sed -n l

Para ver o que as coisas do banco de dados a chave End envia se seu tput usa terminfo ou verifica sua entrada $ TERM em / etc / termcap se estiver usando termcap. Você pode encontrar uma entrada que corresponda melhor ao seu comportamento do minicom (ou do emulador de terminal que o hospeda).

Editar com base em novas informações

Portanto, o mais provável é que você esteja executando minicom em um terminal xterm -like moderno e se comunicando por serial. Na outra extremidade da linha serial, getty assume que você está executando um console at386 (que, na minha opinião, é o driver do console interno dos antigos sistemas AT & T baseados em PC). Isso está muito longe de um xtermo moderno.

Olhando para um sistema Solaris aqui que, em muitos aspectos, é tão moderno quanto seu antigo sistema AT & T, há uma entrada xterm no terminfo, mas não possui a capacidade kend .

O que você pode fazer é carregar a definição terminográfica do seu terminal na máquina em que você executa o minicom ( infocmp > file ), transferi-lo para a máquina SysV e tentar compilá-lo com tic (e set $TERM com o mesmo valor de lá, defina a variável de ambiente TERMINFO de antemão para algo como ~/.terminfo se você não for administrador lá). Se isso não funcionar, porque a versão curses é muito antiga, você poderia usar a entrada vt100 do sistema AT & T, e apenas editar no kend=\EOF do seu terminal, mudar o nome e usar tic novamente.

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-device é o que quer que tty produza quando você faz o login pela serial.

    
por 18.05.2016 / 18:12