Prompt di bash diverso per diverse modalità di modifica di vi?


113

Quando si utilizza la modalità vi (set -o vi) con Bash, sarebbe bello avere un prompt che dipende dalla modalità in cui ci si trova attualmente (inserimento o comando). Come si scopre questa modalità di modifica?

A proposito, questo sembra essere possibile in ZSH :

bash  prompt 

Sono curioso anche di questo. Ho cercato nella documentazione di bash, ma non ho trovato nulla.
Andrew Ferrier

Risposte:


67

Fresh bash 4.3 e readline 6.3 hanno qualcosa per voi ragazzi .. dal 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.

Quindi mettere

set show-mode-in-prompt on

in / etc / inputrc o ~ / .inputrc (thx stooj) dovrebbe influenzare tutti i tuoi programmi abilitati per readline;)


qualsiasi stato su questo? Sto cercando di trovare qualcosa di simile (non per bash ma per altri prompt basati su readline che uso). Ho cercato su Google e non ho trovato nessun altro aggiornamento (a parte questo e l'articolo a cui hai fatto riferimento )
Mike HR

4
Basta aggiungere da eMPee584 - se stai eseguendo bash 4.3 o versioni successive, aggiungi quanto segue al tuo set di file ~ / .inputrc show-mode-in-prompt Questo aggiunge un + all'estrema sinistra del prompt se sei in modalità di modifica e a: se sei in modalità di comando.
stooj

3
Quindi, mentre questo funziona; c'è un modo per spostarsi dove si trova questo personaggio in modalità vi nel prompt? Se hai prompt su più righe (personalizzati) non funziona molto bene :)
James Mills

Per 4.3 è sempre all'inizio del prompt e, sfortunatamente, readline ridisegnerà solo l'ultima riga di un prompt su più righe. Vedere la risposta "Multiline prompt e .inputrc" per una soluzione alternativa o vedere la risposta sull'applicazione di patch a bash 4.3 con la correzione di 4.4 per questo.
studgeek

20

Bash 4.4 / Readline 7.0 aggiungerà il supporto per le stringhe in modalità impostabili dall'utente .

Puoi provare le versioni beta, ma al momento sembrano un po 'buggate. Inoltre, non supportano ancora la specifica del punto in cui si desidera visualizzare l'indicatore di modalità (che penso sia la caratteristica killer).

Se non vuoi aspettare e non hai paura di una piccola compilazione, ho pubblicato versioni patchate di bash 4.3 e readline 6.3 su github che supportano questa funzionalità.

Con le versioni patchate puoi fare cose come questa:

inserisci qui la descrizione dell'immagine

Maggiori dettagli, incluso come installare, sono disponibili su https://github.com/calid/bash


19

Dopo aver cercato su google, guardando attraverso la pagina man di bash e poi guardando attraverso il codice sorgente di bash (lib / readline / vi_mode.c) sembra che non ci sia un modo semplice per cambiare il prompt quando si passa dalla modalità di inserimento alla modalità di comando. Sembra che qui potrebbe esserci un'opportunità per qualcuno di patchare la fonte bash, poiché ci sono chiamate per avviare e arrestare le modalità nella fonte.

Dopo aver visto il tuo post, mi sono interessato all'impostazione della modalità bash vi. Adoro vi e perché no sulla riga di comando. Tuttavia sembra che dovremo tenere traccia del fatto che siamo in modalità di inserimento senza una rapida modifica (così dicono molti post del forum) Per quello che vale, sei sempre in modalità di inserimento a meno che non premi ESC. Lo rende un po 'più semplice, ma non sempre così intuitivo.

Alzo la tua domanda perché mi interessa vedere dove va a finire.


7

Prompt multilinea e .inputrc

Inputrc ha un'opzione per mostrare una +per l'inserimento e :per la modalità normale, con l'aggiunta set show-mode-in-prompt onnel ~/.inputrccome scriveva eMPee584, ma questo non funziona bene con multilinea prompt (con le vecchie versioni di bash e readline).

Una soluzione è avere una sola riga PS1( >) e una funzione che fa eco a qualcosa prima del prompt. È integrato in bash e chiamato PROMPT_COMMAND.

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

PROMPT_COMMAND='prompt' 

Le solite stringhe di prompt non sono disponibili in echo di printf. Serve -eper interpretare i codici colore, e non è necessario aggiungere \[o \], che comunque non funziona.

Modalità di inserimento :

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

Modalità normale :

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

Premendo tab , viene ripetuta solo la PS1, il che ha senso per me:

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

Anteprima (Fonte)


Se si utilizzano colori in vi-cmd-mode-stringo vi-ins-mode-string, questi dovrebbero essere preceduti da \1e postfissati da \2. Vedi qui . Inoltre, \[e \[dovrebbe ancora essere emesso, ma avrai bisogno \\[e \\]all'interno di printf.
Tom Hale

1

Questo è quello che ho dentro ~/.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

La modalità di inserimento è colorata in blu.

└──[ins]

La modalità di comando è colorata di giallo.

└──[cmd]

Lo svantaggio è che non viene visualizzato su un ttysignificato che funziona solo su un emulatore di terminale solo i colori.


0

Cerco anche di ottenere un indicatore per la modalità BASH vi, e avete imparato tutti che sembra semplice e non c'è ancora modo di farlo.

Il mio approccio attuale è: premi "a" quando non sono sicuro di quale modalità sia. SE 'a' appare dopo BASH PROMOT, apprendo di essere in modalità 'INSERT'. POI, premo "RITORNO" e continuo. Questo è un modo semplice per me per risolvere il piccolo fastidio.

A proposito, io 'alias a =' cal ', o qualcos'altro per dare all'hit vuoto' un 'piccola utilità.


2
Avrebbe più senso per me premere semplicemente "esc || c- [" piuttosto che a. Quindi non devi guardare per sapere in che modalità sei; o inserisci caratteri indesiderati che devi rimuovere (o premi Invio)
wom

0

per il prompt Multiline come questa immagine

il mio lavoro intorno è così

il mio prompt di bash

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

spero che questo ti abbia aiutato


0

Prompt e stili diversi del cursore tramite .inputrc

Per prima cosa dovresti assicurarti di eseguire una versione bash superiore a 4.3:

$ bash --version
GNU bash, version 4.4

Quindi inserisci le seguenti righe nel tuo ~/.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 modalità comando, il cursore viene visualizzato come blocco.
In modalità di inserimento, il cursore viene visualizzato come barra verticale.

Il prompt stesso sarà quindi simile a questo a seconda della modalità:

(cmd)$ ... 
(ins)$ ...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.