Andere bash-prompt voor verschillende vi-bewerkingsmodus?

Als je de vi-modus (set -o vi) met Bash gebruikt, zou het fijn zijn om een ​​prompt te hebben die afhangt van de modus waarin je je momenteel bevindt (insert of command). Hoe kom je achter deze bewerkingsmodus?

Btw, dit lijkt mogelijk te zijn in ZSH:


Antwoord 1, autoriteit 100%

Fresh bash 4.3 en readline 6.3 hebben iets voor jullie.. uit de 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.

Dus zetten

set show-mode-in-prompt on

in /etc/inputrc of ~/.inputrc (thx stooj) zou van invloed moeten zijn op al je readline-enabled programma’s 😉


Antwoord 2, autoriteit 33%

Bash 4.4 / Readline 7.0 voegt ondersteuning toe voor de door de gebruiker instelbare modus tekenreeksen.

Je kunt de bètaversies proberen, maar ze lijken op dit moment een beetje buggy. Ze ondersteunen ook nog niet het specificeren waar in de prompt je de modusindicator wilt laten verschijnen (wat volgens mij de killer-functie is).

Als je niet wilt wachten en niet bang bent voor een kleine compilatie, heb ik gepatchte versies van bash 4.3 en readline 6.3 op github gepubliceerd die deze functionaliteit ondersteunen.

Met de gepatchte versies kun je dit soort dingen doen:

Meer details, waaronder hoe te installeren, zijn beschikbaar op https://github.com/calid/bash


Antwoord 3, autoriteit 26%

Na google te hebben doorzocht, door de bash-manpagina te hebben gekeken en vervolgens door de bash-broncode (de lib/readline/vi_mode.c) te hebben gekeken, lijkt het erop dat er geen gemakkelijke manier is om de prompt te wijzigen bij het overschakelen van de invoegmodus naar het commando modus. Het lijkt erop dat er hier een mogelijkheid is voor iemand om de bash-bron te patchen, aangezien er oproepen zijn voor het starten en stoppen van de modi in de bron.

Toen ik je bericht zag, raakte ik geïnteresseerd in de instelling van de bash vi-modus. Ik ben dol op vi en zou waarom niet op de opdrachtregel. Het lijkt er echter op dat we moeten bijhouden of we in de invoegmodus zijn zonder een snelle verandering (zo zegt veel forumberichten). Voor wat het waard is, je bent altijd in de invoegmodus, tenzij je op ESC drukt. Maakt het een beetje makkelijker, maar niet altijd even intuïtief.

Ik stel uw vraag hoger omdat ik benieuwd ben waar dit naartoe gaat.


Antwoord 4, autoriteit 10%

Meerdere regels prompt en .inputrc

Inputrc heeft een optie om een ​​+voor insert en :voor normale modus te tonen, door set show-mode-in-prompt onin de ~/.inputrczoals eMPee584 schreef, maar dit werkt niet goed met multiline prompt (met oudere versies van bash en readline).

Een oplossing is om een ​​enkele regel PS1(>) en een functie te hebben die iets echo vóór de prompt. Het is ingebouwd in bash en heet PROMPT_COMMAND.

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

De gebruikelijke promptstrings zijn niet beschikbaar in de echo van printf. De -eis om kleurcodes te interpreteren, en het is niet nodig om \[of \]toe te voegen, wat sowieso niet werkt.

Invoegenmodus:

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

Normalemodus:

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

Door op tabte drukken, wordt alleen de PS1 herhaald, wat logisch is voor mij:

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


(Bron)


Antwoord 5, autoriteit 8%

Andere prompt en cursorstijl via .inputrc

Eerst moet je ervoor zorgen dat je een bash-versie gebruikt die hoger is dan 4.3:

$ bash --version
GNU bash, version 4.4

Plaats vervolgens de volgende regels in uw ~/.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

In de opdrachtmodus wordt de cursor weergegeven als blok.
In de invoegmodus wordt de cursor weergegeven als een verticale balk.

De prompt zelf ziet er dan als volgt uit, afhankelijk van de modus:

(cmd)$ ... 
(ins)$ ...

Antwoord 6, autoriteit 8%

Dit is wat ik heb 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

Invoegmodus is deze blauw gekleurd.

└──[ins]

Opdrachtmodus is deze geel gekleurd.

└──[cmd]

Het nadeel is dat het niet wordt weergegeven op een tty, wat betekent dat het alleen op een terminalemulator werkt, alleen de kleuren.


Antwoord 7, autoriteit 8%

Spacemacs-stijl gekleurde cursor

Deze setup komt overeen met de spacemacs-cursor met dotspacemacs-colorize-cursor-according-to-stateingesteld op t.

set editing-mode vi
set vi-ins-mode-string \1\e[5 q\e]12;green\a\2
set vi-cmd-mode-string \1\e[1 q\e]12;orange\a\2
set show-mode-in-prompt on


Antwoord 8, autoriteit 3%

voor Multiline prompt zoals deze
afbeelding

mijn werk is als volgt

mijn 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):"

ik hoop dat dit je heeft geholpen


Antwoord 9

Ik probeer ook een indicator voor de BASH vi-modus te krijgen, en jullie hebben allemaal geleerd dat het eenvoudig klinkt en gewoon nog geen manier is om het te doen.

Mijn huidige aanpak is: druk op ‘a’ als ik niet zeker weet welke modus is. ALS ‘a’ verschijnt na BASH PROMOT, leer ik dat ik in ‘INSERT’-modus ben. DAN klik ik op ‘RETURN’ en ga verder. Dit is voor mij een gemakkelijke manier om de kleine ergernis op te lossen.

Trouwens, ik ‘alias a=’cal’, of iets anders om de lege hit ‘een’ nut te geven.

Other episodes