Debian aufsetzen 8.3
stty werase '^H'
oder unter Arch Linux 2/2016
stty werase '^?'
in .bashrc
(zum Beispiel) macht Ctrl- Backspacelöscht das letzte Wort im Terminal. Trotzdem ist es nicht das gleiche Verhalten wie in modernen GUI-Anwendungen (z. B. Firefox): Es löscht das letzte durch Leerzeichen getrennte Wort und nicht das letzte Wort, das durch Leerzeichen oder Zeichen wie getrennt ist . : , ; " ' & / ( )
.
Ist es möglich zu machen Ctrl- Backspaceverhalten sich im Terminal ähnlich wie moderne GUI - Anwendungen? Außerdem ist es eine Möglichkeit zu machen Ctrl- Deletelöschen Sie das Wort unmittelbar vor dem Cursor?
bash
terminal
keyboard-shortcuts
line-editor
Wolf-Revo-Katzen
quelle
quelle
Antworten:
Hier spielen zwei Zeileneditoren eine Rolle: der vom Kernel bereitgestellte grundlegende Zeileneditor (tty-Zeileneditor im kanonischen Modus) und der Zeileneditor von bash (implementiert über die Readline-Bibliothek). Beide haben einen Befehl zum Löschen des vorherigen Wortes, der standardmäßig an Ctrl+ gebunden ist W. Der Schlüssel kann für den kanonischen Modus tty line editor durch konfiguriert werden
stty werase
; bash ahmt die Schlüsselbindung nach, die in der Einstellung tty gefunden wird, sofern sie nicht in der eigenen Konfiguration überschrieben wird.Die
werase
Aktion im tty-Zeileneditor kann nicht konfiguriert werden. Es werden immer durch Leerzeichen getrennte Wörter (ASCII) gelöscht. Es kommt selten vor, dass Sie mit dem tty-Zeileneditor interagieren. Dies erhalten Sie beispielsweise, wenn Siecat
ohne Argument tippen . Wenn Sie dort ausgefallene Tastenkombinationen wünschen, können Sie den Befehl unter einem Tool wie rlwrap ausführen , das readline verwendet.Bash bietet zwei Befehle zum Löschen des vorherigen Wortes :
unix-word-rubout
( Ctrl+ woder wie durchgesetztstty werase
) undbackward-kill-word
(M-DEL
, dh Esc Backspace), die ein Wort als eine Folge von alphanumerischen Zeichen im aktuellen Gebietsschema und behandeln_
. Wenn Sie möchten, dass Ctrl+ Backspacedie vorherige Folge von alphanumerischen Zeichen löscht, setzen Sie nichtstty werase
und setzen Sie stattdessen die folgende Zeile in Ihre.inputrc
:Beachten Sie, dass dies voraussetzt, dass Ihr Terminal das Zeichen Strg + H für Ctrl+ sendet Backspace. Leider ist es einer dieser Schlüssel ohne Standardbindung (und Backspaceinsbesondere aus historischen Gründen ein Chaos ).
Es gibt auch einen symmetrischen Befehl,
kill-word
der standardmäßig anM-d
( Alt+ D) gebunden ist . Um es an Ctrl+ zu binden Delete, müssen Sie zuerst herausfinden, welche Escape-Sequenz Ihr Terminal sendet, und dann eine entsprechende Zeile in Ihr Terminal einfügen.inputrc
. Geben Sie Ctrl+ Vdann Ctrl+ ein Delete. Dadurch wird etwa so eingefügt,^[[3;5~
dass die Initiale^[
eine visuelle Darstellung des Escape-Zeichens ist. Dann ist die BindungWenn Sie mit keiner der beiden Definitionen eines Wortes zufrieden sind, können Sie Ihre eigene in bash bereitstellen: siehe verwirrendes Verhalten von Tastenkombinationen im Emacs-Stil in bash
quelle
Ctrl+Del
hat gut funktioniert. Ich kann jedoch nichtCtrl+Backspace
zur Arbeit kommen. DennCtrl+v, Ctrl+Backspace
mein Terminal sagt^?
. Was soll ich in die setzen.inputrc
? Vielen Dank"\C-?": backward-kill-word
oder eine beliebige Readline-Funktion, die Sie möchten. Sie können jedoch nur dann eine Bindung für Strg + Rücktaste definieren, die sich von der Bindung für Rücktaste unterscheidet, wenn unterschiedliche Zeichen gesendet werden. Wenn Ihr Terminal^?
sowohl Rücktaste als auch Strg + Rücktaste sendet , kann die im Terminal ausgeführte Anwendung diese nicht unterscheiden. Einige Terminals können konfiguriert werden (z. B. xterm, urxvt), andere (z. B. VTE-basierte Terminalemulatoren) nicht.~/.inputrc
die Standardeinstellung deaktiviert/etc/inputrc
. Um dies zu beheben, müssen Sie diese Datei einschließen:$include /etc/inputrc
(von hier )Versuchen
alt+backspace
In elementaren Betriebssystemen funktioniert es so, wie Sie es möchten (genau wie ctrl+ backspace)
quelle
Das Verhalten des werase Charakters in gekochten Modus - Terminal - Verarbeitung wird einprogrammiert , in Linux mindestens:
Wörter sind also Buchstaben, Ziffern und Unterstriche. Dies ist immer so in einem Terminal unter Linux, wenn eine Anwendung, die ihre eigene Verarbeitung im gekochten Modus ausführt, nicht ausgeführt wird.
Readline--Version (verwendet von bash und anderen) scheint ein wenig anders als die Kernel-Version zu sein, aber es scheint auch zu fest einprogrammiert :
Aber das scheint nicht mit dem übereinzustimmen, was
bash
ich eigentlich mache:foo+bar^W
löscht alles, nicht nurbar
. Weitere Informationen dazu finden Sie hier .quelle
backward-kill-word
(StandardbindungM-DEL
) stattunix-word-rubout
.