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.