14

我知道可以使用Ctrl+]跳转到 Vim 中的定义,这可以与 ctags 或 Cscope 结合使用。在使用 PHP 时,我正在寻找一个更准确的替代 ctags 和 Cscope 的方法。有时有多种可能的结果可供选择或误报。我只想跳转到光标下任何内容实际定义。理想情况下,这应该适用于变量、函数、常量和类。

我不明白为什么这不能通过分析文件来完成。通过学习和定制,我终于克服了我对 Vim 的所有其他烦恼/误解,所以如果我能解决这个问题,那就太棒了。

另外,其他人是否同意 Cscope 和 ctags 对 PHP 不够准确,还是我做错了什么?

更新

4 年后,我仍在使用 Vim 和 PHP,仍然遇到这个问题。我尝试过 eclim、ctags、exubarant-ctags、universal-ctags 和 cscope。我尝试将各种参数传递给这些程序,以使它们生成更好的标签。所有这些选项的体验都非常差。

但我现在更好地理解了这个问题。这些程序生成的标签可能没有任何问题。问题似乎在于,当您在 Vim 或 Neovim 中按Ctrl+]时,它只会查找具有该名称的标签。它不会查看您正在编辑的文件的上下文以查看它应该使用哪个名称的标签。它甚至不了解您正在编辑的语言,并从该语言的代码中查找标签。

有没有办法让vim根据上下文更智能地搜索标签文件,然后跳转到最有可能的位置?你知道,就像在一个好的 IDE 中会发生什么?

4

6 回答 6

4

作为一名 C++ 开发人员,我长期以来一直遇到类似的问题。直到几年前,我重新组织了在 Vim 下使用标记文件的方法。使它对我有用的技巧是为不同的代码片段生成单独的标签文件:我的项目、各种外部代码库等......然后我必须设置“标签”选项以优先查找文件顺序,我的本地代码项目文件首先出现,然后从那里向外工作,系统头文件是最后的。

就我而言,我为其中的每一个都有单独的标签文件,并在“标签”选项中按此顺序列出:

  1. 我的本地项目
  2. 此项目使用的任何其他项目
  3. 系统捆绑库(增强)
  4. 系统捆绑库 (WxWidgets)
  5. 系统库(C++ 标准库)
  6. 系统库(其他)

我不是 PHP 开发人员,但长期以来我犯的主要错误就是为所有内容生成单个标签文件。我将有超过 30 个标签进行多次搜索(使用 :tag 命令)。如果您生成多个标签文件,您可以更好地控制标签的搜索顺序,从而控制在哪些标签中找到文件。

看看这是否适合你。它对我有用。

于 2015-03-10T16:30:40.283 回答
3

要改进 PHP 的 ctags,您可以创建如下标签文件:

#!/bin/bash
cd /path/to/framework/library
exec ctags-exuberant -f ~/.vim/mytags/framework \
-h ".php" -R \
--exclude="\.svn" \
--totals=yes \
--tag-relative=yes \
--PHP-kinds=+cf \
--regex-PHP='/abstract class ([^ ]*)/\1/c/' \
--regex-PHP='/interface ([^ ]*)/\1/c/' \
--regex-PHP='/(public |static |abstract |protected |private )+function ([^ (]*)/\2/f/'

然后加载标签

:set tags=~/.vim/mytags/framework

取自我的博文

于 2011-12-21T10:01:07.263 回答
2

您可能还想看看eclim

这可以利用 eclipse 的完成功能,它应该适用于 PHP(我没有尝试过)。

于 2012-02-15T12:50:49.550 回答
2

为同样的问题苦苦挣扎了很长时间,直到我找到了LanguageServer for PHP

它提供了 GoToDefinition、ShowReferences、当前文档中的标签等功能。它可以与 fzf 直接集成。

我不喜欢它的地方:

  1. 与 padawan 等其他框架相比,自动完成速度很慢
  2. 它还没有缓存你项目的索引,这意味着当你打开neovim时它必须重新索引。不过,您可以在 GoToDefinition 仍在编制索引时使用它。

vim-plug 的快速设置:

Plug 'autozimu/LanguageClient-neovim', { 'do': ':UpdateRemotePlugins' }

Plug 'roxma/LanguageServer-php-neovim', {'do': 'composer install && composer run-script parse-stubs'}

autocmd FileType php LanguageClientStart

nnoremap <silent> gd :call LanguageClient_textDocument_definition()<CR>

nnoremap <silent> gr :call LanguageClient_textDocument_references()<CR>

到目前为止我找到的最佳解决方案。

于 2017-06-23T13:48:51.820 回答
1

更多的是一种解决方法,但是如果您按g CTRL+[而不是仅按CTRL+',您将获得该名称的所有标签的列表,并且您可以选择要跳转到的标签。

于 2011-12-02T19:49:23.133 回答
1

PHP 不是一种设计良好的语言,也不是静态类型的。因此,没有任何基础可以制造出在现实世界项目中实用的此类好的工具。IDE、语言服务器以及 Vim 和 Neovim 插件只能在语言允许的范围内了解代码。可以用尽可能多的类型在 PHP 中编写非常一致的代码,并且只使用语言的有限子集,以便工具可以理解它。但是,如果您的团队能够编写出如此优秀的 PHP 代码,那么他们就足以用设计更完善的语言重写代码,这种语言可以支持更好的工具,比如 Kotlin,它也有很好的 IDE 支持。

于 2016-08-01T15:12:52.980 回答