Backward-Kill-Word an Strg + W binden

23

Ich versuche, von längerem Gebrauch von Tcsh auf die kürzliche Erkundung von Bash umzusteigen.

Ich habe es geschafft, alle meine Lieblingsfunktionen zu portieren, mit Ausnahme von Strg + w, das Leerzeichen und Schrägstriche als Wortgrenzen behandelt, höchstwahrscheinlich Rückwärts-Kill-Word. In Bash löscht readline jedoch bis zum ersten Leerzeichen, wobei alle Schrägstriche dazwischen gelöscht werden.

Ich habe viele verschiedene Kombinationen von \ Cw: backward-kill-word in .inputrc und .bashrc mit bind ausprobiert, aber ich kann nicht erreichen, dass es so funktioniert, wie ich es möchte.

Witzigerweise kann ich über Putty von Windows bei der Arbeit Alt + Backspace verwenden, das auch im Handbuch als Standardbindung angegeben ist, um genau das gewünschte Verhalten zu erzielen. Aber in Terminal.app auf meinen Macs zu Hause funktioniert das nicht. Gleiches gilt für jeden FreeBSD- oder Linux-Server, bei dem ich gerade von Terminal.app aus angemeldet bin.

Ich wende mich an den Superuser, um Hilfe zu erhalten.

Stefan M
quelle

Antworten:

40

readlinebindet nicht über Ctrl- Wda es standardmäßig vom Terminal-Treiber behandelt wird:

$ stty -a
(...) werase = ^W; (...)

Um dies zu deaktivieren, müssen Sie (in ~/.bashrc) ausführen :

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrcwird hier nicht helfen, da gelesen wird, wann Ctrl- Wnoch zugewiesen ist werase.

Beachten Sie auch, dass \C-wFormat-Keyseqs wie oben in doppelte Anführungszeichen eingeschlossen werden müssen.


Verschiedene Endgeräte verarbeiten kann Alt- Backspaceanders.

  • PuTTY- und GNOME-Terminal (mit Standardeinstellungen) send 1b 7f( ESC DEL)
  • Xterm mit metaSendsEscape: trueSends 1b 08( ESC BS).
  • Xterm ohne metaSendsEscape Sends 88( HTSoder BSmit dem höchsten gesetzten Bit).

Xterm verfügt über einige Einstellungen zur Steuerung des Verhaltens von AltSchlüsseln ( Metain Xterm und X11 allgemein aufgerufen ). Mit metaSendsEscape, Halt Altwerden die keypress mit einem Präfix ESC(hex 1b). Ohne die Einstellung (Standardmodus) Altwird das höchste Bit des Eingabezeichens gesetzt, was zu Sonderzeichen führt. (Zum Beispiel ergibt Alt- und .)NESC nî

Soweit ich mich erinnern kann, hat Terminal.app auch eine ähnliche Einstellung, um das Verhalten von Meta / Alt / whatever-Macs-use zu steuern.

Grawity
quelle
Dies ist nicht nur die beste Antwort, sondern auch äußerst informativ, danke!
Stefan M
1
@shurane: Die Aktion werase "word erase", wie normales Löschen (Backspace), wird vom Betriebssystem selbst im Treiber "tty device" implementiert. Beachten Sie, dass sie auch in Programmen verfügbar sind, die nur blind aus stdin lesen, z cat. Dient bei allen Unixen sttyzur Steuerung verschiedener tty-Parameter, einschließlich dieser Sondertasten. (So ​​sah die 7. UNIX-Editionstty aus.)
grawity
1
@shurane: In der Zwischenzeit ist readline eine Userspace-Bibliothek, die ursprünglich für die Bash- Shell geschrieben wurde (obwohl sie jetzt von vielen Programmen verwendet wird). Es ist möglich, dass die anderen Aktionen in readline implementiert wurden , um ein Aufblähen des tty-Treibers zu vermeiden (der bereits eine beträchtliche Anzahl von Flags und Toggles aufwies, wie im sttyHandbuch zu sehen). Auch bash wurde ursprünglich für die beabsichtigte GNU OS und erst später auf andere Unix - Varianten portiert; Es ist viel einfacher, die Bearbeitungsfunktionen in einer einzigen Bibliothek zu verwalten als in mehreren sehr unterschiedlichen Kerneln.
Grawity
3
@shurane: Technisch gesehen werden alle diese Aktionen, einschließlich des Löschens von Wörtern, über readline implementiert. Wenn diese Option aktiviert ist , werden die Rücktaste und die Tastenkombination Strg + W durch den Terminaltreiber vollständig deaktiviert. readline respektiert die sttyKonfiguration der Einfachheit halber, kann jedoch durch readlines eigene Einstellungen überschrieben werden (wie in der Antwort von Matt Day beschrieben).
Grawity
4
Dies ist eine gute Antwort für Informationen, upvote. Es sollte jedoch beachtet werden, dass dies Strg-w für alle Programme deaktiviert, es sei denn, sie verwenden readline, was wahrscheinlich nicht von jedermann gewünscht wird. Probieren Sie also die Antwort von @fjarlq.
Freitag,
19

Grawity schrieb, dass dies nicht in der .inputrcDatei gesteuert werden kann, aber das ist falsch.

Wenn Sie sich set bind-tty-special-chars offin Ihrem befinden .inputrc, können Sie das Verhalten der speziellen Terminalzeichen anpassen.

Beispielsweise:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word
fjarlq
quelle
2
Und dies hat den Vorteil, dass es für alle Programme funktioniert, die readline verwenden, z python.
Wchargin
3

Die Antwort für iTerm2 lautet: Setzen Sie Alt- Backspace(oder Opt ⌥- auf dem Mac), um Hex-Codes zu senden, 0xb1und 0x7fführen Sie die backward-kill-wordAktion aus, bei der nicht-alphanumerische Zeichen als Begrenzer behandelt werden.

Zur Unterscheidung ist hier das Verhalten, das ich beschreibe, in dem sich durch Drücken von Opt ⌥- einmalig Folgendes ändert:

echo "/example/filepath/with_non-alpha.characters@blah:meh

dazu:

echo "/example/filepath/with_non-alpha.characters@blah:

Und nachfolgende Pressen von Opt ⌥- :

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

So sieht die Einstellung in iTerm2 aus: Bildbeschreibung hier eingeben

Speziell für Putty und Terminal ist die Antwort von grawity also großartig. Da dieser Superuser-Beitrag jedoch in peinlicher Weise nach der Anwendung der Einstellung in iTerm2 gesucht hat, scheint er am häufigsten zu erscheinen. Daher schien er dafür verantwortlich zu sein, die relevanten Informationen, die für iTerm2 gelten, als Antwort auf diese Frage anzugeben.

TCAllen07
quelle
Ich habe sehr lange gebraucht, um das herauszufinden, und diese Lösung funktioniert tatsächlich unter OS X (mit iTerm2), wenn ich mich auf einer Remote-Bash-Shell anmelde. Vielen Dank!
Martijn