Unterschiedliche Bash-Eingabeaufforderung für unterschiedlichen vi-Bearbeitungsmodus?


113

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?

Übrigens scheint dies in ZSH möglich zu sein :

bash  prompt 

Bin auch neugierig. Ich habe die Bash-Dokumentation durchgesehen, aber nichts gefunden.
Andrew Ferrier

Antworten:


67

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;)


irgendeinen Status dazu? Ich versuche so etwas zu finden (nicht für Bash, sondern für andere Readline-basierte Eingabeaufforderungen, die ich verwende). Ich habe gegoogelt und kein anderes Update gefunden (abgesehen von diesem und dem Artikel, auf den Sie verwiesen haben )
Mike HR

4
Einfaches Hinzufügen von eMPee584 - Wenn Sie Bash 4.3 oder höher ausführen, fügen Sie Folgendes zu Ihrer ~ / .inputrc-Dateigruppe hinzu. Show-mode-in-prompt Dies fügt ein + ganz links von Ihrer Eingabeaufforderung hinzu, wenn Sie sich im Bearbeitungsmodus befinden und a: wenn Sie sich im Befehlsmodus befinden.
stooj

3
Also, während das funktioniert; Gibt es eine Möglichkeit, sich dorthin zu bewegen, wo sich dieser vi-Modus-Charakter in der Eingabeaufforderung befindet? Wenn Sie mehrzeilige Eingabeaufforderungen (benutzerdefiniert) haben, funktioniert dies nicht so gut :)
James Mills

Für 4.3 steht es immer am Anfang der Eingabeaufforderung und leider zeichnet readline nur die letzte Zeile einer mehrzeiligen Eingabeaufforderung neu. Eine Problemumgehung finden Sie in der Antwort "Multiline-Eingabeaufforderung und .inputrc" oder in der Antwort zum Patchen von Bash 4.3 mit 4.4-Korrektur.
Studgeek

20

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:

Geben Sie hier die Bildbeschreibung ein

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


19

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.


7

Mehrzeilige Eingabeaufforderung und .inputrc

Inputrc hat eine Option , ein zeigen +für Einsatz und :für die normalen Modus, durch Zugabe set show-mode-in-prompt onin dem ~/.inputrcals 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 -eist, 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 _

Vorschau (Quelle)


Wenn Sie Farben in vi-cmd-mode-stringoder verwenden vi-ins-mode-string, sollten diese vorangestellt \1und nachfixiert werden \2. Siehe hier . Auch \[und \[sollte noch ausgegeben werden, aber Sie benötigen \\[und \\]in printf.
Tom Hale

1

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 ttyBedeutung angezeigt wird, sondern nur in einem Terminalemulator nur die Farben.


0

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.


2
Wäre für mich sinnvoller, wenn ich nur "esc || c- [" anstatt a drücke. Dann müssen Sie nicht schauen, um zu wissen, in welchem ​​Modus Sie sich befinden. oder fügen Sie unerwünschte Zeichen ein, die Sie entfernen müssen (oder drücken Sie die
Eingabetaste

0

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


0

Unterschiedlicher Eingabeaufforderungs- und Cursorstil über .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)$ ...
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.