我该如何使用Exuberant Ctags为VB.NET文件创建标签?

3
我们在工作中使用.NET,我们的项目有一些VB和C#混合。 Exuberant Ctags按照这些说明为我生成了C#标签。然而,我还无法弄清楚如何为我的VB.NET代码生成标签。我找到的唯一有点有用的文章是这篇文章。但是它已经有2003年了,看起来有些过时。我注意到的第一件事是这一行:
--langmap=vb:.bas.cls.ctl.frm.vbs

错误,而且过时。我将其更改为以下内容:
--langmap=vb:.vb

这稍微改善了我的结果,但似乎仍无法产生预期的行为(例如,当我执行:set tag=tags并在函数调用或参数上进行^]或g]时,它没有标记)。这是我的ctags.cnf文件的样子(我已经验证它正在被使用):
--langdef=vb
--langmap=vb:.vb
--regex-vb=/^(Public|Private|\b)[ \t]*Sub[ \t]+([a-zA-Z0-9_]+)/\2/s,subroutine/i
--regex-vb=/^(Public|Private|\b)[ \t]*Function[ \t]+([a-zA-Z0-9_]+)/\2/f,function/i
--regex-vb=/^(Public|Private)[ \t]+([a-zA-Z0-9_]+)[ \t]+As[ \t]+/\2/v,variable/i
--regex-vb=/^(Public|Private|\b)[ \t]*Const[ \t]+([a-zA-Z0-9_]+)[ \t]+(As|=)[ \t]+/\2/c,const/i
--regex-vb=/^(Public|\b)[ \t]*Property[ \t]*(Get|Let|Set)[ \t]+([a-zA-Z0-9_]+)/\3/n,name/i
--regex-vb=/^(Public|Private|\b)[ \t]*Enum[ \t]+([a-zA-Z0-9_]+)/\2/e,enum/i
--regex-vb=/^([a-zA-Z_]+):/\1/l,label/i
--recurse
--exclude="bin"
--exclude="obj"
--fields=+ianmzS
--extra=+fq
--vb-kinds=cn

有什么线索可以让我得到适当的支持吗?

编辑:

这是我标签文件的一部分:

!_TAG_FILE_FORMAT   2   /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED   1   /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME  Exuberant Ctags //
!_TAG_PROGRAM_URL   http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.8 //
Application.Designer.vb .\My Project\Application.Designer.vb    1;" kind:F  line:1
Application.Designer.vb .\Nuts\My Project\Application.Designer.vb   1;" kind:F  line:1
AssemblyInfo.vb .\My Project\AssemblyInfo.vb    1;" kind:F  line:1
AssemblyInfo.vb .\Nuts\My Project\AssemblyInfo.vb   1;" kind:F  line:1
AttachmentHandler.vb    .\Utilities\AttachmentHandler.vb    1;" kind:F  line:1

尽管我的CS代码库生成类似于以下标签:

SomeModel   .\Client\Views\Models\Namespace\SomeModel.cs    /^    public class SomeModel$/;"    kind:c  line:12 namespace:Views.Models.SomeModel    access:public

你是否更新了vimrc文件,让它知道新的语言?http://vim-taglist.sourceforge.net/extend.html - embedded.kyle
你使用哪个命令来生成"tags"文件?你会收到错误吗?"tags"文件是空的吗?它是否正确填充了数据? - romainl
@romainl,它不是空的,但似乎没有正确填充。我在项目的基本目录中有我的ctags.cnf文件,如果我正确阅读了man页面,它会自动使用该文件(如果存在)。当我运行ctags --options=ctags.cnf时,它给了我一个关于语言vb已经存在的警告。 - Wayne Werner
@embedded.kyle 看起来这是特定于taglist插件,而不是内置的标签行为。但我已经使用了该插件,所以那个链接应该非常有帮助。 - Wayne Werner
“ctags.cnf” 不是应该在你的 “$HOME” 目录下吗? - romainl
如果您查看手册,ctags.cnf在本地目录中是可以的... 如果您正在运行Windows,而我正在运行Windows。 - Wayne Werner
2个回答

3

除非您遵循零缩进编码约定,否则您的正则表达式将无法工作 ;)

尝试:

 // Note the extra [ \t]* right after ^
 --regex-vb=/^[ \t]*(Public|Private|\b)[ \t]*Sub[ \t]+([a-zA-Z0-9_]+)/\2/s,subroutine/i

3

这里是一个有效的配置,从我的~/.ctags中提取而来,基于OP的配置并应用了被接受的答案编辑。

我不得不删除标签匹配器,因为这会阻止所有Sub/Function匹配(不确定为什么),并将(Public|Private|\b)替换为(Public|Private)?以使其可以选择性地匹配访问修饰符(否则对我来说没有匹配没有这些修饰符的任何内容)。

--exclude="bin"
--exclude="obj"
--langdef=vb
--langmap=vb:.vb
--regex-vb=/^[ \t]*(Public|Private)?[ \t]*Sub[ \t]+([a-zA-Z0-9_]+)/\2/s,subroutine/i
--regex-vb=/^[ \t]*(Public|Private)?[ \t]*Function[ \t]+([a-zA-Z0-9_]+)/\2/f,function/i
--regex-vb=/^[ \t]*(Public|Private)[ \t]+([a-zA-Z0-9_]+)[ \t]+As[ \t]+/\2/v,variable/i
--regex-vb=/^[ \t]*(Public|Private)?[ \t]*Const[ \t]+([a-zA-Z0-9_]+)[ \t]+(As|=)[ \t]+/\2/c,const/i
--regex-vb=/^[ \t]*(Public)?[ \t]*Property[ \t]*(Get|Let|Set)[ \t]+([a-zA-Z0-9_]+)/\3/n,name/i
--regex-vb=/^[ \t]*(Public|Private)?[ \t]*Enum[ \t]+([a-zA-Z0-9_]+)/\2/e,enum/i
#--regex-vb=/^[ \t]*([a-zA-Z_]+):/\1/l,label/i
--recurse
--fields=+ianmzS
--extra=+fq
--vb-kinds=cn

谢谢你的精彩回应!也许这是一个 PCRE 与 POSIX 的问题?另外,如果你只启用了 vb-kinds=cn,为什么还要定义 c、s、v、e、n?这可能会让人感到困惑。只是一些想法。我修改了你的脚本,似乎能够完成任务。 - Felipe Valdes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接