Eliminar clave no funciona en la línea de comando

10

** 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:

  1. 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).
  2. 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).
  3. 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-2esto? 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-deletenuevamente 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:

ingrese la descripción de la imagen aquí

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
kmort
fuente
De hecho, ya he visto ambos enlaces, y he tratado de modificar kshrcen vano. Entiendo sh: /etc/kshrc[21]: trap: bad signal KEYBDque 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.
kmort
La tecla Eliminar funciona para mí con Pdksh (misma versión, no se ha mantenido desde el siglo pasado) en Linux. ¿Qué te bind | grep prefixmuestra? Y bind | grep '[^ -~]'?
Gilles 'SO- deja de ser malvado'
@Gilles actualicé con los resultados de sus comandos de enlace. ¿Podría ser mi configuración PuTTy? Aprecio tu ayuda. :-)
kmort
AFAIK 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'?
Gilles 'SO- deja de ser malvado'

Respuestas:

6

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 kshrco donde sea),

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

Y establezca la configuración de su terminal PuTTy en rxvtlugar de Standard.

Configuraciones de PuTTy

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 presionar Escuna vez, luego presionar la tecla. El código de control aparecería y luego aparecería. Use ese código de control bindy estará listo.

kmort
fuente
Puedo confirmar que esto también funciona en Conemu + Cygwin.
Janac Meena
2

[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| Profilesseleccione un perfil, luego seleccione Edity luego la Compatibilitypestaña, y cambie Delete key generatesa Automatic. (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 Dely ^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 -ay luego Dely Backspaceclaves 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.

Vista elíptica
fuente
El artículo es un eslabón muerto
Leche
1

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 bindcomando, 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.

bind '"^[[3~":"^[[C^?"'

Para escribir eso, presione las teclas:

CTRL-vDeletepara la primera parte
y CTRL-vCTRL-vBackspacepara la segunda.
(o el uso \epara 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.

Kingsley
fuente