stty en el antiguo AT&T Unix: ¿cómo agregar la tecla End para "fin de línea"?

stty en el antiguo AT&T Unix: ¿cómo agregar la tecla End para "fin de línea"?

¿Cómo puedo usar la combinación de teclado ctrl+ een modo emacs para ir al final de la línea, pero también poder usar la Endtecla para hacer lo mismo? ¿Cómo configuro eso con stty? Probé esta combinación copiada desde la terminal de Linux:

stty eol M-^?

pero cuando presiono Endme sale Fel teclado.

El sistema es el antiguo ATT System V en la terminal minicom. Mi término es 386AT y esta es la definición de 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,   

Respuesta1

Esa eolconfiguración no es para la clave que lo llevaría al final de algún buffer de edición de línea, es una configuración de la disciplina de línea tty.

Es por su editor de líneas muy básico, el que se usa al ingresar entradas para aplicaciones (como cat, sed) que no tienen su propio editor de líneas. Ese editor no tiene posicionamiento del cursor, el únicoediciónlo que puede hacer es mediante retroceso ( stty erase), Ctrl+W ( stty werase) y Ctrl+U ( stty kill) posiblemente más en algunos sistemas.

Se hace en el propio controlador del dispositivo tty en el kernel, las aplicaciones ( cat, sed...) no ven esos caracteres.

La eolconfiguración es solo para indicarle al controlador que reconozca un carácter diferente (adicional) del salto de línea (también conocido como nueva línea ^J) como carácter de final de línea. Al ingresar ese carácter, la disciplina de línea enviaría los caracteres ingresados ​​hasta ese momento a la aplicación de lectura.

Por ejemplo, para ingresar texto palabra por palabra en lugar de línea por línea, puedes hacer lo siguiente:

stty eol ' '; cat

Y verá que cada vez que presione el espacio, cataparecerá el texto que ingresó (incluido ese carácter de espacio).

Si se encuentra en el símbolo de un comando que implementa su propio editor de línea, entonces Endmover el cursor al final del búfer actual no se haría a través sttyde la configuración específica de ese comando, sino mediante la configuración (si es que se realiza).

Por ejemplo, con el zshshell, eso se haría con:

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

Suponiendo que su terminal envía la secuencia de caracteres <ESC>[Fo <ESC>OFcuando presiona esa Endtecla como sugiere su "F".

Algunas aplicaciones se vincularán automáticamente Enda su acción de fin de línea. Para hacer eso, consultarán las bases de datos locales del terminal termcap o terminfo para averiguar qué secuencia de caracteres envía su terminal al presionar esa tecla.

Para eso utilizan la $TERMvariable. Si la entrada de esa clave en esa base de datos no coincide con lo que envía su terminal, entonces eso no funcionará.

Puedes probar:

tput kend | sed -n l

Para ver qué cosas envía la Endclave a la base de datos si su tput usa terminfo o verifique su entrada $TERM en /etc/termcap si usa termcap. Es posible que pueda encontrar una entrada allí que se acerque más al comportamiento de su minicom (o del emulador de terminal que lo aloja).

Editar según nueva información

Entonces, lo más probable es que esté ejecutando minicomuna xtermterminal moderna y comunicándose a través de serie. En el otro extremo de la línea serial, gettyse supone que está ejecutando una consola at386 (que creo que en realidad es el controlador de consola interno de los antiguos sistemas AT&T basados ​​en PC). Esto está muy lejos de un xterm moderno.

Si observamos un sistema Solaris que en muchos aspectos es tan moderno como su antiguo sistema AT&T, hay una xtermentrada en terminfo pero carece de kendcapacidad.

Lo que podría hacer es cargar la definición de terminfo de su terminal en la máquina en la que ejecuta minicom ( infocmp > file), transferirla a la máquina SysV e intentar compilarla allí tic(y establecerla $TERMen el mismo valor allí, configurar el TERMINFOentorno) . variable de antemano a algo como ~/.terminfosi no eres administrador allí). Si eso no funciona porque la versión de curses es demasiado antigua, puedes usar la entrada vt100 del sistema AT&T y simplemente editarla en kend=\EOFtu terminal, cambiar el nombre y usarla ticnuevamente.

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

Y añadir:

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

a su ~/.profile(¿dónde the-serial-deviceestá la ttysalida cuando inicia sesión a través de serie.

información relacionada