Strg-Rücktaste und Strg-Löschen in Bash

14

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?

Wolf-Revo-Katzen
quelle
1
Ihre Shell unterstützt möglicherweise diese Aktionen, die an einen bestimmten Schlüssel gebunden sein können.
Thomas Dickey
@ ThomasDickey: Ich benutze Bash. Es ist in Ordnung, wenn es nur in Bash funktioniert.
Wolf-Revo-Katzen

Antworten:

27

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 weraseAktion 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 Sie catohne 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 durchgesetzt stty werase) und backward-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 nicht stty weraseund setzen Sie stattdessen die folgende Zeile in Ihre .inputrc:

"\C-h": backward-kill-word

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-wordder standardmäßig an M-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 Bindung

"\e[3;5~": kill-word

Wenn 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

Gilles 'SO - hör auf böse zu sein'
quelle
2
ausgezeichnete Erklärung! Das Ctrl+Delhat gut funktioniert. Ich kann jedoch nicht Ctrl+Backspacezur Arbeit kommen. Denn Ctrl+v, Ctrl+Backspacemein Terminal sagt ^?. Was soll ich in die setzen .inputrc? Vielen Dank
Ciprian Tomoiagă
3
@CiprianTomoiaga "\C-?": backward-kill-wordoder 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.
Gilles 'SO - hör auf böse zu sein'
4
Es ist wichtig zu beachten, dass das Definieren ~/.inputrcdie Standardeinstellung deaktiviert /etc/inputrc. Um dies zu beheben, müssen Sie diese Datei einschließen: $include /etc/inputrc(von hier )
Ciprian Tomoiagă
+1 für Esc + Backspace
Celal Ergün
6

Versuchen

alt+backspace

In elementaren Betriebssystemen funktioniert es so, wie Sie es möchten (genau wie ctrl+ backspace)

Ahmed Elkoussy
quelle
1

Das Verhalten des werase Charakters in gekochten Modus - Terminal - Verarbeitung wird einprogrammiert , in Linux mindestens:

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

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 :

Wörter bestehen aus Buchstaben und Ziffern.

Aber das scheint nicht mit dem übereinzustimmen, was bashich eigentlich mache: foo+bar^Wlöscht alles, nicht nur bar. Weitere Informationen dazu finden Sie hier .

Celada
quelle
1. vi Benutzer sucht wahrscheinlich nur nach backward-kill-word(Standardbindung M-DEL) statt unix-word-rubout.
Gilles 'SO - hör auf böse zu sein'