【问题标题】:How do I configure ctags to index PHP namespaces and their aliases?如何配置 ctags 来索引 PHP 命名空间及其别名?
【发布时间】:2013-08-24 20:00:55
【问题描述】:

当使用 PHP 命名空间时,我处理的代码使用了大量的命名空间别名,例如

<?php
namespace foo;

use bar\baz\qux as bazQux;

...

$a = new bazQux();

是否可以配置 Exuberant Ctags 来索引这些命名空间别名的使用,以便我可以从使用别名的行(上面的实例化)直接跳转到真正的类?如果这不可能,那么可以实现的最佳折衷方案是什么?

我在某处看到了一个尚未集成的 ctags 补丁,它使用 PHP 标记器来支持 PHP,而不是当前基于正则表达式的实现;如果可能的话,我想继续使用股票 ctags,而不是自己修补和编译一个版本。

【问题讨论】:

  • 它没有回答你的问题(它没有帮助类间导航)但是我最近发现了 phpctags,如果你也使用 vim 标签栏插件,这非常有用:*.com/questions/11290352/…跨度>
  • @Lambat 感谢您提供的信息; phpctags 看起来很有趣。

标签: php vim namespaces exuberant-ctags


【解决方案1】:

这是官方更新日志:http://ctags.sourceforge.net/news.html

他们似乎还没有在这个补丁中合并:

http://sourceforge.net/mailarchive/message.php?msg_id=30749245

所以我认为你找不到支持 php 命名空间的预构建包。

【讨论】:

  • 我怀疑你是对的,这是一种耻辱。看起来 ctags 不再被积极维护了;最后一次提交是 11 个月前。可惜这个 PHP 解析器补丁已经等了这么久了。
  • github.com/fishman/ctags 是一个更新了 php 解析器的分支。它可能会起作用。
【解决方案2】:

我对php不太了解,但我猜

use bar/baz/qux as bazQux;

应该是

use bar\baz\qux as bazQux;

用\universal-ctags(https://ctags.io)替换/后可以很好的捕获bazQux:

[jet@localhost]~/var/ctags% cat foo.php
cat foo.php
<?php
namespace foo;

use bar\baz\qux as bazQux;

[jet@localhost]~/var/ctags% ./ctags -o - foo.php
./ctags -o - foo.php
bazQux  foo.php /^use bar\\baz\\qux as bazQux;$/;"  a   namespace:foo   typeref:unknown:bar\\baz\\qux
foo foo.php /^namespace foo;$/;"    n

【讨论】:

  • 感谢您发现命名空间分隔符的语法错误。
【解决方案3】:

对于那些不等待的人来说,有解决方案:

您可以尝试为 ViM 改进的 PHP 全功能: https://github.com/shawncplus/phpcomplete.vim.

这个项目也支持诸如“use”关键字和命名空间之类的东西,但不幸的是它依赖于 CTags 的补丁版本。

以下是如何准备支持命名空间的 ctags 版本的说明: https://github.com/shawncplus/phpcomplete.vim/wiki/Patched-ctags

我知道这不是一个脑残的解决方案,它需要用你自己的 ctags 编译弄脏你的手,但它对我来说非常有效:)

【讨论】: