如何在丰富的 ctags 中匹配 Markdown Setext 标题

如何在丰富的 ctags 中匹配 Markdown Setext 标题

我正在为 ctags 中的 pandoc markdown 制定语言定义。但是,我在匹配正则表达式中的 Setext 标题时遇到问题,这些标题是由标题文本下的多个=-新行定义的。 Setext 标头如下所示:

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

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

### My Third Level Setext Header

exuberant ctags 的手册页提到它使用扩展的 POSIX 正则表达式并\n支持换行符。

因此,/^(.*)$\n={3,}应该匹配 markdown Setext 标头\1

my 中对应的语言定义.ctags如下:

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

但是,标签仅为不需要换行匹配的 3 级标头创建。对于 1 级和 2 级标头,输出文件中没有标签/匹配项tags

例如:

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

为什么会这样以及如何匹配 exuberant ctags 中的 Setext 标头?

答案1

我解决同样的问题。我正在说服旺盛的C标签不支持多行正则表达式。但是,还有后续项目通用C标签,这支持这一点。

通用Ctags配置可以分为多个文件。欲了解更多信息,请访问ctags/doc/optlib.rst项目网站。

我创建了以下配置文件: ~/.ctags.d/optlib/markdown.ctags --langdef=markdown --langmap=markdown:.md --regex-markdown=/^(.+)[[:cntrl:]]{1,3}^(===+)/\1/h,Heading_L1/{_multiline=1} --regex-markdown=/^(.+)[[:cntrl:]]{1,3}^(---+)/\1/i,Heading_L2/{_multiline=1} --regex-markdown=/^###[ \t]+(.*)/\1/k,Heading_L3/ --excmd=number

tags文件可以通过以下命令生成: ctags --options=markdown -R test.md

新的是{_multiline=N}旗帜。数字N是模式中的组数。该组代表的文本在文件中的位置保存在文件中tags。将来我们希望跳转到标题的名称而不是下划线。所以我们有一个组(.+),并通过 链接到它{_multiline=1}

我在检查正则表达式中的新行时遇到问题。使用简单\n\r不起作用。要检查新行,可以使用名为 group[[:space:]][[:cntrl:]].我认为[[:cntrl:]]更好,因为它不包括公共空间。

下一个问题是 DOS 和 Unix 文件的不同行结尾。如果文件使用 Unix 行结尾,则模式中的量化{1,3}可以省略。显然,使用量化更为通用,但有时可能会导致 Unix 行结尾文件出现问题。

并不完美,但我没有找到更好的解决方案。

相关内容