Vim PHP omni完成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vim PHP omni完成相关的知识,希望对你有一定的参考价值。

我正试图在Vim中使用php自动完成功能。现在,当我做一个$blog = new Blog(); $blog->,然后点击CTRL+X CTRL+O时,我希望omnicompletion返回类Blog中的所有函数。

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

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

答案

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
另一答案
" 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

另一答案

Omnicompletion仅在标记文件包含类定义和变量声明时才有效。

直截了当的解决方案

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

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

替代

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

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

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

只是一个想法

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

另一答案

这个按预期工作:

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

我只是错过了pveview中的函数参数!

另一答案

以下工作更好。取自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+classs+([^ ]+)/2/c/' 
--regex-PHP='/(static|abstract|public|protected|private)s+functions+(&s+)?([^ (]+)/3/f/' 
--regex-PHP='/interfaces+([^ ]+)/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在过去的几个小时内工作之后,我对任何人的建议都是尝试,就是停止。它不能很好地工作,不值得麻烦。

另一答案

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

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

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

另一答案

你可以使用一个非常强大的组合:

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

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

另一答案

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

另一答案

尝试

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

然后重新启动你的nvim。您可能会获得代码完成,并转到定义功能。

*目前,它仅适用于neovim

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

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

如何使用sublime代码片段快速输入PHP头部版本声明

Omni协议PHP开发包

latex在vim中的代码片段