Vim realçar todo o texto depois de vários “#”

1

Estou tentando tornar o texto em negrito se ele aparecer após uma série de # hashes. Esta é a linha no meu .vimrc :

au BufRead,BufNewFile *.txt hi header cterm=cyan ctermbg=red

e minhas tentativas de expressões regulares:

au BufRead,BufNewFile *.txt syn match header /\n#+\zs.*\ze/
au BufRead,BufNewFile *.txt syn match header /^#+\zs.*\ze/ "Why doesn't ^ work?

Esse tipo funciona, mas também corresponde ao # s e a alguns textos incorretos. Também é muito lento e demora cerca de 10 segundos para combinar no meu macbook:

au BufRead,BufNewFile *.txt syn match header /\zs\n#*\w*\ze/

Não sei ao certo o que estou fazendo de errado - esses trabalhos são feitos em testadores de regex on-line.

Em este testador , o regex ^#*(.*) funciona perfeitamente, onde eu estou combinando com o primeiro grupo de captura. Como faço para traduzir isso para o vim?

Felicidades.

    
por haz 05.11.2017 / 09:51

1 resposta

2

O multiplicador para 1 ou mais correspondências é \+ ; você esqueceu a barra invertida (ou o modificador \v "muito mágico"). Usar \ze no final é supérfluo. ^ corresponde a todos os começos da linha \n apenas começando na segunda linha. Por favor, esteja ciente de que o Vim usa um dialeto de expressão regular especial, então, o que vários sites da Web dizem que você pode precisar de adaptação. As :help pattern páginas são as melhores e autoritativas referências.

syn match header /^#\+\zs.*/

Além disso, sua adição de sintaxe pode estar obscurecida pelas regras de sintaxe existentes. Você pode tentar acrescentar containedin=ALL , mas essa não é uma solução geral. Talvez seja necessário analisar a sintaxe existente e criar uma solução especial para cada sintaxe. Como alternativa, você pode usar o comando :match . Isso funciona no topo (e independente) do realce de sintaxe. A desvantagem é que isso é window-local , então você precisa de :autocmd magic se quiser aplicar isso apenas a determinados buffers, ou também a splits de janelas.

match header /^#\+\zs.*/

crítica de estilo

Com seu au BufRead,BufNewFile *.txt syn match , você mescla vários aspectos: detecção de tipo de arquivo (o mapeamento de *.txt para um tipo de arquivo (aqui: implícito)), personalização de tipo de arquivo, realce de sintaxe. Seria mais limpo (e mais extensível) separar as coisas:

  1. Defina um% fil_de% filetype: text . Esta detecção pode já existir na sua versão do Vim.
  2. Defina o destaque da sintaxe (ou extensão) em au BufRead,BufNewFile *.txt setf text (ou ~/.vim/syntax/text.vim para estender uma sintaxe existente).
por 06.11.2017 / 09:45