无法在ctags中定义可用的mtable结构,自定义标签解析异常
问题根源
原配置的核心问题在于逐字符扫描导致行首匹配失效:
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/^.*$//
关键修改说明
添加的kind定义:
--kinddef-dantags=b,block,blocks为标签创建block类型的标签,作为标签的作用域载体。改用逐行扫描模式:
将toplevel和blocktab中的任意字符匹配规则/.//替换为^.*$//,以整行为单位跳过无关内容,确保后续行的行首匹配正则能正常生效。优化标签匹配:
去掉标签正则的行首限制,允许匹配行内任意位置的标签(如示例中的<I=2><I=3>),同时确保多个标签都能被识别。精确匹配行:
^<\/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
相关产品推荐
相关产品推荐

