ctags的多行正则表达式

时间:2015-02-01 12:19:59

标签: regex ctags exuberant-ctags

我有一些Java代码

@Subscribe
public void catchEvent(SomeEvent

我希望在我的〜/ .ctags

中将它与这样的东西相匹配
--langdef=javaspring
--langmap=javaspring:.java
--regex-javaspring=/@Subscribe(\s)*([a-z ]+)\s([a-zA-Z]*)\(([a-zA-Z]*)/\3-\4/

这应该产生类似" catchEvent-SomeEvent"但事实并非如此。如果我删除@Subscribe和public void之间的换行符,它就会得到它。

@Subscribe public void catchEvent(SomeEvent

rm -rf tags && ctags -R . && cat tags|grep Subs
catchEvent-SomeEvent    PathToMyFile.java    /^@Subscribe public void catchEvent(SomeEvent event) {$/;"      r

我甚至尝试使用这样的开头/结尾

--regex-javaspring=/^\s*@Subscribe[a-z \s]+\s([a-zA-Z]+)\(([a-zA-Z]+).*$/@Subscribe \1 \2*/

您是否知道我是否可以使用当前的ctag实现来执行此操作。我做错了什么或ctags现在不支持多行正则表达式。

谢谢!

2 个答案:

答案 0 :(得分:1)

对于通用 Ctag,您可以使用带有 --mline-regex-<LANG> 选项的 {mgroup=1} 功能:

--mline-regex-javaspring=/^\s*@Subscribe[a-z \s]+\s([a-zA-Z]+)\(([a-zA-Z]+).*$/@Subscribe \1 \2*/{mgroup=1}

必须使用 mgroup 选项来告诉 Ctags 如何确定表达式的行号。

答案 1 :(得分:0)

使用_multiline = N

[jet@localhost ~]$ cat foo.java
@Subscribe
public void catchEvent(SomeEvent

[jet@localhost ~]$ cat s.ctags
--langdef=javaspring
--langmap=javaspring:.java
--regex-javaspring=/@Subscribe(\s)*([a-z ]+)\s([a-zA-Z]*)\(([a-zA-Z]*)/\3-\4/{_multiline=2}

[jet@localhost ~]$ ~/var/ctags/ctags --options=./s.ctags --language-force=javaspring  -o - foo.java 
catchEvent-SomeEvent    foo.java    /^public void catchEvent(SomeEvent$/;"  r