¿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 F
el 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 eol
configuració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 eol
configuració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, cat
aparecerá 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 stty
de la configuración específica de ese comando, sino mediante la configuración (si es que se realiza).
Por ejemplo, con el zsh
shell, 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>[F
o <ESC>OF
cuando 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 $TERM
variable. 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 minicom
una xterm
terminal moderna y comunicándose a través de serie. En el otro extremo de la línea serial, getty
se 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 xterm
entrada en terminfo pero carece de kend
capacidad.
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 $TERM
en el mismo valor allí, configurar el TERMINFO
entorno) . variable de antemano a algo como ~/.terminfo
si 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=\EOF
tu terminal, cambiar el nombre y usarla tic
nuevamente.
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-device
está la tty
salida cuando inicia sesión a través de serie.