You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在ctags中定义可用的mtable结构,自定义标签解析异常

解决ctags仅识别第一个标签的问题

问题根源

原配置的核心问题在于逐字符扫描导致行首匹配失效:

  • toplevel表中的/.//规则会匹配单个任意字符并跳过,使ctags以逐字符而非逐行的方式扫描文件。当从blocktab回到toplevel后,后续行的扫描位置不在行首,导致^<B=...>的行首匹配正则无法命中第二个及以后的标签。
  • 未定义标签对应的kind类型,即使匹配到也无法生成有效标签,更无法为提供作用域关联。

修正后的配置

--langdef=dantags
--langmap=dantags:.dan
--kinddef-dantags=b,block,blocks
--kinddef-dantags=i,inline,inlines

--_tabledef-dantags=toplevel
--_tabledef-dantags=blocktab

--_mtable-regex-dantags=toplevel/^<B=([a-zA-Z0-9]+)>/\1/b/{tenter=blocktab}
--_mtable-regex-dantags=toplevel/^.*$//

--_mtable-regex-dantags=blocktab/^<\/B>$//{tleave}
--_mtable-regex-dantags=blocktab/<I=([a-zA-Z0-9]+)>/\1/i/
--_mtable-regex-dantags=blocktab/^.*$//

关键修改说明

  1. 添加的kind定义:
    --kinddef-dantags=b,block,blocks 为标签创建block类型的标签,作为标签的作用域载体。

  2. 改用逐行扫描模式:
    将toplevel和blocktab中的任意字符匹配规则/.//替换为^.*$//,以整行为单位跳过无关内容,确保后续行的行首匹配正则能正常生效。

  3. 优化标签匹配:
    去掉标签正则的行首限制,允许匹配行内任意位置的标签(如示例中的<I=2><I=3>),同时确保多个标签都能被识别。

  4. 精确匹配行:
    ^<\/B>$//{tleave} 精确匹配
    所在的行,确保扫描状态正确从blocktab切换回toplevel。

测试结果

运行ctags -L dan.ctags messing.dan后,生成的tags文件将包含所有和标签,且标签会自动关联所属的作用域:

003	messing.dan	/^<B=003>$/;"	b
004	messing.dan	/^<B=004>$/;"	b
1	messing.dan	/^<I=1>$/;"	i	scope:004
2	messing.dan	/^<I=2>$/;"	i	scope:004
3	messing.dan	/^<I=3>$/;"	i	scope:004

内容的提问来源于stack exchange,提问作者rafmartom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:43:18