Como combinar os cabeçalhos Markdown Setext em ctags exuberantes

1

Estou trabalhando em uma definição de linguagem para markdown de pandoc em ctags. No entanto, tenho problemas ao combinar os cabeçalhos do Setext na regex, que são definidos por vários = ou - em uma nova linha sob o texto do cabeçalho. Os cabeçalhos do Setext são assim:

My Firts Level Setext Header
============================

My Second Level Setext Header
-----------------------------

### My Third Level Setext Header

As manpages para ctags exuberantes mencionam que ele usa expressões regulares POSIX estendidas com \n para newline suportado.

Assim, /^(.*)$\n={3,} deve corresponder a um cabeçalho Setext markdown em

A definição de idioma correspondente no meu .ctags é assim:

--langdef=pandoc
--langmap=pandoc:.pandoc
--regex-pandoc=/^(.*)$\n={3,}//h,Heading_L1/
--regex-pandoc=/^(.*)\n-{3,}//i,Heading_L2/
--regex-pandoc=/^###[ \t]+(.*)//k,Heading_L3/

No entanto, as tags são criadas apenas para cabeçalhos de nível 3 que não precisam de novas correspondências de linha. Para cabeçalhos de Nível 1 e 2, não há tags / correspondências no arquivo de saída tags .

Por exemplo:

Introduction    dissertation.pandoc /^### Introduction$/;"  k

Por que isso e como posso combinar os cabeçalhos do Setext em ctags exuberantes?

    
por Cutú Chiqueño 25.05.2016 / 08:57

1 resposta

3

Eu resolvo o mesmo problema. Estou convencido de que as Exuberant Ctags não suportam expressões regulares multilinhas. Mas há um projeto sucessor Ctags Universais , que suporta isso.

A configuração do Universal Ctags pode ser dividida em vários arquivos. Para mais informações, consulte ctags/doc/optlib.rst no site do projeto.

Eu criei o seguinte arquivo de configuração: ~/.ctags.d/optlib/markdown.ctags --langdef=markdown --langmap=markdown:.md --regex-markdown=/^(.+)[[:cntrl:]]{1,3}^(===+)//h,Heading_L1/{_multiline=1} --regex-markdown=/^(.+)[[:cntrl:]]{1,3}^(---+)//i,Heading_L2/{_multiline=1} --regex-markdown=/^###[ \t]+(.*)//k,Heading_L3/ --excmd=number

O arquivo tags pode ser gerado pelo comando: ctags --options=markdown -R test.md

O novo é {_multiline=N} flag. O número N é o número de grupos no padrão. A posição do texto no arquivo representado por esse grupo é salva no arquivo tags . No futuro, queremos pular para o nome do cabeçalho não sublinhado. Portanto, temos um grupo (.+) e vinculamos a ele com {_multiline=1} .

Eu tive problema para verificar a nova linha no regex. Simples de usar \n ou \r não funciona. Para verificar, a nova linha pode ser usada com o nome de grupo [[:space:]] ou [[:cntrl:]] . Acho que [[:cntrl:]] é melhor porque não inclui espaços comuns.

O próximo problema são diferentes terminações de linha para arquivos DOS e Unix. Se o arquivo usar finais de linha Unix, a quantificação no padrão {1,3} poderá ser omitida. Obviamente, a quantificação de uso é mais geral, mas às vezes pode causar problemas com o arquivo de terminações de linha do Unix.

Não é perfeito, mas não encontrei uma solução melhor.

    
por 24.06.2017 / 14:35