$ cat options.ctags
--langdef=PHPext{base=PHP}
--kinddef-PHPext=a,arrayfunc,function defined in arrays
--regex-PHPext=/"(.*)"=>function/\1/a/
$ cat test.php
return array(
"test_func"=>function(string $str="test_func"){
return $str;
}
);
$ ctags --options=./options.ctags --fields='*' -f - test.php
test_func test.php /^ "test_func"=>function(string $str="test_func"){$/;" kind:arrayfunc line:2 language:PHPext roles:def extras:subparser
您可以把 options.ctags 存在 ~/.ctags.d/ 或运行 ctags 时目录的 ./.ctags.d/ 文件夹下,ctags 运行时就会自动加载它。
解析:
-
--langdef=PHPext{base=PHP}定义一个叫
PHPext的新语言(取 PHP extended 之意),作为 PHP 的 subparser 使用。扩展一个 parser 时,定义一种新语言是被鼓励的,这样就不会和语言本身的 kind 冲突。如果运行一下
$ ctags --list-kinds=php,可以看到已经有一个简写为a的 kind,表示aliases。 -
--kinddef-PHPext=a,arrayfunc,function defined in arrays为 PHPext 定义一个简写为
a,全名为arrayfunc的 kind,含义是function defined in arrays。 -
--regex-PHPext=/"(.*)"=>function/\1/a/这一行的语法是
--regex-<LANG>=<PATTERN>/<NAME>/[<KIND>/]LONGFLAGS。我们一段一段看:-
"(.*)"=>function用于匹配的模式。加括号的地方是这个函数的名字。
-
\1把加括号的模式匹配到的部分拿出来作为 tag 的名字。
-
a规定这个 tag 的 kind 为刚刚定义的
a。
-
请参阅 Extending ctags with Regex parser (optlib)
如果还有问题,欢迎随时讨论,这样我可以多点例子来证明 ctags is hackable ![]()