我正在尝试在Vim中使用PHP自动完成功能。现在,当我执行$blog = new Blog(); $blog->
然后点击CTRL+X CTRL+O
时,我希望omnicompletion返回类Blog
中的所有函数。
相反,它返回整个项目的所有函数。我为我的项目构建了ctags,如下所示:ctags -R *
有没有办法让自动填充能够识别上下文?
答案 0 :(得分:17)
catchmeifyoutry's answer通过在您使用omnicomplete的行之前添加/* @var $myVar myClass */
之类的注释来指出解决方法,但这很麻烦并且在编写注释时需要花费时间,你也可以自己编写功能名称。
这是一个Vim脚本:phpComplete
您仍然需要为您的类生成一个标记文件,但是您可以在文件中使用omni complete,就像这样(根据脚本页面上的描述进行修改);
此修补程序允许进行文件内检查,因此您不需要注释。
$blog = new Blog; ... $blog->Blah(); // <-- complete without comment
它还允许支持单例实例化:
$instance = Class::getInstance(); $instance->completeMe(); // sweet completion
答案 1 :(得分: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!
答案 2 :(得分:7)
只有当标记文件包含 类定义,和变量声明时,Omnicompletion才有效。
直截了当的解决方案
一般来说,这意味着您需要在 class Blog { ... }
和$blog = new Blog();
部分之后保存并(重新)生成文件,但在尝试$blog->
<C-X><C-O>
之前。
这是因为PHP omni-complete函数将在标记文件中查找$blog
变量的类声明。
(顺便说一句,如果你已经在缓冲区中打开了标签文件,请在重新生成后重新加载它。)
<强>替代强>
vim文档(:help ft-php-omni
)还定义了一种方法,它不需要在标记文件中索引变量,而是在前一行使用特定注释:
/* @var $myVar myClass */
$myVar->
但是,仍然 的类定义需要在标记文件中,并且每次要使用omni-complete时都需要注释。所以在一个新的PHP文件中输入仍然不会给你很好的omni-completion :(
只是一个想法
也许有可能即时生成一个临时标签文件(如taglist插件)只是未保存的缓冲区,并允许omni-complete也使用它?我不是一个伟大的vim黑客...
答案 3 :(得分:5)
答案 4 :(得分:3)
以下效果更好。取自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工作了最后几个小时后,我的建议也是尝试的任何人,就是停止。它效果不好,不值得麻烦。
答案 5 :(得分:1)
在C ++中,我运行以下命令以获得更好的上下文敏感度:
ctags '--c++-kinds=+p' '--fields=+iaS' '--extra=+q'
这并不完美,但是在ctags将额外信息添加到上述命令指定的标签文件后,vim会更好地处理完成。
答案 6 :(得分:1)
答案 7 :(得分:0)
我为vim plugin创建了padawan.php completion server。结帐this video以查看其工作原理。
答案 8 :(得分:0)
试
curl -L -s https://git.io/ide | sh
然后重新启动你的nvim。您可能会完成代码并转到定义功能。
*目前,它仅适用于neovim