La tecla bash home / end / delete está insertando una tilde, o si está precedida por la tecla de escape, [1 ~ [3 ~

20

En bash, la tecla home/ end/ deleteestá insertando una tilde, o si está precedida por la tecla de escape:[1~

Así que escribo echo hellp, muevo el cursor hel|lpy escribo delete, y bam, obtuve~tilde

Además, escribo echo hellp, muevo el cursor hel|lpy escribo esc, luego elimino, y bam, obtuve[3~

$ echo hel~lp
hel~lp

$ echo hell[3~o
hell[3~o
~

Mi versión de bash:

$ bash --version
GNU bash, version 3.1.17(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

Lo que quiero es un comportamiento como cmd.exe:

  1. Quiero que Esc borre la línea / búfer actual
  2. Quiero que Home mueva el cursor al inicio de la línea antes del primer carácter
  3. Quiero que End mueva el cursor al final de la línea antes del primer carácter
  4. Quiero eliminar para eliminar el siguiente carácter (a la derecha del cursor) de la línea / búfer actual

¿Qué tengo que editar para arreglar esto? ¿Es esto predeterminado en tu bash?

actualización: estoy en una máquina Windows que ejecuta un programa de Windows, sh.exe (como puede ver arriba GNU bash), compilado con mingw para msys:

$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys
Opcional
fuente
Windows, sin emulador de terminal, msys.bat, si supiera cómo informar la configuración, no estaría preguntando cómo configurarlos
opcional

Respuestas:

22

Puede personalizar bash a través de un .inputrcarchivo en su /home/username, puede copiar el predeterminado

cp /etc/inputrc.default   ~/.inputrc

aquí está el mío (los comentarios comienzan con #)

# Key-bindings for the command-line editor.

# Ask before displaying >50 items
# Since $WINDIR $PATH var can be in $PATH, this could list
# all window exectables in C:\WINDOWS
set completion-query-items 50

# Ignore case for the command-line-completion functionality
# on:  default to a Windows style console
# off: default to a *nix style console
set completion-ignore-case on

# none, visible or audible
set bell-style audible

# disable/enable 8bit input
set meta-flag on
set input-meta on
set output-meta off
set convert-meta on

# visible-stats
# Append a mark according to the file type in a listing
set visible-stats off
set mark-directories on

# Show all instead of beeping first
set show-all-if-ambiguous off

# MSYSTEM is emacs based
$if mode=emacs
    # Common to Console & RXVT
    "\C-?": backward-kill-line          # Ctrl-BackSpace
    "\e[2~": paste-from-clipboard       # "Ins. Key"
    "\e[5~": beginning-of-history       # Page up
    "\e[6~": end-of-history             # Page down

    $if term=msys # RXVT
        "\e[7~": beginning-of-line      # Home Key
        "\e[8~": end-of-line            # End Key
        "\e[11~": display-shell-version # F1
        "\e[15~": re-read-init-file     # F5
    #$endif
    #$if term=cygwin # Console
    $else
        "\e[1~": beginning-of-line      # Home Key
        "\e[4~": end-of-line            # End Key


"\e[3~": delete-char            # Delete Key
#~      "\e\e[D": backward-word         # Alt-LeftArrow
#~      "\e\e[C": forward-word          # Alt-RightArrow
            "\M-\e[D": backward-word            # Alt-LeftArrow
            "\M-\e[C": forward-word         # Alt-RightArrow
    `#~`        "\C-\E[D": backward-word        # Ctrl-LeftArrow, nowork, can't be made to work
    #~`enter preformatted text here`        "\C-\E[C": forward-word         # Ctrl-RightArrow, nowork, can't be made to work
    #~ to see current bindings use    bind -q backward-kill-line
            "\e\e": kill-whole-line        # double/triple escape works :) Esc/Escape to delete current line like cmd.exe

        $endif
    $endif

para averiguar lo que necesita escribir en su computadora en el lado izquierdo (el código de escape, ya que puede variar entre la computadora portátil / escritorio ...), en el símbolo del sistema, echo 'luego escriba Ctrl-Vseguido de la tecla, como Home, luego escriba ' ejemplo

$ echo ' home key ^[[1~  '
 home key
~
$ echo ' end key ^[[4~  '
 end key
~
$ echo ' pg up page up ^[[5~ '
 pg up page up
~
$ echo ' pg dn page down ^[[6~ '
 pg dn page down
~

luego vuelva a colocar cada uno ^[con \e complemento \M-para Alt teóricamente tendrá que utilizar \C-para Ctrlpero actualmente no funciona (ventanas limitación)

los comandos disponibles (como backward-kill-line) se enumeran en http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029

puede ver los atajos / atajos de teclado existentes con bind -po

$ bind -q backward-kill-word
backward-kill-word can be invoked via "\M-\C-h", "\M-\C-?".
~
$ bind -q backward-word
backward-word can be invoked via "\M-\M-[D", "\M-b", "\C-\E[[D".
~
$ bind -q beginning-of-line
beginning-of-line can be invoked via "\C-a", "\M-OH", "\M-[1~", "\M-[H".
~

no te metas con TERMCAP

Opcional
fuente
find / -name 'inputrc.default'No encuentra nada en mi máquina. Mi casa y mi fin solían funcionar ... :( Además, para tu información: para volver a cargar el archivo .inputrc, usa bind -f ~/.inputrc.
aliteralmind
Ah! Corrección: Usé su .inputrc, excepto el $if mode=emacsbloque. ¡Agregué estas dos líneas y funcionan de nuevo! : D "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
aliteralmind
en RHL - el archivo predeterminado en / etc / inputrc
Deian
desafortunadamente no tengo acceso de escritura a ese archivo en una máquina de clúster.
Herman Toothrot
5

Bueno, ya que dice que está trabajando en Windows y no está utilizando un emulador de terminal adecuado como PuTTY (con mintty , puttycyg et al ), le recomendaría que consulte la documentación de readline y aprenda los accesos directos para readline. Será mejor a la larga.

Si usara un emulador de terminal en lugar de la ventana de la consola (sin hablar del intérprete / shell aquí) que viene con Windows, obtendría una alternativa más configurable. Una vez que intentes usar otros programas como Vim, las cosas solo empeorarán.

La esencia: use un emulador de terminal adecuado, incluso en Windows o aprenda los atajos de línea de lectura. Probé los que más uso en este momento y con los que trabajan msys.bat.

mingw-get install mintty && mintty

El archivo de edición podría ser /usr/share/terminfo(que no existe en MinGW) - El uso ticde reglas "Compilar" (que ni siquiera se incluye porque todo el mundo sabe que el apoyo se paralizó gravemente). Sin embargo, no he visto ningún desarrollo útil para hacer que esto sea casi utilizable en Windows. Es por eso que debe usar un emulador de terminal adecuado en primer lugar. Pero estoy seguro de que un cirujano podrá usar un cuchillo de cocina para la cirugía, entonces, ¿por qué no debería usar las ventanas de consola incorporadas de Windows? Buena suerte.

0xC0000022L
fuente
4

Verifique la instalación de Readline

Cuando esto sucede en una instalación mínima de Debian / Ubuntu reciente, probablemente sea porque no ha instalado el readline-commonpaquete. Simplemente instalando el paquete lo resolverá.

Por ejemplo, en Docker con Debian Stretch escribiendo ls HOME:

$ docker run --rm -it debian:stretch
root@6ae7baea9e5a:/# ls~

$ docker run -it --name=debian-stretch-readline-temp debian:stretch
root@2092cb968232:/# apt-get update
root@2092cb968232:/# apt-get install readline-common

$ docker commit debian-stretch-readline-temp debian-stretch-with-readline
$ docker run --rm -it debian-stretch-with-readline
root@53739343e9f7:/# ls

Tenga en cuenta que después de instalar readline-common solo tendrá efecto en los nuevos shells de inicio de sesión.

gertvdijk
fuente
exec bashes una forma de reemplazar la instancia de bash actual con una nueva, sin salir del terminal (como puede ser necesario cuando se juega en un contenedor pTTY).
Kevin
@Kevin Si bien esa es una declaración válida, ¿qué tiene que ver con el contexto de las preguntas y respuestas aquí?
gertvdijk
1
Es por eso que lo dejé como comentario en lugar de sugerirlo como una edición de su respuesta. Notó la necesidad de un nuevo shell para usar el readline-common recién instalado, y mostró que comprometer un contenedor como una imagen como un medio para lograrlo. Especialmente, dado que usaste Docker como ejemplo, pensé que mi comentario era relevante.
Kevin
@ Kevin Ah, está bien, entonces entendí mal tu punto. Existen muchas formas de obtener un nuevo shell de inicio de sesión, el suyo es uno de ellos. :)
gertvdijk
2

También encontré lo siguiente útil: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

Específicamente:

Si sus claves no funcionan, podría deberse a que su terminal particular envía códigos de escape que no están en esta lista. Primero debe averiguar qué códigos de escape se envían. Para verlos, puede usar un comando Readline llamado "cita-inserción" o ejecutar el comando showkey --scancodes que genera el valor de una clave literalmente. El enlace predeterminado para la inserción entre comillas es Ctrl + V.

Por ejemplo, podría dar la siguiente serie de entradas en su terminal:

Ctrl+V
Home
Spacebar
Ctrl+V
End

Y obtener como salida

$ ^ [[1 ~ ^ [[4 ~

La ^ [indica un carácter de escape en su shell, por lo que esto significa que su tecla de inicio tiene un código de escape de [1 ~ y su tecla de finalización tiene un código de escape de [4 ~. Dado que estos códigos de escape no figuran en la configuración predeterminada de Readline, deberá agregarlos:

"\e[1~": beginning-of-line
"\e[4~": end-of-line

Tenga en cuenta que Readline usa \ e para indicar un carácter de escape.

La pieza relevante para mí fue poner esto en inputrc:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
Pablo
fuente