Estou tentando escrever um arquivo de sintaxe para scripts de logrotate do Linux.
Muitas vezes, eles contêm definições embutidas de scripts a serem executados antes ou depois da ação de rotação.
Um exemplo (o cups-daemon
script logrotate conforme fornecido pelo Ubuntu 14.04):
prerotate
if [ -e /var/run/cups/cupsd.pid ]; then
invoke-rc.d --quiet cups stop > /dev/null
touch /var/run/cups/cupsd.stopped
fi
endscript
postrotate
if [ -e /var/run/cups/cupsd.stopped ]; then
rm /var/run/cups/cupsd.stopped
invoke-rc.d --quiet cups start > /dev/null
sleep 10
fi
endscript
Existe alguma maneira de ambos:
- destacar
prerotate
epostrotate
como palavras-chave, e - destacar tudo como região?
Posso definir um realce adequado para qualquer um desses, mas parece que não para ambos.
" this works
syntax keyword LogrotateKeyword prerotate postrotate endscript
" this also works
syntax region LogrotateScript start=/prerotate/ms=e+1 end=/endscript/me=s-1
Agora, os dois no mesmo arquivo de sintaxe produzem apenas destaque para palavras-chave, independentemente da ordem de regra usada.
Eu tentei match
(com \zs
/ \ze
ou lookaheads / lookbehinds) em vez de region
também. Também tentei usar match
as palavras-chave e os scripts embutidos, esperando que as definições não se sobrepusessem, os resultados pareciam os mesmos.
Posso manter a cor padrão do script embutido, mas aparentemente o material embutido contém outras palavras-chave com rotação de log, o que pode ser confuso.
Provavelmente irrelevante para esse problema: Vim 7.4 com patches 1-1529 (pi-rho PPA) e Ubuntu 14.04.
fonte
Respostas:
Após algumas experiências, aqui está algo que funciona:
Para que um
syntax
conjunto coopere com outro sobreposto, podemos conter a correspondência mais estreita dentro da correspondência mais ampla.Nesse caso:
contained
e a região como contendo as palavras-chave. Não é necessário marcar as palavras-chave, mas, considerando a natureza dessas palavras-chave, elas sempre serão acompanhadas por essa região no caso válido.keepend
para que a correspondência para a palavra-chave não oculte a correspondência para o fim da região.Combinando com o destaque da sintaxe do script de shell do Vim:
Eu recebo:
Note que eu usei
re
e emrs
vez dems
/hs
,me
/he
. Com as outras opções, combinar as palavras-chave com a sintaxe do script de shell não funcionou, embora eu não saiba o porquê.O seguinte seria melhor:
Nesse caso, aproveito
matchgroup
:Olhando para trás,
matchgroup
pretendia resolver exatamente esse problema. Não precisamos listar as palavras-chave delimitadoras separadamente, poismatchgroug
podemos destacar os delimitadores separadamente.fonte
rs
/ permitidasms
.