VIM - 针对PHP的ctags / Cscope更准确的替代/解决方法?

时间:2011-12-01 23:06:45

标签: php vim ctags cscope

我知道可以使用 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里会发生什么?

6 个答案:

答案 0 :(得分:4)

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

在我的情况下,我为每个标签提供了单独的标签文件,并按照此顺序列在'标签中。选项:

  1. 我的本地项目
  2. 此项目使用的任何其他项目
  3. 系统捆绑库(boost)
  4. 系统捆绑库(WxWidgets)
  5. 系统库(C ++标准库)
  6. 系统库(所有其他)
  7. 我不是PHP开发人员,但是我长期犯的主要错误就是生成单个标记文件FOR EVERYTHING。我有超过30个标签可以多次搜索(使用:tag命令)。如果您生成多个标签文件,则可以更好地控制标签的搜索顺序,从而更好地控制找到文件的标签。

    看看它是否适合您。它确实适合我。

答案 1 :(得分: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

取自blog post

答案 2 :(得分:2)

您可能还想看看eclim

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

答案 3 :(得分:2)

长时间遇到同样的问题,直到找到LanguageServer for PHP

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

我不喜欢的事情:

  1. 与padawan等其他框架相比,自动完成速度较慢
  2. 它不会缓存(还)你的项目的索引,这意味着,当你打开neovim时它必须重新索引。不过,您可以在GoToDefinition功能仍在编制索引时使用它。
  3. 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>

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

答案 4 :(得分:1)

更多解决方法,但如果您按g CTRL+[而不是CTRL+',则会获得该名称的所有标记的列表,您可以选择要跳转的标记。

答案 5 :(得分:1)

LanguageServer-php-neovim是一个Neovim插件,非常适合代码定义查找。它甚至适用于变量!它基本上允许您通过php-language-server插件使用最初为VS Code设计的LanguageClient-neovim插件,在Neovim内部。这是可能的,因为php-language-server被设计为使用VS Code Language Server Protocol,这是一个由Microsoft创建的开放协议,现在许多语言的编辑都支持它。有些人有兴趣让语言服务器协议在Neovim中拥有原生支持,而不需要插件来支持该协议。如果这种情况很快发生,我不会感到惊讶,因为已经有一项工作正在进行pull request。如果Neovim开始支持这个,你只需要一个语言插件。

如果您不想或不能将其设置为适合您的项目,并且您决定坚持使用标签,那么了解标签的局限性非常重要。标记文件通常只是一个文件,其中包含出现在代码中的关键字,以及它们在您的代码中的位置。在编辑器或IDE中使用类似的东西需要相当多的工作,自定义和独创性来提供代码完成或跳转到与其他工具一样聪明的功能,这些工具旨在更深入地了解您的代码。话虽如此,如果你真的想坚持使用标签,我个人认为我的project-tags插件是你在Vim内部获得的最佳体验,因为我是为了填补这个需求并做我希望的其他标签插件没有。

哎呀,算了吧。语言服务器太成问题了。我5年前发布了我的问题,5年后仍然没有好的解决方案。我放弃!我放弃了PHP,放弃了Vim和Neovim。我正在转向Kotlin和InjelliJ IDE。即使我现在仍然需要使用PHP,我也会切换到PhpStorm。我仍然会使用Vim插件。 Vim和Noevim是伟大的编辑,但是试图争论一堆智能工具在他们内部工作,好像他们都被设计为一起运行以提供良好的体验只是不适合我,而且我已经尝试了很多年。我将始终根据需要使用这些工具,当你必须进入服务器并进行一些简单的编辑时,它们非常适合。但是对于硬核开发而言,您需要语言感知,生产力提升工具,这些工具都是精心设计的,以协同的方式协同工作,以提供独特的体验。或者换句话说,您需要一个集成的开发环境。