Colore di primo piano SpecialKey con set di cursori


9

In queste domande e risposte , si osserva che esiste un gruppo di evidenziazione per CursorLineNr, che si applica al numero di riga per la linea del cursore quando set cursorlineè attivo.

Ho notato che l'uso della linea di cursore cambia anche il colore per un altro gruppo di evidenziazione SpecialKey, che si applica se si dispone, ad esempio:

 set list listchars=tab:\|_,trail:-

Il problema con questo per me è che uso uno sfondo scuro (e quindi una linea di cursore scura). Anche la mia SpecialKeyimpostazione normale è molto scura, quindi i listcharsimboli sono solo marginalmente visibili. Ma usando cursorline sono bianchi , il che rende il trailpersonaggio indistinguibile dall'aver effettivamente colpito -. Il carattere trail viene utilizzato ogni volta che si digita uno spazio alla fine di una riga, quindi questo è più di un problema minore; in genere la digitazione di una riga dall'inizio alla fine comporta un numero di spazi che dovrebbero essere facilmente distinti da un errore di battitura durante il lavoro (o viceversa, un errore di battitura quando si intendeva un trattino).

Poiché nessuno degli altri gruppi di evidenziazione sembra essere interessato, CursorLineNrpresumibilmente viene applicato qualcosa di simile , ma guardando l' hielenco non vedo nulla di appropriato.

Qualcuno sa di cosa si tratta? Meglio ancora, qualcuno sa come modificare un gruppo di evidenziazione per la linea di cursore?


2
Ho solo evidenziare brevemente linea cursore dopo aver saltato 2 o più righe. Quando sto modificando il testo, la linea del cursore è disattivata. Se riesci ad abituarti a quel comportamento, potrebbe mitigare il tuo problema.
joeytwiddle,

Risposte:


8

Ho lottato con quel comportamento per molto tempo.

Fondamentalmente, il colore di primo piano di SpecialKeysulla linea corrente viene cambiato nel colore di primo piano Normalse:

  • l' cursorlineopzione è abilitata,
  • il CursorLinegruppo di evidenziazione ha un set di colori di sfondo.

Non sono mai stato in grado di correggere quel comportamento, indipendentemente da ciò che ho provato. Il problema si trova da qualche parte nel codice sorgente di Vim.


1
Questa non è la risposta che volevo! Ho cambiato il mio carattere di traccia con ~un po 'meno confuso (potrebbe anche cercare un oscuro carattere unicode da usare).
Riccioli d'oro

Ho visto questo comportamento anche senza un colore di sfondo per il gruppo CursorLine. Ho provato a disabilitarlo (cioè none), ho cercato di lasciare il suo valore predefinito (era sottolineato), gli spazi hanno comunque cambiato il loro colore di primo piano
user907860

2

Ciò che ha funzionato per me sono state le seguenti righe nel mio .vimrc(basato sulla risposta di Igor Mikushkin ).

autocmd BufNewFile,BufRead * call matchadd('SpecialKey', '\s\+')
autocmd BufNewFile,BufRead * call matchadd('NonText', '\n\+')

VimEnterfunziona solo per il primo file che apri, non per i file / le schede che apri in seguito. BufNewFile,BufReadha funzionato finora per tutti i buffer che ho aperto.

La prima riga copre i caratteri degli spazi bianchi. Vim li evidenzia nel SpecialKeygruppo, quindi applichiamo quegli stili a loro.

La seconda riga copre le nuove linee. Vim li evidenzia nel NonTextgruppo, quindi applichiamo quegli stili a loro. Hai davvero bisogno della seconda riga solo se i tuoi NonTextpersonaggi sono evidenziati in modo diverso rispetto ai SpecialKeypersonaggi.


Questa dovrebbe essere la risposta.
hozza,

1

Le seguenti righe in .vimrc hanno risolto il problema per me.

au VimEnter * call matchadd('SpecialKey', '^\s\+', -1)
au VimEnter * call matchadd('SpecialKey', '\s\+$', -1)

Sostituisce l'applicazione di altri stili per le schede e gli spazi finali all'interno di una linea del cursore.


perché stai memorizzando il matchadd()risultato in una variabile, se non lo usi?
Christian Brabandt,

@ChristianBrabandt Grazie, ora è stato risolto.
Igor Mikushkin, il

Questo funziona anche per me usando NeoVim.
Hakunin,

0

C'è ancora un'altra "soluzione", in realtà una specie di kludge per questo problema.

Ho gruppi di sintassi personalizzati per cose come "listchars".

Come questo:

hi WhiteSpaceChar ctermfg=251 guifg=#999999
call matchadd("WhiteSpaceChar", "[ \t]")

Potresti fare qualcosa del genere (anche se non l'ho provato):

hi TrailChar ctermfg=251 guifg=#999999
" the \v in the regex is Vim's flag to use Perl-like regex syntax
call matchadd("TrailChar", "\v +$")

Ma ci sono almeno due problemi con questo approccio:

  1. quando dividi una finestra o crei una nuova scheda ecc. l'evidenziazione si interrompe nella finestra corrente, in questo modo:

l'evidenziazione degli spazi bianchi viene interrotta quando si apre una nuova finestra

Per risolvere questo problema ho funzioni speciali come:

fun! ResetHiglightJS()
  set syntax=javascript
  "these are for the IndentLine plugin
  "IndentLinesDisable
  "IndentLinesEnable
endfun

per ogni gruppo di sintassi, che utilizzo spesso, per correggere manualmente l'evidenziazione. Puoi farlo in altro modo come i comandi automatici o impostando manualmente il valore per l'opzione di sintassi. Per far funzionare la reimpostazione della sintassi bisogna anche avere questo:

call matchadd("WhiteSpaceChar", "[ \t]")

in ogni file di sintassi corrispondente, come ~/.vim/after/syntax/javascript.vim

  1. Questo approccio non funziona normalmente con almeno un plug-in - quello IndentLine, quindi sono stato costretto a attenermi a una versione precedente di esso impostando manualmente let g:indentLine_newVersion = 0, dove il plug-in funzionava normalmente.

Ma in altro modo questo approccio funziona normalmente senza il plugin IndentLine:

gli spazi bianchi hanno il colore desiderato nella linea del cursore

E accettabile con esso:

indentLine color nella linea del cursore

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.