2010-02-04 8 views
4

C'est un suivi de:Mettre fin à la région de syntaxe au début d'un motif donné

VIM: simple steps to create syntax highlight file - for logfiles

Je suis en train d'utiliser l'installation « région match » à la syntaxe-highlight pile-traces dans certains: ces fichiers journaux logfiles (basé log4j-) regardent un peu comme ceci:

YYYY-MM-DD HH:MM:ss,SSSS...INFO...Message 
YYYY-MM-DD HH:MM:ss,SSSS...INFO...Message 
YYYY-MM-DD HH:MM:ss,SSSS...ERROR...Message 
...stack trace... 
...stack trace... 
...blah blah, more server-vomit... 
... 
YYYY-MM-DD HH:MM:ss,SSSS...INFO...Message 

jusqu'à présent, je suis parvenu à faire presque ce que je veux ceci:

:syntax region error matchgroup=string start=/^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}.* ERROR/ end=/^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}/ 

Mais le problème, c'est que cette correspondance va trop loin - elle inclut l'enregistrement suivant (c.-à-d. Que la correspondance inclut le prochain AAAA-MM-JJ ...).

Je crois de cet exemple (un exemple de texte cité) dans le manuel VIM que je devrais pouvoir mettre en évidence entre-deux? (Mais je ne semble pas pouvoir cartographier la syntaxe pour mon exemple)

http://vimdoc.sourceforge.net/htmldoc/syntax.html#:syn-excludenl

Donc, pour être clair: je dois correspondre à la première AAAA-MM-JJ ... la ligne (qui comprend 'ERROR'), puis toutes les lignes suivantes jusqu'à la ligne YYYY-MM-DD, mais PAS.

+1

Solution avec des régions semble un peu moche. Ce symbole de départ '^' à la fin est comme un hack. –

Répondre

5

Il y a beaucoup de difficultés avec les régions qui se chevauchent dans le moteur de mise en évidence de la syntaxe de Vim. L'ordre dans lequel les correspondances et les régions sont définies fait une différence et il peut être très difficile de le faire faire ce que vous voulez.

La principale chose que je suggère est de regarder :help syn-pattern-offset. Cela fournit un moyen de faire en sorte que la région se termine au début d'un motif, entre autres choses. Par exemple, si votre modèle final est:

end=/pattern/re=s-1 

Ensuite, la région se terminera au caractère avant le p du modèle.

Cela prend beaucoup de jouer autour pour le faire fonctionner et je suis loin d'être un expert en la matière, mais pour vous aider à démarrer, essayez ceci:

syntax match logDate /^\d\{4}-\d\{2}-\d\{2}/ containedin=logDateTimeTypeLine nextgroup=logTime skipwhite 
syntax match logTime /\d\{2}:\d\{2}:\d\{2},\d\{3}/ containedin=logDateTimeTypeLine,logTrace 
syntax match logDateTimeTypeLine /^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}.*/ 
syntax region logTrace matchgroup=logErrorStartLine start=/^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}.*ERROR.*/ms=s,rs=e+1 end=/^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}/me=s-1,he=s-1,re=s-1 
hi link logTrace Error 
hi link logDateTimeTypeLine Keyword 
hi link logDate String 
hi link logTime Comment 
hi logErrorStartLine guifg=red 
+0

yup - ça marche - à votre santé! – monojohnny

2
:help keepend 

:syntax region error matchgroup=string start=/.../ end=/.../ keepend 
+0

Merci - je l'ai essayé en fait - il fait (presque) ce que je veux - mais il semble forcer les motifs de début et de fin à devenir rose! (À cause de "string" je pense): des astuces pour contourner ça ? – monojohnny

+0

OK - Je l'ai comme je veux en utilisant 'matchgroup = normal' [pas sûr que c'est la solution optimale, mais cela fonctionne exactement pour moi]. – monojohnny

+0

En fait, cela ne fonctionne pas non plus ...le premier motif est également "désactivé" - c'est seulement le motif de terminaison dont j'ai besoin d'être exclu de la surbrillance - j'étudie peut-être un mécanisme qui n'était pas vraiment conçu pour les fichiers journaux - plus pour les langages qui ont tendance à correspondre paires de «serre-livres» ... +1 séjours, mais a dû décoller «réponse acceptée» J'ai peur! – monojohnny

1

Mon fichier est une adaptation: -) voici:

syntax region fatal start=/^\d\{4}-\d\{2}-\d\{2}.*FATAL.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1 
syntax region error start=/^\d\{4}-\d\{2}-\d\{2}.*ERROR.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1 
syntax region warn start=/^\d\{4}-\d\{2}-\d\{2}.*WARN.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1 
syntax region info start=/^\d\{4}-\d\{2}-\d\{2}.*INFO.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1 
syntax region debug start=/^\d\{4}-\d\{2}-\d\{2}.*DEBUG.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1 
syntax region trace start=/^\d\{4}-\d\{2}-\d\{2}.*TRACE.*/ end=/\n\d\{4}-\d\{2}-\d\{2}/me=s-1,re=s-1 

" Highlight colors for log levels. 
hi fatal ctermfg=DarkRed ctermbg=Black 
hi error ctermfg=Red ctermbg=Black 
hi warn ctermfg=Magenta ctermbg=Black 
hi info ctermfg=Green ctermbg=Black 
hi debug ctermfg=LightCyan ctermbg=Black 
hi trace ctermfg=LightMagenta ctermbg=Black 
0

Dites Vim d'utiliser un (longueur nulle) de positif lookbehind using the \@= construct. utilisez le même start, mais changer votre end à:

/\(^\d\{4}-\d\{2}-\d\{2} \d\{2}:\d\{2}:\d\{2},\d\{3}\)\@=/ 

Notez que ceci est incompatible avec Vi.