【问题标题】:Vim PHP omni completionVim PHP 全方位补全
【发布时间】:2010-11-16 12:38:02
【问题描述】:

我正在尝试在 Vim 中获得 PHP 自动完成功能。现在,当我执行$blog = new Blog(); $blog-> 然后点击CTRL+X CTRL+O 时,我希望omnicompletion 返回Blog 类中的所有函数。

相反,它返回整个项目的所有函数。我已经为我的项目构建了 ctags,如下所示:ctags -R *

有没有办法让自动完成上下文感知?

【问题讨论】:

  • 我一直在使用 Eclimd,这似乎是将 Eclipse php 自动补全添加到 Vim 的一个不错的选择。 eclim.sourceforge.net/index.html
  • 一想到要引入一个完整的其他软件和一个正在运行的守护程序,只是为了让原本可以作为 Vim 脚本使用的东西发挥作用,我就不寒而栗。

标签: php vim autocomplete


【解决方案1】:

您可以使用非常强大的组合:

我尝试了很多东西:PHPComplete、Padawan 等等。这是我能找到的最好的。

如果您有兴趣,我还写了一篇文章如何做PHP IDE with Vim

【讨论】:

  • 不错的文章 Mattieu,我也爱上了 Phpactor
【解决方案2】:

试试

curl -L -s https://git.io/ide | sh

然后重新启动您的 nvim。您可能会获得代码完成和 goto 定义功能。

*目前只支持neovim

【讨论】:

    【解决方案3】:

    我为我的padawan.php completion server 创建了一个vim plugin。结帐this video 看看它是如何工作的。

    【讨论】:

      【解决方案4】:

      这个按预期工作:

      https://github.com/shawncplus/phpcomplete.vim

      我只是缺少pveview中的函数参数!

      【讨论】:

        【解决方案5】:

        catchmeifyoutry's answer 指出了一种解决方法,即在您使用omnicomplete 的行之前添加/* @var $myVar myClass */ 之类的注释,但是这很麻烦,而且对于编写注释所花费的时间,您也可以函数名是自己写的。

        解决方案:phpComplete

        这是一个 Vim 脚本:phpComplete

        你仍然需要为你的类生成一个标签文件,但是你可以在文件中使用omni complete,就像这样(根据脚本页面上的描述修改);

        此补丁允许进行文件内检查,因此您不需要注释。

        $blog = new Blog;
        ... 
        $blog->Blah(); // <-- complete without comment 
        

        它还允许支持单例实例化:

        $instance = Class::getInstance(); 
        $instance->completeMe(); // sweet completion
        

        【讨论】:

        • 我不明白。我使用 ctags 和 phpcomplete 并且在使用代码完成时仍然可以获得无数选项。
        • 不幸的是,在 Vim 中,对omnicompletion 的支持通常很糟糕,尤其是对于像 PHP 这样的解释型语言。最好的办法是自己改进支持,无论是通过编码还是提高意识。
        【解决方案6】:

        以下效果更好。取自http://weierophinney.net/matthew/archives/134-exuberant-ctags-with-PHP-in-Vim.html

        ctags \
        -f ~/.vim/tags \
        -h ".php" -R \
        --exclude="\.svn" \
        --totals=yes \
        --tag-relative=yes \
        --PHP-kinds=+ivcf \
        --regex-PHP='/(abstract)?\s+class\s+([^ ]+)/\2/c/' \
        --regex-PHP='/(static|abstract|public|protected|private)\s+function\s+(\&\s+)?([^ (]+)/\3/f/' \
        --regex-PHP='/interface\s+([^ ]+)/\1/i/' \
        --regex-PHP='/\$([a-zA-Z_][a-zA-Z0-9_]*)/\1/v/' \
        

        即使有上述情况,似乎也存在一些问题。例如phpcomplete 似乎不支持实例变量的方法。

        $this->objA = new SomeClass();
        $this->objA-><do_autocomplete> #fails
        

        然而,

        $objA = new SomeClass();
        $objA-><do_autocomplete> #works
        

        在尝试让 phpcomplete 在过去几个小时内正常工作之后,我对任何也在尝试的人的建议是停止。它效果不好,不值得麻烦。

        【讨论】:

        【解决方案7】:

        只有当标签文件包含both类定义、变量声明时,Omnicompletion才会起作用。

        简单的解决方案

        一般来说,这意味着您需要保存和(重新)生成标签文件class Blog { ... }$blog = new Blog();部分之后,但是在尝试$blog-&gt; &lt;C-X&gt;&lt;C-O&gt; 之前。 这是因为 PHP 全完备函数会在标签文件中查找 $blog 变量的类声明。

        (顺便说一句,如果您在缓冲区中打开了标签文件,请在重新生成后重新加载。)

        替代方案

        vim 文档 (:help ft-php-omni) 还定义了一种方法,它不需要在标签文件中对变量进行索引,而是在前一行使用特定的注释:

        /* @var $myVar myClass */
        $myVar->
        

        但是,类定义仍然确实需要在标签文件中,并且每次要使用omni-complete时都需要注释。所以在一个新的 PHP 文件中输入仍然不会给你很好的全能完成:(

        只是一个想法

        也许可以即时生成未保存缓冲区的临时标签文件(如 taglist 插件),并允许omni-complete 也使用它??虽然我不是一个伟大的 vim 黑客......

        【讨论】:

        • easytags 插件 (github.com/xolox/vim-easytags) 提供帮助:它允许拥有一个额外的标签文件,并且可以从当前文件本地更新它。
        【解决方案8】:

        在 C++ 中,我运行以下命令以获得更好的上下文敏感性:

        ctags '--c++-kinds=+p' '--fields=+iaS' '--extra=+q'
        

        它并不完美,但是在 ctags 将额外信息添加到上述命令指定的标签文件后,vim 可以更好地处理完成。

        【讨论】:

        • 目前这似乎不适用于 PHP(使用 ctags 5.9 SVN 快照); “--fields=+iaS”似乎没有什么区别。
        【解决方案9】:
        " Assuming Vim 7 (full version) is installed,
        "   adding the following to your ~/.vimrc should work.
        
        filetype plugin on
        au FileType php set omnifunc=phpcomplete#CompletePHP
        
        " You might also find this useful
        " PHP Generated Code Highlights (HTML & SQL)                                              
        
        let php_sql_query=1                                                                                        
        let php_htmlInStrings=1
        
        " Hope this helps!
        

        (通过http://www.linuxquestions.org/questions/linux-software-2/vim-omin-completion-for-php-621940/#post3155311

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-20
          • 1970-01-01
          • 1970-01-01
          • 2011-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多