In vim, FIXME e TODO sono evidenziati, ma non riesco a ottenere FIXME: e TODO: (notare i due punti dopo la parola chiave) per evidenziare? Cosa dovrei inserire nel mio .vimrc per farlo accadere?In vim, come posso evidenziare TODO: e FIXME :?
risposta
Bene, hai già trovato il problema, ma ecco il perché.
Esistono tre tipi fondamentali di corrispondenza della sintassi: parole chiave, corrispondenze e regioni. Le parole chiave sono stringhe fisse, generalmente utilizzate per le parole chiave della lingua di base (int
, double
, ...) e anche, nel tuo caso, per FIXME e TODO. In realtà intendo stringhe fisse; devono essere parole esatte e intere, a differenza delle partite e delle regioni, che usano regex. Ad esempio, dalla sintassi C:
syn keyword cTodo contained TODO FIXME XXX
Sembra che in quasi tutti incorporati nelle definizioni di sintassi, solo con i nomi dei gruppi diversi (cTodo).
iskeyword
indica se un determinato carattere può far parte della parola chiave. Per impostazione predefinita, non include i due punti, quindi quando cerchi le parole chiave, vim vede "FIXME:" come "FIXME" e ignora i due punti. Se dovete aggiungere i due punti (set iskeyword+=:
), è ora possibile definire un po 'più di evidenziare:
syn keyword myTodo contained TODO: FIXME:
E' a voi come si desidera lavorare in gruppi di sintassi/evidenziazione esistenti. Se è per un solo tipo di file, è possibile aggiungerlo al gruppo di elementi di quella sintassi (ad esempio cTodo). Se lo vuoi ovunque, puoi fare "myTodo" come suggerito, quindi collegarlo direttamente al gruppo di evidenziazione di Todo (hi def link myTodo Todo
).
In alternativa, è possibile lasciare iskeyword
sola (probabilmente sarei consiglio questo), e semplicemente utilizzare un match:
syn match myTodo contained "\<\(TODO\|FIXME\):"
hi def link myTodo Todo
+1 @Jefromi, tuttavia, non penso che questa corrispondenza syn funzioni. L'ho schiaffeggiato nel mio .vimrc e se cambio FIXME in qualcos'altro non è evidenziato. – g33kz0r
@ G33kx0r: Non è colpa di questa partita; funziona se esiste ancora. Sospetto che tu stia abilitando la sintassi (in un modo o nell'altro) * dopo * le righe nell'esecuzione di vimrc e quando la sintassi è abilitata, prima cancella la sintassi vecchia e carica quella appropriata. Puoi verificare se quella corrispondenza è ancora attiva usando ': syn list myTodo'. Vedi anche ': help syntax-loading'. – Cascabel
Impostando prima 'syntax on' e successivamente' syn match myTodo conteneva "\ <\ (TODO \ | FIXME \):" 'nel mio file' vimrc' e 'hi! def link myTodo Todo' non funziona per me. D'altra parte, se lo faccio, ad esempio, au bufNewFile, BufRead * .tex syn match texTodo "\ <\ (TODO \ | FIXME \):" "il file' tex' risultante è correttamente evidenziato. C'è una soluzione generale? – petobens
Se si effettua il proprio ambiente, make syntax file (not .vimrc)
sintassi globale il file si trova nella directory vim (ad esempio /usr/share/vim/vim72/syntax/c.vim)
e se si fai ~/.vim/syntax/c.vim, quindi puoi aggiungere la sintassi per il tuo . (override)
Basta aggiungere ulteriore sintassi in quel file. (Il modo in cui lo fa @Jefromi)
augroup vimrc_todo
au!
au Syntax * syn match MyTodo /\v<(FIXME|NOTE|TODO|OPTIMIZE|XXX):/
\ containedin=.*Comment,vimCommentTitle
augroup END
hi def link MyTodo Todo
Il containedin
lo aggiungeremo a tutti i gruppi che terminano in "Commento", più vimCommentTitle, dove " TODO: foo
non si sarebbe messo in evidenza come MyTodo altrimenti.
Note di utilizzo: puoi aggiungerlo al tuo .vimrc e rimuovere i due punti (':') se vuoi solo che la parola sia evidenziata, e non i due punti che la seguono. Preferisco l'evidenziazione per leggere _NOTE_ :, non _NOTA: _. A volte scrivo anche NOTE o TODO non seguito da due punti. – Ari
Questo è strano; evidenziare la mia con o senza i due punti. L'evidenziazione della sintassi è definita in singole sintassi, penso - sta succedendo in qualche specifico tipo di file? – Cascabel
@Jefromi: Penso che accada in ogni tipo di file. –
cosa significa ': set dettagliato iskeyword?' Tell? – Benoit