bash home / end / delete la clé est en train d'insérer un tilde, ou si elle est précédée par la touche d'échappement, [1 ~ [3 ~

17

En bash, le maison / fin / effacer key insère un tilde, ou si précédé de la touche d'échappement: [1~

Alors je tape echo hellp, déplacez le curseur sur hel|lp et tapez delete, et bam, je me suis ~tilde

Aussi, je tape echo hellp, déplacez le curseur sur hel|lp et tapez esc puis supprimez, et bam, je me suis [3~

$ echo hel~lp
hel~lp

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

Ma version de bash:

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

Ce que je veux, c'est un comportement comme cmd.exe:

  1. Je veux que Esc efface la ligne / le tampon courant
  2. Je veux que Home déplace le curseur au début de la ligne avant le premier caractère
  3. Je veux que End mette le curseur à la fin de la ligne avant le premier caractère
  4. Je veux supprimer pour supprimer le caractère suivant (à droite du curseur) de la ligne / du tampon en cours

Que dois-je éditer pour résoudre ce problème? Est-ce que ce défaut est sur votre bash?

mettre à jour: Je suis sur une machine Windows exécutant un programme Windows, sh.exe (comme vous pouvez le voir ci-dessus, GNU bash), compilé avec mingw pour msys:

$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys
optional
la source
windows, pas d'émulateur de terminal, msys.bat, si je savais comment signaler le paramètre, je ne demanderais pas comment le configurer.
optional

Réponses:

22

Vous personnalisez bash via un .inputrc déposer dans votre /home/username , vous pouvez copier la valeur par défaut

cp /etc/inputrc.default   ~/.inputrc

voici le mien (les commentaires commencent par #)

# 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

pour savoir ce dont vous avez besoin pour taper votre inputrc sur le côté gauche (le code d'échappement, car il peut varier entre un ordinateur portable / un ordinateur de bureau, etc.), à l'invite echo ' puis tapez Ctrl-V suivi de la clé, comme Homepuis tapez ' Exemple

$ 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
~

puis remplacez chaque ^[ avec \e ajouter \M- pour Alt théoriquement, vous utiliseriez \C- pour Ctrl mais cela ne fonctionne pas actuellement (limitation de Windows)

les commandes disponibles (comme backward-kill-line ) sont répertoriés dans http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029

vous pouvez afficher les raccourcis clavier / liaisons existants avec bind -p ou

$ 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".
~

ne plaisante pas avec TERMCAP

optional
la source
find / -name 'inputrc.default' ne trouve rien sur ma machine. Ma maison et mon bureau fonctionnaient autrefois ... :( De plus, à titre d'information pour les autres: pour recharger le fichier .inputrc, utilisez bind -f ~/.inputrc.
aliteralmind
Ah! Correction: j'ai utilisé votre .inputrc, sauf pour le $if mode=emacs bloc. J'ai ajouté ces deux lignes, et elles fonctionnent à nouveau! :RÉ "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
aliteralmind
on RHL - le fichier par défaut dans / etc / inputrc
Deian
Malheureusement, je n'ai pas accès en écriture à ce fichier sur une machine en cluster.
Herman Toothrot
5

Eh bien, puisque vous dites que vous travaillez sous Windows et n’utilisez pas un émulateur de terminal approprié tel que PuTTY (avec menthe , puttycyg et al ), Je vous recommanderais de consulter la documentation readline et apprendre les raccourcis pour readline. Ce sera mieux à long terme.

Si vous deviez utiliser un émulateur de terminal à la place de la fenêtre de la console (sans parler de l'interpréteur / du shell ici) fourni avec Windows, vous auriez une alternative plus configurable. Une fois que vous essayez d’utiliser d’autres programmes comme Vim, la situation ne fera qu’empirer.

L'essentiel: utiliser un émulateur de terminal approprié, même sous Windows ou apprendre les raccourcis readline. J'ai testé ceux que j'utilise le plus en ce moment et ils fonctionnent avec msys.bat.

mingw-get install mintty && mintty

Le fichier à éditer aurait être /usr/share/terminfo (qui n'existe pas dans MinGW) - utilisez tic pour "compiler" des règles (qui ne sont même pas incluses car tout le monde sait que le support serait gravement handicapé). Cependant, je n'ai vu aucun développement utile pour rendre cela même utilisable sous Windows. C’est pourquoi vous devez d’abord utiliser un émulateur de terminal approprié. Mais je suis sûr qu'un chirurgien sera capable d'utiliser un couteau de cuisine pour la chirurgie, alors pourquoi ne pas utiliser les fenêtres de la console intégrée de Windows. Bonne chance.

0xC0000022L
la source
3

Vérifier l'installation de Readline

Quand cela se produit sur un minimal l’installation récente de Debian / Ubuntu, c’est probablement parce que vous n’avez pas installé le readline-common paquet. Simplement installer le paquet va le résoudre.

Par exemple. sur Docker avec la frappe Debian Stretch ls MAISON :

$ 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

Notez qu'après l'installation de readline-common, cela n'aura d'effet que sur les nouveaux shells de connexion.

gertvdijk
la source
exec bash est un moyen de remplacer l'instance bash actuelle par une nouvelle, sans quitter le terminal (comme cela peut être nécessaire lors de la lecture dans un conteneur pTTY).
Kevin
@ Kevin Bien que ce soit une déclaration valide, qu'est-ce que cela a à voir avec le contexte du Q & A ici?
gertvdijk
1
c'est pourquoi je l'ai laissé comme commentaire au lieu de le suggérer comme modification de votre réponse. Vous avez souligné la nécessité d'un nouveau shell pour pouvoir utiliser le readline-common fraîchement installé, et vous avez montré comment créer un conteneur en tant qu'image afin de réaliser cet objectif. Surtout, puisque vous avez utilisé Docker comme exemple, je pensais que mon commentaire était pertinent.
Kevin
@ Kevin Ah, d'accord, alors vous avez mal compris. Il existe de nombreuses façons d'obtenir un nouveau shell de connexion, le vôtre en fait partie. :)
gertvdijk
2

J'ai trouvé le suivant utile aussi: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

Plus précisément:

Si vos clés ne fonctionnent pas, c'est peut-être parce que votre terminal envoie des codes d'échappement qui ne figurent pas dans cette liste. Vous devez d’abord savoir quels codes d’échappement sont envoyés. Pour les voir, vous pouvez utiliser une commande Readline appelée "quoted-insert" ou exécuter la commande showkey --scancodes qui fournit la valeur d'une clé mot à mot. La liaison par défaut pour quoted-insert est Ctrl + V.

Par exemple, vous pouvez donner les séries d’entrées suivantes dans votre terminal:

Ctrl+V
Home
Spacebar
Ctrl+V
End

Et obtenir en sortie

$ ^ [[1 ~ ^ [[4 ~

Le ^ [indique un caractère d'échappement dans votre shell, cela signifie donc que votre clé Home a un code d'échappement de [1 ~ et que votre touche End a un code d'échappement de [4 ~. Puisque ces codes d'échappement ne sont pas répertoriés dans la configuration par défaut de Readline, vous devrez les ajouter:

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

Notez que Readline utilise \ e pour indiquer un caractère d'échappement.

Pour moi, l'élément pertinent était de mettre ceci dans inputrc:

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