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->
<C-X><C-O>
之前。
这是因为 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 全方位补全的主要内容,如果未能解决你的问题,请参考以下文章