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

时间:2012-06-29 21:26:09

标签: vb.net vim ctags exuberant-ctags

我们在这里使用.NET,我们的项目有点混合,有一些VB和C#。繁琐的Ctags在these instructions之后为我生成C#标签。但是,我还没有弄清楚如何让它为我的VB.NET代码生成标签。我发现的唯一有用的文章是this one。但在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

2 个答案:

答案 0 :(得分:2)

除非你遵循零缩进编码约定,否则你的正则表达式将无效;)

尝试:

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

答案 1 :(得分:1)

这是一个工作配置,从我的~/.ctags中提取出来,基于来自OP的,并应用已接受的答案编辑。

我不得不删除标签匹配器,因为这会阻止所有子/函数匹配(不确定原因)并将(Public|Private|\b)替换为(Public|Private)?以使其可选地匹配访问修饰符(否则它没有' t匹配任何没有这些修饰符的人)。

--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