2009-06-24 24 views
102

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 può scoprire questa modalità di modifica?Richiesta bash diversa per la modalità di modifica vi diversa?

Btw, questo sembra essere possibile in ZSH:

+0

Sono curioso anche di questo. Sono stati a caccia attraverso la documentazione di bash, ma non ho trovato nulla. –

risposta

0

Anche se non è una soluzione ad un passo, un modo si potrebbe ottenere questo è quello di scrivere uno script che modifica sia la modalità di modifica e il prompt contemporaneamente & utilizzo detto sceneggiatura esclusivamente quando si cambiano le modalità.

IE: Avere uno script chiamato bash-VI che esegue "set -o vi; PS1='desired vi mode prompt';"


Edit: (Non posso commentare ancora) che vedo, credo che non ho letto la questione con sufficiente attenzione & trascurato il riferimento inserire la modalità di comando &. Non sono sicuro di come farlo. Di solito non è stato un problema per me dato che uso solo la modalità di comando per operazioni brevi - posso capire perché sarebbe utile comunque.

+1

No, quello che Thomas sta chiedendo è diverso. Con 'set -o vi' on, vuole un prompt visibilmente diverso quando preme , e poi di nuovo il prompt originale quando preme . – ephemient

19

Dopo aver cercato google, guardando la pagina man bash e poi guardando attraverso il codice sorgente bash (la lib/readline/vi_mode.c) sembra che non ci sia un modo semplice per cambiare il prompt quando si passa dalla modalità di inserimento a modalità di comando. Sembra che potrebbe esserci un'opportunità qui per qualcuno per patchare il sorgente bash anche se ci sono chiamate per l'avvio e l'arresto delle modalità nel sorgente.

Dopo aver visto il tuo post mi ha interessato l'impostazione della modalità bash vi. Io amo vi e vorrei perché non sulla linea di comando. Tuttavia sembra che dovremo tenere traccia del fatto che siamo in modalità di inserimento senza una modifica immediata (così dicono molti post del forum) Per quello che vale, sei sempre in modalità di inserimento a meno che non premi ESC. Rende un po 'più semplice, ma non sempre intuitivo.

Sto alzando la tua domanda perché sono interessato a vedere dove questo va.

0

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

Il mio approccio attuale è: premere 'a' quando non sono sicuro quale sia la modalità. SE 'A' appare dopo BASH PROMOT, imparo che sono in modalità 'INSERT'. ALLORA, premo 'INVIO' e continuo. Questo è un modo facile per me per risolvere il piccolo fastidio.

A proposito, sono "alias" = "cal", o qualcos'altro per dare "una" piccola utilità vuota.

+2

Avrebbe più senso per me semplicemente premere "esc || c- [" piuttosto che a. Quindi non devi cercare di sapere in quale modalità ti trovi; o inserire caratteri indesiderati che devi rimuovere (o premere invio) – wom

54

bash dolce 4,3 e 6,3 readline 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. 

Così mettendo

set show-mode-in-prompt on 

in/etc/inputrc o ~/.inputrc (thx stooj) dovrebbe interessare tutti i programmi abilitati alla lettura;)

+0

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 si fa riferimento] (http://cnswww.cns.cwru.edu/php/chet/readline/CHANGES)) –

+3

Basta aggiungere da eMPee584 - se si sta utilizzando bash 4.3 o versioni successive, aggiungere quanto segue al proprio file ~/.inputrc set show-mode-in-prompt Aggiunge un + all'estrema sinistra del prompt se si è in modalità di modifica e un : se si è in modalità di comando. – stooj

+3

Quindi mentre questo funziona; c'è un modo per muoversi dove si trova questo personaggio in modalità vi? Se disponi di prompt su più righe (personalizzato), non funziona così bene :) –

16

Bash 4.4/Readline 7.0 will add support for user-settable mode strings.

Puoi provare le versioni beta, ma al momento sembrano un po 'buggate. Inoltre, non supportano ancora la specifica di dove nel prompt si desidera che l'indicatore della modalità si verifichi (che credo sia la caratteristica killer).

Se non si desidera attendere e non si ha paura di una piccola compilazione, ho pubblicato versioni con patch di bash 4.3 e readline 6.3 su github che supportano questa funzionalità.

Con la versione patchata che si possono fare cose come questa:

enter image description here

Maggiori dettagli, tra cui le modalità di installazione, sono disponibili presso https://github.com/calid/bash

6

multilinea pronta e .inputrc

inputrc ha un'opzione per mostrare un + per l'inserimento e : per la modalità normale, aggiungendo set show-mode-in-prompt on nel ~/.inputrc come ha scritto eMPee584, ma questo non funziona bene con prompt multilinea.

Una soluzione è una linea singola PS1 (>) e una funzione che fa eco a qualcosa prima del prompt. È costruito in bash e chiamato PROMPT_COMMAND.

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

PROMPT_COMMAND='prompt' 

I normali stringhe di prompt non sono disponibili in eco di printf. -e interpreta i codici colore e non è necessario aggiungere \[ o \], che tuttavia non funziona.

Inserire modalità:

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

normale modalità:

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

scheda pressione, solo il PS1 si ripete, che ha senso per me:

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

Preview (Source)

+0

Se usi i colori in' vi-cmd-mode-string' o 'vi-ins-mode-string', questi dovrebbero essere preceduto da '\ 1' e suffisso da' \ 2'. Vedi [qui] (https://www.gnu.org/software/bash/manual/bash.html#Readline-Init-File). ['e' \ ['dovrebbe ancora essere emesso, ma avrai bisogno di' \\ ['e' \\] 'all'interno di printf. –

Problemi correlati