Evidenziazione automatica di testo con linee identiche


13

Ho visto un ninja esperto fare questo poco tempo fa, ma non ho idea di iniziare.

A) Esiste un modo per impostare il colore di sfondo di Vims in modo che vengano evidenziate le righe consecutive con contenuto identico.

B) Se qualcuno sa come farlo, una bella modifica sarebbe se l'evidenziazione avvenisse su righe consecutive ma considerasse solo la prima parola (non l'intera riga).

Un secondo aggiustamento se l'evidenziazione potrebbe essere configurata su colori diversi viene utilizzato in base al numero di linee corrispondenti (o le parole a seconda di AB sono attive). Quindi abbiamo solo due righe consecutive che corrispondono quindi a verde, 3-5 righe consecutive quindi arancione, 6+ poi rosso.


Risposte:


10

I seguenti matchset sembrano funzionare per (A):

:syn match Low /\v(.+)\n(\1\n)/
:syn match Medium /\v(.+)\n(\1\n){2,4}/
:syn match Critical /\v(.+)\n(\1\n){5,}/
:hi Critical  ctermfg=red
:hi Medium  ctermfg=yellow
:hi Low  ctermfg=green

Sembra che l'ordine sia cruciale qui. Se le corrispondenze Lowo Mediumvengono dopo Critical, viene assorbito dai requisiti più vaghi di questi e allo stesso modo per Lowwrt Medium.

L'evidenziazione non appare immediatamente dopo aver aggiunto, diciamo, una terza o sesta linea dupe, ma una volta che ti muovi un po 'dopo averle aggiunte. Non sono sicuro di cosa lo scateni esattamente.

Per B, immagino che potresti sostituire il regex con:

/\v(\S+).*\n(\1.*\n)/

In generale, sostituisci tutto (.*)con (\S+).*e \1con \1.*, o qualsiasi altra cosa costituisca una parola per te.


Ho dato il segno di spunta a questa risposta perché per me è come fare l'evidenziazione di cui avevo bisogno (come espresso dalla domanda). @Matts espressione regolare piacevole ma non risponde alla domanda reale che ho posto (cambiando l'evidenziazione).
Martin York,

8

Come punto di partenza, ecco un modello di ricerca che corrisponde a linee duplicate (ignorando le modifiche nello spazio bianco principale):

              \zs                marks start of the pattern. Everything before here will not be highlighted
 ^                               start of the line
  \s*                            leading whitespace
       .\+                       match 1 or more non-newline characters
     \(   \)                     and use parens to capture this in match group 1

            \n                   match the newline character
                 \(        \)\+  1 or more
                      \1         copies of what was in the match group 1
                   \s*  \n       with leading whitespace followed by a newline
/^\s*\(.\+\)\n\zs\(\s*\1\n\)\+   the full regex

:help pattern fornirà maggiori informazioni su come realizzare regex come questa

:help syntax ti mostrerà come prendere questa espressione regolare e trasformarla in qualcosa che è evidenziato per te

Imparare a scrivere script di sintassi può essere difficile, quindi una buona soluzione a breve termine è farlo 'al volo' assicurandosi che 'incsearch'sia impostato in modo che le ricerche siano evidenziate e che mappino una chiave per fare la ricerca di cui sopra, cioènnoremap <F5> /^\s*\(.\+\)\n\zs\(\s*\1\n\)\+<CR>


Esiste un modo automatizzato di distribuire il regex in questo modo? Fornisce una rappresentazione così chiara.
muru,

1
L'ho fatto a mano. Il modo più semplice e veloce in vim sarebbe quello di fare qualcosa come yy10psulla linea con la regex completa, quindi selezionare le parti che si desidera rimuovere e colpire r<space>. Forse aggiungerò un comando per 'sostituisci tutto tranne la selezione su questa riga con spazi' per velocizzare un po 'le cose.
Matt Boehm,

Wow! Questo è abbastanza sforzo!
muru,

1
Ho creato una funzione vim (davvero brutta) per renderla un po 'più veloce: gist.github.com/mattboehm/da63a48eedf6f14375aa . Seleziona una linea, premi ,rquindi unisci le linee insieme <space>in modalità normale / visiva.
Matt Boehm,
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.