** Nota: Hice esta misma pregunta en SuperUser, pero no obtuve ninguna respuesta. Ahora me doy cuenta de que este es un foro más apropiado para esta pregunta en particular. *
En un shell ksh, la tecla Eliminar no funciona adecuadamente en la línea de comando. Obtengo un ~ cuando presiono Eliminar.
Cómo puedo:
- enlazar la funcionalidad de "Eliminar el carácter en el cursor" al botón Eliminar del teclado? (Control-D se comporta como si esperara que el botón Eliminar funcionara y mis intentos de usar un alias no tuvieron éxito y probablemente fueron ingenuos).
- enlazar la funcionalidad de " Mover al primero de la línea" al botón de teclado de Inicio? (El Control A hace esto ahora, pero quiero que Home lo haga).
- enlazar la funcionalidad de " Mover al final de la línea " al botón Finalizar teclado? (El Control E hace esto ahora, pero quiero terminar para hacerlo).
Actualización final (?)
Me topé con algo que funciona, pero no entiendo por qué. Esto funciona:
bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward
De acuerdo con http://www.qnx.com/developers/docs/6.3.2/neutrino/utilities/k/ksh.html#bind ,
prefix-2
Key binding: ^X, ^[[
Introduces a 2-character command sequence.
Entonces, mi pregunta actualizada es ¿por qué necesito usar prefix-2
esto? Por favor, traduzca para mí para que pueda entenderlo y no tenga que molestar a todos nuevamente sobre esto.
LO ANTERIOR SIGUE
ACTUALIZAR
Resulta que ESC en QNX es ^[
. Usando el comando bind '^[[3~'='delete-char-backward'
puedo hacer que el cursor sobrescriba el carácter debajo del cursor con a ~
. Esto es algo de progreso al menos: ahora sé cómo deletrear Eliminar clave para el shell. La mayoría de las cosas que he visto en la web dicen que la clave de eliminación es ^?
, pero eso no parece funcionar para mí. Además, debo mencionar que estoy accediendo a esto a través de PuTTy.
No entiendo porque Control D hace lo que quiero que haga la clave de eliminación. Traté de vincularlo eot-or-delete
nuevamente en vano.
Esto debería ser simple, ¿verdad?
ACTUALIZACIÓN 2:
bind | grep prefix
^X = prefix-2
^[ = prefix-1
ÿ = prefix-3
^[O = prefix-2
^[[ = prefix-2
bind | grep '[^ -~]'
ÿ = prefix-3
à = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word
ACTUALIZACIÓN 3: Más de mi configuración
Ajuste ENV
echo $ENV
/etc/kshrc
BIND Salida completa
bind
^A = beginning-of-line
^B = backward-char
^C = abort
^D = eot-or-delete
^E = end-of-line
^F = forward-char
^G = abort
^H = delete-char-backward
^I = complete
^J = newline
^K = kill-to-eol
^L = redraw
^M = newline
^N = down-history
^O = newline-and-next
^P = up-history
^R = search-history
^T = transpose-chars
^U = kill-line
^V = version
^W = kill-region
^X = prefix-2
^Y = yank
^[ = prefix-1
^\ = no-op
^] = search-character-forward
^^ = quote
^_ = eot
^? = delete-char-backward
ÿ = prefix-3
^[^H = delete-word-backward
^[^X = complete-file
^[^[ = complete
^[^] = search-character-backward
^[ = set-mark-command
^[# = comment
^[* = expand-file
^[. = prev-hist-word
^[0 = set-arg
^[1 = set-arg
^[2 = set-arg
^[3 = set-arg
^[4 = set-arg
^[5 = set-arg
^[6 = set-arg
^[7 = set-arg
^[8 = set-arg
^[9 = set-arg
^[< = beginning-of-history
^[= = complete-list
^[> = end-of-history
^[? = list
^[C = capitalize-word
^[L = downcase-word
^[O = prefix-2
^[U = upcase-word
^[[ = prefix-2
^[_ = prev-hist-word
^[b = backward-word
^[c = capitalize-word
^[d = delete-word-forward
^[f = forward-word
^[g = goto-history
^[h = delete-word-backward
^[l = downcase-word
^[u = upcase-word
^[y = yank-pop
^[^? = delete-word-backward
^X^X = exchange-point-and-mark
^X^Y = list-file
^X^[ = complete-command
^X? = list-command
^XA = up-history
^XB = down-history
^XC = forward-char
^XD = backward-char
^XH = beginning-of-line
^XP = delete-char-forward
^XY = end-of-line
^Xc = forward-word
^Xd = backward-word
^Xw = end-of-line
à = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word
/ etc / kshrc
/etc # cat kshrc
case $- in
*i*)
export SHELL_COLOR_BLUE="print -n \\033[0;34m"
export SHELL_COLOR_GREEN="print -n \\033[0;32m"
export SHELL_COLOR_RED="print -n \\033[0;31m"
export SHELL_COLOR_LIGHTGRAY="print -n \\033[0;37m"
export SHELL_COLOR_YELLOW="print -n \\033[1;33m"
export COLOR_BLACK="\\033[0;30m"
export COLOR_BLUE="\\033[0;34m"
export COLOR_GREEN="\\033[0;32m"
export COLOR_CYAN="\\033[0;36m"
export COLOR_RED="\\033[0;31m"
export COLOR_PURPLE="\\033[0;35m"
export COLOR_BROWN="\\033[0;33m"
export COLOR_LIGHTGRAY="\\033[0;37m"
export COLOR_DARKGRAY="\\033[1;30m"
export COLOR_LIGHTBLUE="\\033[1;34m"
export COLOR_LIGHTGREEN="\\033[1;32m"
export COLOR_LIGHTCYAN="\\033[1;36m"
export COLOR_LIGHTRED="\\033[1;31m"
export COLOR_LIGHTPURPLE="\\033[1;35m"
export COLOR_YELLOW="\\033[1;33m"
export COLOR_WHITE="\\033[1;37m"
if [[ `id -u` -eq 0 ]]; then
export PS1=`$SHELL_COLOR_RED`'$(hostname -s):'`$SHELL_COLOR_YELLOW`'$(pwd) # '`$SHELL_COLOR_LIGHTGRAY`
else
export PS1=`$SHELL_COLOR_BLUE`'$(hostname -s):'`$SHELL_COLOR_GREEN`'$(pwd) $ '`$SHELL_COLOR_LIGHTGRAY`
fi
esac
Configuraciones de PuTTy:
Notas que pueden o no importar, pero pueden proporcionar antecedentes:
El shell es "PD KSH v5.2.14 99/07 / 13.2". Sí, no tengo ninguna opción para actualizar ... es un sistema integrado. "Obtener una concha moderna" no es una respuesta viable. El sistema operativo es QNX Neutrino 6.4.1.
bind muestra lo siguiente:
bind | grep del
^D = eot-or-delete
^H = delete-char-backward
^? = delete-char-backward
^[^H = delete-word-backward
^[d = delete-word-forward
^[h = delete-word-backward
^[^? = delete-word-backward
^XP = delete-char-forward
ଠ= delete-char-forward
infocmp muestra lo siguiente:
infocmp # Reconstructed via infocmp from file:
/usr/lib/terminfo/x/xterm xterm|vs100|xterm terminal emulator,
am, km, mir, msgr, xenl, xon,
cols#80, it#8, lines#65, vt@,
acsc=Oa``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=@, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I,
hts=\EH, ich=\E[%p1%d@, ich1=\E[2~, il=\E[%p1%dL, il1=\E[L,
ind=^J, is1=\E=\E[?1l, kBEG=\ENn, kCPY=\ENs, kCRT=\ENt,
kDL=\ENv, kEXT=\ENw, kFND=\ENx, kHLP=\ENy, kOPT=\ENz,
ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOq, kcan=\EOm, kclo=\ENc,
kclr=\ENa, kcmd=\EOu, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
kcuu1=\E[A, kdch1=\E[P, kend=\E[9, kf1=\E[11~, kf10=\E[21~,
kf11=\E[23~, kf12=\E[24~, kf2=\E[12~, kf3=\E[13~,
kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
kf9=\E[20~, kfnd=\ENf, khlp=\ENh, khome=\E[8, khts=\ENb,
kich1=\E[2~, kmov=\ENi, kmrk=\ENm, kmsg=\ENe, knp=\E[6~,
kopn=\ENo, kopt=\ENk, kpp=\E[5~, kref=\ENl, kres=\ENp,
krfr=\ENg, krpl=\ENr, krst=\ENj, ksav=\ENq, kslt=\EOM,
ktbc=\ENd, kund=\ENu, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
rmam=\E[?7l, rmkx=\E>, rmso=\E[m,
rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=@,
sc=\E7,
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[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m,
sgr0=\E[m, smacs=^N, smam=\E[?7h, smkx=\E=, smso=\E[7m,
tbc=\E[3g,
stty muestra lo siguiente:
stty Name: /dev/ttyp0 Type: pseudo Opens: 2
+edit +echok +echonl
+osflow intr=^C quit=^\ erase=^? kill=^U eof=^D start=^Q stop=^S susp=^Z lnext=^V min=01 time=00 pr1=^[ pr2=5B left=44 right=43
up=41 down=42 ins=40 del=50 home=48 end=59
fuente
kshrc
en vano. Entiendosh: /etc/kshrc[21]: trap: bad signal KEYBD
que desafortunadamente no tengo otra opción de shell. No sé si esto es un problema con el PDKSH o con QNX o ambos. Sé qué combinaciones de teclas causarán lo que quiero. Solo necesito saber la sintaxis para asignarlos a las teclas apropiadas.bind | grep prefix
muestra? Ybind | grep '[^ -~]'
?bind '^[[3~'='delete-char-forward'
debería haber funcionado. No entiendo de dónde provienen esos caracteres no ASCII (no son secuencias ESC + foo con el conjunto de 8 bits, ni confusiones latin1 / utf8 de los mismos). ¿Funciona `bind '^ X3 ~ = delete-char-forward'?Respuestas:
Para Googlers:
Uf. Para algo que debería ser tan simple, esto fue difícil.
La solución corta es usar lo siguiente para configurar la clave de eliminación (en
kshrc
o donde sea),Y establezca la configuración de su terminal PuTTy en
rxvt
lugar deStandard
.Lo que realmente me ayudó a poner esto en funcionamiento fue: http://www.mail-archive.com/[email protected]/msg81796.html
ksh hace cosas tontas con las teclas de inicio y fin. Básicamente, no pude distinguir la diferencia entre Inicio, Fin y Eliminar al mismo tiempo. Cualquiera que sea el último límite, las tres llaves funcionarían. Cambiar lo que PuTTy envió por estas claves ayudó inmensamente.
Nota: Algunas personas sugieren si desea ver qué código obtiene el shell cuando presiona una tecla, escriba
cat
, presione Intro y luego presione la tecla. Para mi caparazón, esto no funcionó. Tengo~
todas las teclas de control. Lo que hice en cambio fue presionarEsc
una vez, luego presionar la tecla. El código de control aparecería y luego aparecería. Use ese código de controlbind
y estará listo.fuente
[Aunque tenemos una configuración algo diferente, espero que lo siguiente pueda ser útil para alguien, ya que creo que se aplican algunos de los mismos principios generales. Esto resultó ser una buena experiencia de aprendizaje para mí acerca de cómo Linux maneja la E / S básica del terminal.]
Si shell se está ejecutando dentro de una ventana de terminal de gnome , entonces debajo de
Preferences
|Profiles
seleccione un perfil, luego seleccioneEdit
y luego laCompatibility
pestaña, y cambieDelete key generates
aAutomatic
. (O si esto falla, pruebe las otras opciones allí).[Estoy en Debian Stretch.]
No sé cómo, o incluso cuándo se rompió exactamente mi Del, ¡pero comenzó a eliminar a la izquierda en lugar de a la derecha!
Este artículo fue muy útil para mí para entender cómo funcionaban las cosas.
Utilicé las estrategias de depuración sugeridas en el artículo vinculado anterior:
Escriba
^v Del
y^v Backspace
, [control-v luego elimine la tecla ...] para encontrar los códigos de secuencia de terminal devueltos.Y el uso
showkey -s
,showkey -k
,showkey -a
y luegoDel
yBackspace
claves para inspeccionar las tres capas (primas de teclado, como salida del controlador de terminal, y como cadena de caracteres en el borne).A partir de esto, noté que cuando usaba stty (por ejemplo, stty1), mi comportamiento de shell era diferente de cuando usaba xterm (desde un terminal X gráfico). Del eliminado correctamente hacia adelante (derecha) en stty1, pero hacia atrás (izquierda) en mi xterm.
fuente
Las dos respuestas existentes no funcionaron para mí yendo de Linux (Ubuntu 18.10) bash, a través de SSH a Solaris 11.3 bash, usando el terminal gnome.
Descubrí que necesitaba usar el
bind
comando, pero con una solución alternativa, ya que no podía hacer que un nativo Deletefuncionara.Entonces, la solución es que, cuando Deletese presiona, simular una eliminación al asignar la tecla de eliminación a →y Backspace.
Para escribir eso, presione las teclas:
CTRL-vDeletepara la primera parte
y CTRL-v→CTRL-vBackspacepara la segunda.
(o el uso
\e
para el escape en lugar, por ejemplo:"\e[3~"
)No es perfecto, si Deleteal final de la línea, todavía retrocede. Pero me ahorra tener que retroceder el
~
personaje innumerables veces al día.fuente