2012-12-18 17 views
7

Ho un file di sintassi Vim molto semplice per le note personali. Vorrei evidenziare il nome della gente e ho scelto una sintassi simile a Twitter @jonathan.Come evidenziare le parole che iniziano con @ nella sintassi Vim?

ho provato:

syntax match notesPerson "\<@\S\+" 

a significare: parole che iniziano con @ e avere almeno un carattere non-spazio bianco. Il problema è che @ sembra essere un personaggio speciale nelle espressioni regolari di Vim.

Ho provato a scappare \@ e racchiudere tra parentesi [@], i soliti trucchi, ma non ha funzionato. Potrei provare qualcosa come (^|\s) (inizio della riga o spazio bianco) ma questo è esattamente il problema che il limite di parole cerca di risolvere.

L'evidenziazione funziona su espressioni regolari semplificate, quindi questa è più una questione di trovare la regex corretta di qualsiasi altra cosa. Cosa mi manca?

+0

Perché hai sfuggito il tuo '+' in '\ S \ +'? Prova '@ \ S +' o '\ @ \ S +', se '@' è considerato carattere speciale in 'vim'. Non lo so. –

+0

@RohitJain Perché la sintassi di vim proviene da BRE. Deve essere sfuggito per essere speciale. – ZyX

+0

@ZyX .. Oh! Non lo sapevo. Grazie :) –

risposta

13

@ è un carattere speciale solo se è stata attivata la modalità "molto magico" posizionando \v nella sequenza prima di @. Hai un altro problema qui: @ non inizia una nuova parola. \< non è solo "word boundary" come perl/PCRE \b, ma "left boundary" (in help: "inizio della parola") che significa che dopo \< deve seguire qualche carattere di parola chiave. Siccome lo @ non è normalmente un pattern di caratteri di parola chiave \<@ non corrisponderà mai (e anche se fosse come \b corrisponderebbe a costrutti come [email protected] che non è sicuramente quello che vuoi: per la ragione che ho spiegato prima).

Si dovrebbe usare \k\@<[email protected]\k\S* invece: \k\@<! assicura che @ non è preceduto da un carattere parola chiave, \k\S* fa in modo che il primo carattere del nome è una parola chiave uno (probabilmente si potrebbe utilizzare anche @\<\S\+).

Ci

è un'altra soluzione: include @ in 'iskeyword' opzione e lasciare la regex così com'è:.

setlocal [email protected]@ 

(si veda :h 'isfname' per la spiegazione del perché io uso @[email protected] qui 'iskeyword' ha esattamente la stessa sintassi e reindirizzerà tu lì per la spiegazione.)

+0

Funziona alla grande! Grazie per la spiegazione dettagliata. – jpalardy

Problemi correlati