2012-12-23 7 views
7

Ho bisogno di un modo semplice (o complesso) per capire in quale modalità si trova l'utente. Devo sapere se l'utente è in Normale, Inserisci, Visual, Sostituisci, Cambia, ecc.Vim: Come rilevare la modalità in cui si trova l'utente, per statusline?

Sono consapevole del fatto Funzione mode(), tuttavia non riesco a capire come far produrre una stringa intera invece di un solo carattere.

Il mio piano era di creare una funzione che modificasse dinamicamente i colori di sfondo e di primo piano della riga di stato in base alla stringa restituita da mode(). Fondamentalmente una funzione con un gruppo di ifs e elseifs che lo farebbe per me. C'è un difetto con questo approccio, però, non posso sapere quale colore il setup del tema di default per quello.

Quindi, in pratica, ho bisogno di un po 'di suggerimenti/aiuto su come fare una funzione che esegue le operazioni seguenti:.

  • sa quale modo l'utente è in Il resto delle funzioni reagiscono in modo diverso ogni volta che questo cambia.
  • Imposta alcune variabili con valori fg e bg che riflettono ciò che il tema corrente ha impostato per loro.
  • Modifica il primo piano e lo sfondo della riga di stato in base a questi valori.

Ho provato a farlo, ma era un modo molto crudo di farlo e non ha funzionato affatto. Ha solo impostato i colori una sola volta e successivamente non ha reagito ogni volta che è cambiato.

Grazie per il vostro aiuto! :)

EDIT:

Abbastanza sicuro di quello che ho provato prima di allora non ha funzionato è stato questo:

function! StatuslineModeColor() 
    let s:StatuslineMode=mode() 
    if s:StatuslineMode == 'n' 
     hi Statusline ctermbg=blue guibg=blue 
    elseif s:StatuslineMode == 'i' 
     hi Statusline ctermbg=red guibg=red 
    endif 
endfunc 

E nella linea di status ho messo il seguente:

let &stl.='%{StatuslineModeColor()}' 

EDIT 2:

Ho capito che in pratica quello che devo fare è trovare un modo per afferrare qualsiasi colore s il tema stava usando prima. Questo è se io uso questa soluzione: http://www.reddit.com/r/vim/comments/gexi6/a_smarter_statusline_code_in_comments/c1n2oo5

Tuttavia, questa soluzione non è l'ideale nei miei standard, perché non è pulita, o pulita come potrebbe essere poiché crea un sacco di confusione. :/

+0

@romainl Fatto, ho dimenticato di aggiungere quello. :) Non è la funzione esatta che ho usato prima, ma è abbastanza vicino. – greduan

+0

@romainl Mi sembra di aver trovato una buona versione di Reddit di questo: http://www.reddit.com/r/vim/comments/gexi6/a_smarter_statusline_code_in_comments/c1n2oo5 L'unico problema è che non acquisisce i valori da il tema stesso, quale potrebbe essere un buon modo per farlo? – greduan

+0

1. A cosa serve 'mode()' per produrre una stringa completa? 2. Che cosa fa la variabile locale script nella tua funzione? Dovrebbe essere locale ('l:' o niente al posto di 's:'). – ZyX

risposta

2

Aggiornamento ottobre 2016: da allora i miei dotfile sono trasferiti a https://gitlab.com/greduan/dotfiles, in modo che il nuovo URL per il file è: https://gitlab.com/greduan/dotfiles/blob/76e16dd8a04501db29989824af512c453550591d/vim/after/plugin/statusline.vim

Tutte le linee sono le stesse.


Dal momento che nessuno si avvicinò con una risposta che ho fatto la mia soluzione, si può trovare qui: https://github.com/Greduan/dotfiles/blob/76e16dd8a04501db29989824af512c453550591d/vim/after/plugin/statusline.vim#L3-L42

Fondamentalmente si fa quanto segue:

Lines 3 to 23 definire una variabile globale con un dizionario contenente tutte le diverse modalità, traducendole in un testo leggibile.Così n che sta per normale viene tradotta a Normal, i-Insert ecc

Lines 25 to 42 definire la funzione che cambierà i colori del statusline. Attualmente supporta solo Solarized e solo se la tua versione ha questo fork/pull request. Se soddisfi questi requisiti otterrai uno sfondo rosso quando sei in modalità di inserimento e uno sfondo verde quando in qualsiasi tipo di modalità visiva, il resto delle modalità è lo stesso del normale.

E lines 118 to 119 inserisce la funzione definita nella riga di stato e inoltre emette la modalità corrente in un formato di testo utilizzando la variabile globale definita dalle linee 3 to 23.

Credo che questa sia una soluzione molto più pulita rispetto a quella normalmente utilizzata (comandi automatici e cose del genere che ho visto). Fondamentalmente, l'unica pecca è che non c'è modo di conoscere le variabili del tema, ma ovviamente puoi fare hi! link StatusLine Error, il che farebbe sì che la linea di stato abbia la stessa evidenziazione della sintassi degli errori del tuo tema.

Spero che questo aiuti!

+0

Il repository git referenziato è stato rimosso. – Von

+0

@ Von grazie, ho aggiunto una nota per rispondere. :) – greduan

Problemi correlati