33 votes

Vim PHP omni completion

J'essaie d'utiliser l'autocomplétion PHP dans Vim. Actuellement, lorsque je fais un $blog = new Blog(); $blog-> et puis appuyez sur CTRL+X CTRL+O Je m'attendrais à ce que l'omnicomplétion 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 ça : ctags -R *

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

3 votes

J'ai travaillé avec Eclimd qui semble être une bonne alternative pour ajouter l'autocomplétion php d'Eclipse à Vim. eclim.sourceforge.net/index.html

3 votes

Je frémis à l'idée d'introduire un tout autre logiciel et un démon en cours d'exécution juste pour faire fonctionner quelque chose qui est déjà disponible en natif comme un script de Vim.

17voto

Jess Telford Points 1606

La réponse de catchmeifyoutry indique une solution de contournement en ajoutant un commentaire tel que /* @var $myVar myClass */ immédiatement avant la ligne sur laquelle vous utilisez omnicomplete, cependant c'est encombrant et pour le temps qu'il faut pour écrire le commentaire, vous pourriez aussi bien avoir écrit le nom de la fonction vous-même.

Solution : phpComplete

C'est un script de Vim : phpComplete

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

Ce correctif permet une vérification dans le fichier, vous n'avez donc pas besoin du commentaire.

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

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

$instance = Class::getInstance(); 
$instance->completeMe(); // sweet completion

0 votes

Je ne comprends pas. J'utilise ctags et phpcomplete et j'obtiens toujours des millions d'options en utilisant la complétion de code.

3 votes

Malheureusement, la prise en charge de l'omnicomplétion en général est mauvaise dans Vim, surtout pour les langages interprétés comme PHP. Votre meilleure chance est d'améliorer le support vous-même, soit en codant, soit en sensibilisant le public.

9voto

ax. Points 22269
" 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 )

7voto

catchmeifyoutry Points 4956

L'omnicomplétion ne fonctionnera que si le fichier de balises contient les deux la définition de la classe, y la déclaration de la variable.

Une solution simple

En général, cela signifie que vous devrez sauvegarder et (re)générer les étiquettes fichier après el class Blog { ... } y $blog = new Blog(); pièces, mais avant en essayant $blog-> <C-X><C-O> . En effet, la fonction omni-complète de PHP recherchera la déclaration de classe de l'objet $blog dans le fichier de balises.

(BTW si vous avez ouvert le fichier de balises dans un tampon, rechargez-le après l'avoir régénéré).

Alternative

La documentation de vim ( :help ft-php-omni ) définit également une méthode qui ne nécessite 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 la classe reste fait doivent être dans le fichier de balises, et le commentaire est nécessaire chaque fois que vous voulez utiliser omni-complete. Donc taper dans un nouveau fichier PHP ne vous donnera toujours pas l'omni-complétion :(

Juste une pensée

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

0 votes

Le plugin easytags ( github.com/xolox/vim-easytags ) y contribue : il permet d'avoir un fichier de balises supplémentaire et de le mettre à jour localement à partir du fichier courant.

5voto

Andi Points 71

Celui-ci fonctionne comme prévu :

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

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

3voto

Thanh Nguyen Points 195

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 des variables 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 ces dernières heures, je conseille à tous ceux qui essaient également de le faire d'arrêter. Il ne fonctionne pas bien et ne vaut pas la peine d'être utilisé.

0 votes

C'est simplement parce que le support de ctags pour PHP est très limité. Il existe un fork ctags pour PHP github.com/b4n/ctags/tree/better-php-parser

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X