在Vim中是否有类似Ctags的工具用于浏览/导航XSLT代码?

在Vim中是否有类似Ctags的工具用于浏览/导航XSLT代码?,xslt,vim,plugins,ctags,Xslt,Vim,Plugins,Ctags,需要一种使用Vim轻松导航/浏览XSLT文件的方法。 与C/C++源代码使用ctags的方式类似。 一个好的解决方案将允许只为自己安装脚本等,或者直接从Vim内部运行脚本。讨厌仅仅为了搜索函数定义或“文本”搜索而离开vim 搜索了几个小时,找到了一些很好的线索,比如“ack”。 显然,这可以使用ack.vim与vim集成。但要正确地测试这一点 基本上,我应该能够通过一个迷宫式的.xsl文件,其中包括其他.xsl文件,并使用函数、模板。有什么建议吗?谢谢@Izap。很抱歉,显然我不能对我自己的问题

需要一种使用Vim轻松导航/浏览XSLT文件的方法。 与C/C++源代码使用ctags的方式类似。 一个好的解决方案将允许只为自己安装脚本等,或者直接从Vim内部运行脚本。讨厌仅仅为了搜索函数定义或“文本”搜索而离开vim

搜索了几个小时,找到了一些很好的线索,比如“ack”。 显然,这可以使用ack.vim与vim集成。但要正确地测试这一点


基本上,我应该能够通过一个迷宫式的.xsl文件,其中包括其他.xsl文件,并使用函数、模板。有什么建议吗?

谢谢@Izap。很抱歉,显然我不能对我自己的问题投赞成票。 无法选择您的答案,即使它最接近我想要的答案(示例代码会有所帮助)。
创建标记文件非常容易:
1) 测试自定义语言的正则表达式:
egrep'pattern'*

2) 将带有上述正则表达式的自定义语言复制粘贴到~/.ctags中

--langdef=EXSLT
--langmap=EXSLT:.xsl
--regex-EXSLT=/<xsl:variable[ \t]+name=\"([-a-zA-Z0-9_]+)\"/\1/v,variable/i
--regex-EXSLT=/<func:function[ \t]+name=\"([-a-zA-Z0-9_:]+)\"/\1/f,function/i
--regex-EXSLT=/<xsl:template[ \t]+match=\"([/-a-zA-Z0-9_:]+)\"/\1/t,template/i
--langdef=EXSLT
--langmap=EXSLT:.xsl

--regex EXSLT=/感谢您的提问和回答@GuruM

虽然您的~/.ctags版本对我不起作用,但我使用了以下内容:

--langdef=xslt
--langmap=xslt:.xsl
--regex-xslt=/<xsl:template[^>]+name=\"([-a-zA-Z0-9_:]+)\"/\1/f,function/i

我发现kipelovets和GuruM的答案很有用,并结合他们的建议制定了这个解决方案:

.ctags文件:

