Citre: 先进的 Ctags 前端

$ 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 :wink:

4 个赞