web-dev-qa-db-de.com

Unterschiedliche Bash-Aufforderung für einen anderen vi-Bearbeitungsmodus

Wenn Sie den vi-Modus (set -o vi) mit Bash verwenden, wäre es nett, eine Aufforderung zu haben, die vom aktuellen Modus abhängt (Einfügen oder Befehl). Wie findet man diesen Bearbeitungsmodus heraus?

B.t.w, das scheint in ZSH möglich zu sein:

108
Thomas

Fresh bash 4.3 und readline 6.3 haben etwas für euch ... aus dem changelog:

4.  New Features in Readline
j.  New user-settable variable, show-mode-in-Prompt, adds a characters to the
    beginning of the Prompt indicating the current editing mode.

So setzen

set show-mode-in-Prompt on

in/etc/inputrc oder ~/.inputrc (thx stooj) sollte sich auf alle Ihre readline-fähigen Programme auswirken;)

59
eMPee584

Nach dem Durchsuchen von Google, dem Durchsuchen der bash-Manpage und dem Durchsuchen des bash-Quellcodes (lib/readline/vi_mode.c) scheint es keine einfache Möglichkeit zu geben, die Eingabeaufforderung zu ändern, wenn Sie vom Einfügemodus in den Befehlsmodus wechseln. Es sieht so aus, als könnte hier jemand die Möglichkeit haben, die bash-Quelle zu patchen, da die Modi in der Quelle aufgerufen und gestoppt werden müssen.

Als ich Ihren Beitrag gesehen habe, habe ich mich für die Einstellung des bash vi-Modus interessiert. Ich liebe vi und würde warum nicht auf der Kommandozeile. Es sieht jedoch so aus, als müssten wir nachverfolgen, ob wir uns ohne Eingabeaufforderung im Einfügemodus befinden (also in vielen Forenbeiträgen). Macht es etwas einfacher, aber nicht immer so intuitiv.

Ich stelle Ihre Frage, denn ich bin daran interessiert zu sehen, wohin das führt.

19
Jeremy Heslop

Bash 4.4/Readline 7.0 fügt Unterstützung für vom Benutzer einstellbare Moduszeichenfolgen hinzu .

Sie können die Betaversionen ausprobieren, aber im Moment wirken sie etwas fehlerhaft. Sie unterstützen auch noch nicht die Angabe, wo in der Eingabeaufforderung die Modusanzeige erscheinen soll (was meiner Meinung nach die Mörderfunktion ist).

Wenn Sie nicht warten möchten und keine Angst vor einer kleinen Zusammenstellung haben, habe ich Patch-Versionen von bash 4.3 und readline 6.3 in github veröffentlicht, die diese Funktionalität unterstützen.

Mit den gepatchten Versionen können Sie Folgendes tun:

 enter image description here

Weitere Informationen einschließlich der Installation finden Sie unter https://github.com/calid/bash

18
Dylan Cali

Multiline Prompt und .inputrc

Inputrc hat die Option, einen + für Einfügung und : für den normalen Modus anzuzeigen, indem set show-mode-in-Prompt on in den ~/.inputrc eingefügt wird, wie es eMPee584 geschrieben hat. Dies funktioniert jedoch nicht gut mit Multiline-Prompt (mit älteren Versionen von bash und readline).

Eine Lösung besteht aus einer einzelnen Zeile PS1 (>) und einer Funktion, die vor der Eingabeaufforderung etwas anzeigt. Es ist in bash integriert und heißt Prompt_COMMAND.

function Prompt {
    PS1=' > '
    echo -e "$(date +%R)  $PWD"
}

Prompt_COMMAND='Prompt' 

Die üblichen Eingabeaufforderungszeichenfolgen sind im Echo von printf nicht verfügbar. Der -e dient zum Interpretieren von Farbcodes, und es ist nicht erforderlich, \[ oder \] hinzuzufügen, was ohnehin nicht funktioniert.

Einfügen -Modus:

20:57   /home/sshbio/dotfiles/bash
+ > _

Normaler Modus:

20:57   /home/sshbio/dotfiles/bash
: > _

Durch Drücken der Tabulatortaste wird nur die PS1 wiederholt, was für mich sinnvoll ist:

20:57   /home/sshbio/dotfiles/bash
+ > ls _
bashrc      bash_profile     inputrc
+ > ls _

Preview(Quelle)

7
user3034472

Ich versuche auch einen Indikator für den BASH vi-Modus zu erhalten, und Sie haben alle gelernt, dass es einfach klingt und bisher noch nicht möglich ist.

Mein aktueller Ansatz ist: "a" drücken, wenn ich nicht sicher bin, welcher Modus ist. Wenn 'a' nach BASH PROMOT erscheint, lerne ich, dass ich im 'INSERT'-Modus bin. Dann drücke ich auf 'RETURN' und fahre fort. Dies ist eine einfache Möglichkeit für mich, den kleinen Ärger zu lösen.

Übrigens, ich 'alias a =' cal 'oder etwas anderes, um dem leeren Treffer' einen 'kleinen Nutzen zu geben.

0
Andrew_1510

für mehrzeilige Eingabeaufforderung wie folgt image

meine Arbeit ist so

mein Bash Prompt

export PS1=" ┌錄 \[\e[32m\]\u\[\e[m\]\[\e[32m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\] \w \\$ \n "

.inputrc

set show-mode-in-Prompt on
set vi-ins-mode-string " └──錄 (ins):"
set vi-cmd-mode-string " └──錄 (cmd):"

hoffe das hat dir geholfen

0
mark