web-dev-qa-db-fra.com

Vim PHP achèvement complet

J'essaie d'obtenir PHP autocompletion directement dans Vim. À l'heure actuelle, lorsque je fais un $blog = new Blog(); $blog-> et que je tape ensuite CTRL+X CTRL+O, je m'attendrais à ce que omnicompletion renvoie toutes les fonctions de la classe Blog

Au lieu de cela, il renvoie toutes les fonctions pour l'ensemble du projet. J'ai construit des ctags pour mon projet comme suit: ctags -R *

Existe-t-il un moyen de rendre l'auto-complétion sensible au contexte?

33
Karl

La réponse de catchmeifyoutry signale une solution de contournement en ajoutant un commentaire tel que /* @var $myVar myClass */ immédiatement avant la ligne sur laquelle vous utilisez omnicomplete. Toutefois, cela est fastidieux et pour le temps nécessaire pour écrire le commentaire, vous pouvez aussi avoir écrit la fonction vous nommez.

Solution: phpComplete

C'est un script Vim: phpComplete

Vous aurez toujours besoin d'un fichier de balises généré pour vos classes, mais vous pouvez ensuite utiliser omni complete dans le fichier, comme suit (modifié à partir de la description sur la page du script);

Ce correctif permet la vérification dans le fichier afin que vous n'ayez pas besoin du commentaire. 

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

Il permet également de prendre en charge les instanciations singleton: 

$instance = Class::getInstance(); 
$instance->completeMe(); // sweet completion
17
Jess Telford
" 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!

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

9
ax.

Omnicompletion ne fonctionnera que si le fichier de balise contient both la définition de la classe, et la déclaration de variable. 

Solution simple

En général, cela signifie que vous aurez besoin de save et (re) générer les balises file after les parties class Blog { ... } et $blog = new Blog();, mais avant essayer $blog-><C-X><C-O>. En effet, la fonction PHP omni-complete cherchera la déclaration de classe de la variable $blog dans le fichier de balises.

(Si vous avez ouvert le fichier de balises dans une mémoire tampon, rechargez-le après l'avoir régénéré.)

Alternative

La documentation vim (:help ft-php-omni) définit également une méthode qui n'exige pas que la variable soit indexée dans le fichier de balises, mais utilise à la place un commentaire spécifique sur la ligne précédente:

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

Cependant, la définition de classe toujours est doit figurer dans le fichier de balise, et le commentaire est nécessaire chaque fois que vous souhaitez utiliser la fonctionnalité omni-complete. Donc, taper dans un nouveau fichier PHP ne vous donnera toujours pas le bel omni-complétion :(

Juste une pensée

Peut-être est-il possible de générer à la volée un fichier de balises temporaires (comme le plugin taglist) du tampon non sauvegardé, et de permettre à omni-complete de l'utiliser aussi ?? Je ne suis cependant pas un grand pirate informatique ...

7
catchmeifyoutry

Celui-ci fonctionne comme prévu:

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

Il me manque juste les paramètres de fonction dans le pveview!

5
Andi

Ce qui suit fonctionne mieux. Tiré de 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/' \

Même avec ce qui précède, il semble y avoir quelques problèmes. par exemple. phpcomplete ne semble pas supporter les méthodes de vars d'instance. 

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

Cependant, 

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

Après avoir essayé de faire fonctionner phpcomplete pendant ces dernières heures, mon conseil à ceux qui essaient aussi, est d'arrêter. Cela ne fonctionne pas bien et ne vaut pas la peine.

3
Thanh Nguyen

Vous pouvez utiliser un combo assez puissant:

J'ai essayé beaucoup de choses: PHPComplete, Padawan et ainsi de suite. C'est le meilleur que j'ai pu trouver.

Au cas où cela vous intéresserait, j’ai également écrit un article sur la manière de faire un PHP IDE avec Vim .

1
Matthieu

En C++, je lance ce qui suit pour obtenir une meilleure sensibilité au contexte:

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

Ce n'est pas parfait, mais après que ctags ajoute les informations supplémentaires au fichier de balises, comme spécifié par la commande ci-dessus, vim gère mieux la complétion.

1
Kaleb Pederson

essayer

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

puis relancez votre nvim. Vous pourriez avoir l'achèvement du code et des fonctionnalités de définition.

* Actuellement, il n'est disponible que pour neovim

0
Xiaohui Lam

J'ai créé un plugin vim pour mon serveur d'achèvement padawan.php . Commander cette vidéo pour voir comment ça marche.

0
Aleh Kashnikau