--langdef=xslt
--langmap=xslt:.xsl
--regex-xslt=/<xsl:template[^>]+name=\"([-a-zA-Z0-9_:]+)\"( +mode="([^"]+)")?/\1 \2/n,namedtemplate/i
--regex-xslt=/<xsl:template[^>]+match=\"([^"]+)\"( +mode="([^"]+)")?/\1     \2/m,matchedtemplate/i
--regex-xslt=/<xsl:apply-templates +select="([^"]{2,})"( +mode="([^"]+)")?/\1 \2/a,applytemplate/i
--regex-xslt=/<xsl:call-template +select="([^"]+)"( +mode="([^"]+)")?/\1 \2/c,calltemplate/i
--regex-xslt=/<xsl:variable[^>]+name=\"([-a-zA-Z0-9_]+)\"/\1/v,variable/i
--regex-xslt=/<xsl:function[^>]+name=\"([-a-zA-Z0-9_:]+)\"/\1/f,function/i
--regex-xslt=/<xsl:param[^>]+name=\"([-a-zA-Z0-9_:]+)\"/\1/p,parameter/i
这更好,但我仍有一些问题,包括:

  • 按模式对模板进行分组
  • 空白区域,例如模板/变量等属性之间的新行
  • 作用域变量和参数以及应用模板和调用模板
    • 因此,如果您有多个同名但位于不同模板中的变量, 无法捕获它们所在模板的范围
  • 注释模板、函数、变量和参数
今后尝试的更好方法:

  • 用于解析来自xslt的信息的正则表达式变得复杂,以便正确地执行此操作
  • 最好的解决方案可能是使用xslt本身编写自定义xslt标记生成器。
    • 这就是javascript的功能
    • 标记文件的格式看起来很简单。。。所以我下一步会试试这个。

也许可以编写自己的标签生成器。文件格式非常简单。然后它只是一个AST树…@Dimitre:See,和
:help-ctags
Vim@ib:如果你想增加人们回答问题的机会,不要以为他们知道任何标有首字母缩略词的东西,也不要以为他们会花时间浏览维基百科。这个问题实际上几乎与XSLT无关,也不是一个完整而有意义的问题。如果您只是询问存在哪些XSLT IDE(交互式开发环境),请在问题中这样说。然后你可以找到已经存在的答案,比如这个:@Izap:Yes谈论这个。但我的问题是,这是否已经完成。如果已经存在(某个地方),则不想重做耗时的工作。@Izap:一个示例标记文件或写出来的时间会有助于更早地评估您的答案AST'tree等人让我觉得这可能是一项复杂的任务。无论如何,谢谢你。找到了有关为新语言定制CTAG的好信息。需要向~/.ctags文件中添加以下内容a)新的语言定义,b)文件类型,c)一个或多个正则表达式模式,用于标识新的语言构造。不客气。谢谢你的信息+谢谢你的建议。请注意,您正在使用f,函数作为xsl:template。不是吗,模板?哇!!我停止使用自己的解决方案,因为它没有搜索命名、匹配、应用模板和调用模板。试图让我的解决方案发挥作用的时间不够。但你的解决方案正是如此!!我想这就是开源的原因。。。每个人贡献的只是多一点。希望有人会在你所做的基础上继续努力。还是你要自己尝试一下呢?谢谢-我将自己尝试编写xsltctags。这些年来,我已经写了足够多的XSLT,我希望有更好的东西。上述内容有助于克服最近编写糟糕的XSLT。。。但这可能会更好。当我在github中有一个原型时,我会在这里发布一个更新。祝你实现成功。你的实现成功了吗?如果您在github上发布原型链接,可能会对其他人有所帮助。
--langdef=xslt
--langmap=xslt:.xsl
--regex-xslt=/<xsl:template[^>]+name=\"([-a-zA-Z0-9_:]+)\"( +mode="([^"]+)")?/\1 \2/n,namedtemplate/i
--regex-xslt=/<xsl:template[^>]+match=\"([^"]+)\"( +mode="([^"]+)")?/\1     \2/m,matchedtemplate/i
--regex-xslt=/<xsl:apply-templates +select="([^"]{2,})"( +mode="([^"]+)")?/\1 \2/a,applytemplate/i
--regex-xslt=/<xsl:call-template +select="([^"]+)"( +mode="([^"]+)")?/\1 \2/c,calltemplate/i
--regex-xslt=/<xsl:variable[^>]+name=\"([-a-zA-Z0-9_]+)\"/\1/v,variable/i
--regex-xslt=/<xsl:function[^>]+name=\"([-a-zA-Z0-9_:]+)\"/\1/f,function/i
--regex-xslt=/<xsl:param[^>]+name=\"([-a-zA-Z0-9_:]+)\"/\1/p,parameter/i
let g:tagbar_type_xslt = {
      \ 'ctagstype' : 'xslt',
      \ 'kinds'     : [
      \ 'n:templates (named)',
      \ 'm:templates (matched)',
      \ 'a:applied templates',
      \ 'c:called templates',
      \ 'f:functions',
      \ 'p:parameters',
      \ 'v:variables'
      \ ]
      \ }