Wenn Sie den vi-Modus (set -o vi) mit Bash verwenden, wäre es schön, eine Eingabeaufforderung zu haben, die von dem Modus abhängt, in dem Sie sich gerade befinden (Einfügen oder Befehl). Wie findet man diesen Bearbeitungsmodus heraus?
Wenn Sie den vi-Modus (set -o vi) mit Bash verwenden, wäre es schön, eine Eingabeaufforderung zu haben, die von dem Modus abhängt, in dem Sie sich gerade befinden (Einfügen oder Befehl). Wie findet man diesen Bearbeitungsmodus heraus?
Antworten:
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.
Also setzen
set show-mode-in-prompt on
in / etc / inputrc oder ~ / .inputrc (thx stooj) sollte sich auf alle Ihre Readline-fähigen Programme auswirken;)
Bash 4.4 / Readline 7.0 bietet Unterstützung für vom Benutzer einstellbare Moduszeichenfolgen .
Sie können die Beta-Versionen ausprobieren, aber sie scheinen im Moment etwas fehlerhaft zu sein. Sie unterstützen auch noch nicht die Angabe, wo in der Eingabeaufforderung die Modusanzeige erscheinen soll (was meiner Meinung nach die Killerfunktion ist).
Wenn Sie nicht warten möchten und keine Angst vor einer kleinen Kompilierung haben, habe ich gepatchte Versionen von Bash 4.3 und Readline 6.3 für Github veröffentlicht, die diese Funktionalität unterstützen.
Mit den gepatchten Versionen können Sie Folgendes tun:
Weitere Informationen, einschließlich der Installation, finden Sie unter https://github.com/calid/bash
Nach der Suche in 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 ob hier jemand die Möglichkeit hat, die Bash-Quelle zu patchen, da es Aufrufe zum Starten und Stoppen der Modi in der Quelle gibt.
Als ich Ihren Beitrag sah, interessierte ich mich für die Bash-Vi-Modus-Einstellung. 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 sofortige Änderung im Einfügemodus befinden (so sagen viele Forenbeiträge). Für das, was es wert ist, befinden Sie sich immer im Einfügemodus, es sei denn, Sie drücken ESC. Macht es ein bisschen einfacher, aber nicht immer so intuitiv.
Ich stelle Ihre Frage, da ich interessiert bin, wohin das führt.
.inputrc
Inputrc hat eine Option , ein zeigen +
für Einsatz und :
für die normalen Modus, durch Zugabe set show-mode-in-prompt on
in dem ~/.inputrc
als eMPee584 schrieb, aber das funktioniert nicht gut mit mehrzeiligen Eingabeaufforderung (mit älteren Versionen von bash und Readline-).
Eine Lösung besteht aus einer einzelnen Zeile PS1
( >
) und einer Funktion, die vor der Eingabeaufforderung etwas wiedergibt. Es ist in Bash eingebaut 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. Das -e
ist, Farbcodes zu interpretieren, und es ist nicht notwendig, \[
oder hinzuzufügen \]
, was sowieso nicht funktioniert.
Einfügemodus :
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 _
Das habe ich in ~/.inputrc
set show-mode-in-prompt on
set vi-ins-mode-string \1\e[34;1m\2└──[ins] \1\e[0m\2
set vi-cmd-mode-string \1\e[33;1m\2└──[cmd] \1\e[0m\2
Einfügemodus ist blau gefärbt.
└──[ins]
Befehlsmodus ist es gelb gefärbt.
└──[cmd]
Der Nachteil ist, dass es nicht in einer tty
Bedeutung angezeigt wird, sondern nur in einem Terminalemulator nur die Farben.
Ich versuche auch, eine Anzeige für den BASH vi-Modus zu erhalten, und Sie alle haben gelernt, dass es einfach klingt und es noch keine Möglichkeit gibt, dies zu tun.
Mein aktueller Ansatz ist: Drücke 'a', wenn ich nicht sicher bin, welcher Modus ist. WENN 'a' nach BASH PROMOT erscheint, erfahre ich, dass ich mich im 'INSERT'-Modus befinde. DANN drücke ich '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' eine 'kleine Nützlichkeit zu geben.
für mehrzeilige Eingabeaufforderung wie dieses Bild
Meine Arbeit ist so
meine Bash-Eingabeaufforderung
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
.inputrc
Zuerst sollten Sie sicherstellen, dass Sie eine Bash-Version ausführen, die höher ist als 4.3
:
$ bash --version
GNU bash, version 4.4
Dann setzen Sie die folgenden Zeilen in Ihre ~/.inputrc
:
#################### VIM ####################
# FOR MORE INFORMATION CHECK:
# https://wiki.archlinux.org/index.php/Readline
# TURN ON VIM (E.G. FOR READLINE)
set editing-mode vi
# SHOW THE VIM MODE IN THE PROMPT (COMMAND OR INSERT)
set show-mode-in-prompt on
# SET THE MODE STRING AND CURSOR TO INDICATE THE VIM MODE
# FOR THE NUMBER AFTER `\e[`:
# 0: blinking block
# 1: blinking block (default)
# 2: steady block
# 3: blinking underline
# 4: steady underline
# 5: blinking bar (xterm)
# 6: steady bar (xterm)
set vi-ins-mode-string (ins)\1\e[5 q\2
set vi-cmd-mode-string (cmd)\1\e[1 q\2
Im Befehlsmodus wird der Cursor als Block angezeigt.
Im Einfügemodus wird der Cursor als vertikaler Balken angezeigt.
Die Eingabeaufforderung selbst sieht dann je nach Modus folgendermaßen aus:
(cmd)$ ...
(ins)$ ...