我正在为DocBook 5 XML工作,它经常包含以下内容:
<section>
<title>This is my awesome Java Class called <classname>FunBunny</classname></title>
<para>FunBunny is your friend.</para>
</section>
我希望各部分的标题出现在窗口底部的功能弹出窗口中。我使用以下捆绑项目部分工作。
语言语法:
{ patterns = (
{ name = 'meta.tag.xml.docbook5.title';
match = '<title>(.*?)</title>';
/* patterns = ( { include = 'text.xml'; } ); */
},
{ include = 'text.xml'; },
);
}
带范围选择器meta.tag.xml.docbook5.title
的设置/首选项:
{ showInSymbolList = 1;
symbolTransformation = 's/^\s*<title\s?.*?>\s*(.*)\s*<\/title>/$1/';
}
这样做的净效果是文档中的所有标题元素都匹配并显示在函数弹出窗口中,不包括基于<title></title>
的{{1}}标记内容。
我会对这么多功能感到满意,因为其他有趣的东西(比如数字)往往有正式的标题,但有一个问题。
symbolTransformation
标记的内容不会根据title
语言语法的其余部分进行解析和识别。上述语言语法中注释掉的text.xml
部分没有解决此问题的预期效果 - 它将所有内容放入patterns
范围。
有没有办法在这里得到我想要的东西?也就是说,解析器将函数弹出窗口和中的meta.tag.xml.docbook5.title
元素的内容(可选地仅用于title
标题)的内容识别为普通的XML内容。
答案 0 :(得分:1)
在TextMate语法中,如果要“匹配匹配”,则需要使用开始/结束类型规则而不是匹配类型规则。 (您实际上也可以使用匹配,但是您需要使用当前未记录的行为,仅适用于TextMate 2)
{ patterns = (
{ name = 'meta.tag.xml.docbook5.title';
begin = '<title>';
end = '</title>';
patterns = ( { include = 'text.xml'; } );
},
{ include = 'text.xml'; },
);
}
这样可以让<title>...</title>
跨越多行。