Bash Home / End / Delete-Taste fügt eine Tilde ein, oder, wenn der Escape-Taste vorangestellt ist, [1 ~ [3 ~

20

In der Bash fügt die Taste home/ end/ deleteeine Tilde ein, oder wenn die Escape-Taste vorangestellt ist:[1~

Also tippe ich echo hellp, bewege den Cursor hel|lpund tippe delete und bam, ich habe~tilde

Außerdem tippe ich echo hellp, bewege den Cursor auf hel|lpund tippe esc, dann lösche ich und bam, das habe ich[3~

$ echo hel~lp
hel~lp

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

Meine Version von Bash:

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

Was ich will, ist Verhalten wie cmd.exe:

  1. Ich möchte, dass Esc die aktuelle Zeile / den aktuellen Puffer löscht
  2. Ich möchte, dass Home den Cursor zum Zeilenanfang vor dem ersten Zeichen bewegt
  3. Ich möchte, dass End den Cursor an das Zeilenende vor dem ersten Zeichen bewegt
  4. Ich möchte löschen, um das nächste Zeichen (rechts vom Cursor) aus der aktuellen Zeile / dem aktuellen Puffer zu löschen

Was muss ich ändern, um dies zu beheben? Ist dies die Standardeinstellung für Ihre Bash?

Update: Ich arbeite auf einem Windows-Computer, auf dem ein Windows-Programm namens sh.exe (wie Sie oben unter GNU bash sehen können) ausgeführt wird, das mit mingw für msys kompiliert wurde:

$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys
Optional
quelle
windows, no terminal emulator, msys.bat, wenn ich wüsste, wie die einstellung zu melden ist, würde ich nicht fragen, wie sie einzustellen ist
optional

Antworten:

22

Sie passen die Bash über eine .inputrcDatei in Ihrer an /home/username, Sie können die Standarddatei kopieren

cp /etc/inputrc.default   ~/.inputrc

hier ist meins (Kommentare beginnen mit #)

# 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

um herauszufinden , was Sie in Ihrem inputrc auf der linken Seite (der Escape - Code, wie es zwischen Laptop / Desktop ... variieren kann) eingeben müssen, an der Eingabeaufforderung geben Sie echo 'dann Typ , Ctrl-Vgefolgt von der Taste, wie Home, geben Sie dann ein ' Beispiel

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

ersetzen dann jeweils ^[mit \e Zusatz \M-für Alt theoretisch Sie verwenden würden \C-für Ctrlaber es funktioniert noch nicht Arbeit (Fenster Begrenzung)

Die verfügbaren Befehle (wie backward-kill-line) sind unter http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029 aufgeführt

Sie können vorhandene Tastaturkürzel / -belegungen mit bind -poder anzeigen

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

Leg dich nicht mit TERMCAP an

Optional
quelle
find / -name 'inputrc.default'findet nichts auf meinem Rechner. Meine Wohnung und mein Ende haben früher gearbeitet ... :( Auch zu Ihrer Information an andere: Um die .inputrc-Datei neu zu laden, verwenden Sie bind -f ~/.inputrc.
aliteralmind
Ah! Korrektur: Ich habe deine .inputrc benutzt, bis auf den $if mode=emacsBlock. Ich habe diese beiden Zeilen hinzugefügt und sie funktionieren wieder !! : D "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
Aliteralmind
auf RHL - die Standarddatei in / etc / inputrc
Deian
Leider habe ich auf einem Clustercomputer keinen Schreibzugriff auf diese Datei.
Herman Toothrot
5

Nun, da Sie sagen, dass Sie unter Windows arbeiten und keinen geeigneten Terminal-Emulator wie PuTTY (mit Mintty , Puttycyg und anderen ) verwenden, würde ich Ihnen empfehlen, die readline-Dokumentation zu konsultieren und die Shortcuts für readline zu erlernen. Es wird auf lange Sicht besser sein.

Wenn Sie einen Terminalemulator anstelle des Konsolenfensters verwenden (hier nicht den Interpreter / die Shell), das / die mit Windows geliefert wird, erhalten Sie eine besser konfigurierbare Alternative. Sobald Sie versuchen, andere Programme wie Vim zu verwenden, wird es nur noch schlimmer.

Das Wichtigste: Verwenden Sie einen geeigneten Terminal-Emulator, auch unter Windows, oder lernen Sie die Readline-Verknüpfungen. Ich habe die getestet, die ich gerade am meisten benutze und sie funktionieren mit msys.bat.

mingw-get install mintty && mintty

Die Datei zu bearbeiten würde sein /usr/share/terminfo(was nicht in MinGW nicht existiert) - Einsatz ticauf „Compile“ Regeln (die , weil jeder enthält nicht einmal weiß , dass die Unterstützung wäre schwer verkrüppelt werden). Ich habe jedoch noch keine nützliche Entwicklung gesehen, die es mir ermöglicht, diese Funktion auch unter Windows nahezu nutzbar zu machen. Aus diesem Grund sollten Sie zunächst einen geeigneten Terminalemulator verwenden. Aber ich bin mir sicher, dass ein Chirurg ein Küchenmesser für die Operation verwenden kann. Warum sollten Sie nicht die in Windows integrierten Konsolenfenster verwenden? Viel Glück.

0xC0000022L
quelle
4

Überprüfen Sie, ob Readline installiert ist

Wenn dies bei einer Minimalinstallation von Debian / Ubuntu der Fall ist, liegt dies wahrscheinlich daran, dass Sie das readline-commonPaket nicht installiert haben . Durch einfaches Installieren des Pakets wird das Problem behoben.

ZB auf Docker mit Debian Stretch-Eingabe 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

Bitte beachten Sie, dass nach der Installation von readline-common nur neue Login-Shells betroffen sind.

gertvdijk
quelle
exec bashDies ist eine Möglichkeit, die aktuelle Bash-Instanz durch eine neue zu ersetzen, ohne das Terminal zu verlassen (wie dies beim Spielen in einem Container pTTY erforderlich ist).
Kevin
@ Kevin Das ist zwar eine gültige Aussage, aber was hat sie hier mit dem Kontext der Fragen und Antworten zu tun?
Gertvdijk
1
Deshalb habe ich es als Kommentar hinterlassen, anstatt es als Änderung für Ihre Antwort vorzuschlagen. Sie haben festgestellt, dass eine neue Shell erforderlich ist, um die frisch installierte readline-common zu verwenden, und haben gezeigt, wie Sie einen Container als Image festlegen können, um dies zu erreichen. Vor allem, weil Sie Docker als Beispiel verwendet haben, fand ich meinen Kommentar relevant.
Kevin
@ Kevin Ah, okay, gut, dann hast du deinen Standpunkt falsch verstanden. Es gibt viele Möglichkeiten, eine neue Login-Shell zu erhalten. Ihre ist eine davon. :)
gertvdijk
2

Ich fand auch Folgendes hilfreich: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

Speziell:

Wenn Ihre Schlüssel nicht funktionieren, kann dies daran liegen, dass Ihr spezielles Terminal Escape-Codes sendet, die nicht in dieser Liste aufgeführt sind. Zuerst müssen Sie herausfinden, welche Escape-Codes gesendet werden. Um sie anzuzeigen, können Sie den Readline-Befehl "quoted-insert" verwenden oder den Befehl showkey --scancodes ausführen, der den Wert eines Schlüssels wörtlich ausgibt. Die Standardbindung für quoted-insert ist Strg + V.

Sie können beispielsweise die folgenden Eingaben in Ihr Terminal eingeben:

Ctrl+V
Home
Spacebar
Ctrl+V
End

Und als Ausgabe erhalten

$ ^ [[1 ~ ^ [[4 ~

Das ^ [zeigt ein Escape-Zeichen in Ihrer Shell an. Dies bedeutet, dass Ihre Home-Taste einen Escape-Code von [1 ~ und Ihre End-Taste einen Escape-Code von [4 ~ hat. Da diese Escape-Codes nicht in der Readline-Standardkonfiguration aufgeführt sind, müssen Sie sie hinzufügen:

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

Beachten Sie, dass Readline mit \ e ein Escapezeichen kennzeichnet.

Das für mich relevante Stück war, dies in inputrc zu setzen:

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