Vim PHP 全方位补全

Posted

技术标签:

【中文标题】Vim PHP 全方位补全【英文标题】:Vim PHP omni completion 【发布时间】: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 脚本使用的东西发挥作用,我就不寒而栗。 【参考方案1】:

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

Phpactor nvim-completion-manager

我尝试了很多东西: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 在过去几个小时内正常工作之后,我对任何也在尝试的人的建议是停止。它效果不好,不值得麻烦。

【讨论】:

这仅仅是因为 ctags 对 PHP 的支持非常有限。 PHP有一个ctags fork github.com/b4n/ctags/tree/better-php-parser【参考方案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)

【讨论】:

以上是关于Vim PHP 全方位补全的主要内容,如果未能解决你的问题,请参考以下文章

vim 添加php自动补全 并格式化代码

centOS7 下的vim java补全

[转] vim配置python自动补全

Python 自动补全(vim)

linux下vim python代码自动补全

在vim编辑器python实现tab补全功能