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?
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.
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
" 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!
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 ...
Celui-ci fonctionne comme prévu:
https://github.com/shawncplus/phpcomplete.vim
Il me manque juste les paramètres de fonction dans le pveview!
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.
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 .
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.
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
J'ai créé un plugin vim pour mon serveur d'achèvement padawan.php . Commander cette vidéo pour voir comment ça marche.