53 votes

L'omnicomplétion de Vim avec Python ne fonctionne tout simplement pas

J'ai cherché pendant une heure, à la fois sur Stack Overflow et ailleurs. Hélas ! Aidez-moi s'il vous plaît. L'omnicomplétion de Vim ne fait que ne fonctionne pas .

  1. J'ai compilé Vim 7.2 avec le support de Python.

  2. filetype plugin on est dans mon .vimrc .

  3. Lorsqu'un .py est ouvert, :echo &omnifunc imprime pythoncomplete#Complete .

  4. Je travaille sur un grand projet et j'ai un tags généré avec exhuberant-ctags . C'est dans la section ctags chemin. Je peux le tester en tapant ^] sur un symbole et je suis alors amené à la définition des symboles.

  5. Mise à jour 1 : Tout le code de mon projet se trouve dans le chemin de python-in-Vim. Je peux :python import myproject avec succès.

Maintenant, partout où j'essaie C-x C-o tout ce que j'ai, c'est :

-- Omni completion (^O^N^P) Pattern not found

Qu'est-ce que je fais de mal ?

Mise à jour 2 : Quand je tape C-x C-o C-n au niveau du module, Vim affiche une fenêtre de complétion avec quelques constantes de niveau module provenant d'autres modules de mon projet. Mais il ne s'agit que de constantes (symboles en majuscules) et la complétion ne fonctionne toujours pas ailleurs.

Mise à jour 3 : J'ai découvert que C-x C-o en haut du fichier lance une sorte d'omnicomplétion, et la complétion pour pprint. fait apparaître le menu et la référence rapide de tout ce qui se trouve dans l'application pprint module. Cependant, aucune des importations de mon propre module n'est complétée.

Mise à jour 4, un an plus tard : J'ai abandonné et j'ai appris Emacs. Je suis allé du côté obscur, le pays mystique de l'intrigue et des épices, et je te dis que j'ai trouvé la voie.

Mise à jour 5, deux ans plus tard : Je suis retourné à Vim. Emacs est magnifique, mais même après un an et demi d'Emacs, je suis toujours plus rapide à travailler avec Vim. J'ai arrêté d'écrire en Python pour le moment, cependant, et je ne peux pas tester l'efficacité de ces suggestions.

0 votes

Vous pourriez vouloir essayer ceci, si vous ne l'avez pas déjà fait : blog.dispatched.ch/2009/05/24/vim-as-python-ide

0 votes

@jellybean -- Bon lien, merci ! J'ai déjà utilisé minibufexpl.vim y Taglist.vim mais le TODO L'établissement d'une liste serait un excellent complément.

4 votes

Je n'ai jamais trouvé de réponse à cette question :(

12voto

codeape Points 38576

Quel module contient le symbole que vous essayez de compléter ? Est-il dans le stdlib de python ? Ou s'agit-il d'un module tiers ?

Assurez-vous que le module/package se trouve dans le PYTHONPATH.

Dans Vim, faites :

:python import sys
:python print sys.path

Pour ajouter le répertoire du module :

:python sys.path.append("/path/to/directory/")

0 votes

Bonnes suggestions, merci. Ce sont les symboles du code de mon projet. Oui, le chemin est dans le chemin de Python de Vim. J'ai mis à jour la description de la question.

0 votes

Il n'est donc pas possible d'avoir l'autocomplétion dans ses propres bibliothèques ?

0 votes

Oui, c'est possible, assurez-vous simplement que les modules et les paquets se trouvent quelque part dans le chemin de recherche des modules de Python.

10voto

gotgenes Points 8667

Puisque vous avez été prudent et que vous avez fait en sorte que votre code soit accessible par le PYTHONPATH, conformément à la suggestion de codeape, est-il possible que vous rencontriez le problème de l'erreur d'accès à l'Internet ? import bug pour Vim Python omni-complet ? Ce bogue existe toujours à partir de Vim 7.2.245.

Essentiellement, si tout échoue dans le fichier sur lequel vous travaillez, qu'il soit ou non enveloppé dans une balise Try-Except clause, ça va complètement casser l'omni-complétion. Il devrait être assez facile de vérifier cela, puisque la plupart des importations se produisent au tout début du fichier.

Si vous décidez que ce bogue est la cause de vos problèmes, vous avez plusieurs possibilités :

  • s'assurer que les modules que vous importez se trouvent dans le chemin du système, et pas seulement dans les fichiers du projet
  • en commentant tout import les déclarations qui échouent
  • Correction du bug
  • en utilisant ropevim comme méthode d'achèvement
  • à l'aide d'un autre éditeur ; l'EDI de Netbeans prend en charge Python, et l'application plugin jVi est plutôt bon si vous êtes un accro de Vim comme moi (ne vous laissez pas tromper par le look années 1990 de la page d'accueil)

1 votes

Moi aussi, j'ai rencontré ce problème d'importation qui détruit entièrement mon omni-complet. Je pense que même les "avertissements" sur le fait qu'un module a déjà été importé à partir d'un autre endroit du projet font planter votre session vim lorsque vous essayez de l'omni-compléter.

0 votes

Bodhi, jette un coup d'oeil à ropevim. (Voir le lien dans ma réponse éditée ci-dessus).

9voto

Kris Jenkins Points 2229

Il semble que l'auteur de la question soit depuis longtemps passé du côté obscur*, mais pour ce que ça vaut, je viens d'avoir ce symptôme, et dans mon cas, la cause était qu'un module que j'utilisais reposait sur Python 2.7 mais que ma version de Vim était compilée avec Python 2.5.

Pour diagnostiquer, j'ai essayé :python import mymodule qui a échoué avec une erreur concernant l'importation d'un module dépendant. Ensuite, :python import dependentmodule qui a échoué à l'étape suivante de la chaîne. Et ainsi de suite & ainsi de suite, jusqu'à ce qu'il échoue en essayant d'importer un module système qui était nouveau depuis Python 2.7. Problème trouvé.

Pour résoudre le problème, j'ai juste fait sudo port install vim +python27 . Mais c'est pour OSX. YMMV.

(* Je plaisante. Les utilisateurs d'Emacs sont nos amis. Ce sont les gens qui programment en Notepad que nous devons tous sauver...)

0 votes

C'est l'une des solutions les plus prometteuses. Merci !

0 votes

Intéressant J'ai l'impression que je rencontre le même problème ! J'utilise MacVim (Macports build) avec le support de python, et il est lié à (également Macports) Python 2.5 Je travaille sur un projet qui est Python 2.7 et je suis sûr que nous importons quelques modules 2.7 seulement. Lorsque le mien échoue lors de la complétion des tabulations (plugin Supertab), il provoque en fait une erreur de SEGV dans ma session vim ! J'espère que la réinstallation de MacVim avec python 2.7 résoudra le problème. Merci !

1 votes

J'ai pensé qu'un rapport valait la peine d'être envoyé - mon plugin Supertab et l'omnicompletion fonctionnent. beaucoup mieux maintenant, mais toujours font parfois planter ma session macvim :( Il semble que ce soit à chaque fois qu'il y a quelque chose de mauvais dans la séquence d'importation que la complétion est en train de regarder (comme une importation circulaire potentielle par exemple). Les choses s'améliorent, en tout cas, merci !

2voto

Sardathrion Points 1690

Après avoir mis à jour vers Fedora 16 (mais toujours en compilant vim à partir des sources), omni completion a cessé de fonctionner avec le même message que ci-dessus. Je l'ai "réparé" en remodelant les touches.

inoremap <C-space> <C-x><C-o>

sur ~/.vimrc et maintenant ça fonctionne à nouveau.

2voto

fspeech Points 31

J'ai eu un problème similaire avec la complétion omni qui ne fonctionne pas. Dans mon cas, il s'est avéré que le plugin minibufexpl.vim interférait avec la complétion omni. Voici comment je l'ai découvert :

La complétion normale des mots-clés fonctionne. Omni complete ne fonctionne dans aucun langage, pas seulement Python. omnifunc est correctement configuré. Après avoir fait C-X C-O, rien ne se passe. Je fais ":py print globals()" et il est clair que pythoncomplete n'a pas été chargé. Je peux ":call pythoncomplete#Complete(1, '')" et voir qu'il est chargé. Pour moi, cela exclut que ce soit un problème avec Vim. Il semble que quelque chose interfère avec le keymapping ou intercepte la demande de complétion omni. Je commence donc à désactiver mes plugins un par un. Il s'avère que le coupable dans mon cas est "minibufexpl". J'ai la version Holgado de github.

Il semble qu'il y ait beaucoup de problèmes ouverts avec MBE selon le tracker de problèmes sur github et il n'y a pas eu de progrès depuis début 2012. Je vais juste le désactiver pour le moment afin de pouvoir utiliser la complétion automatique. En attendant, je vais juste ajouter ce qui suit à mon vimrc pour garder plusieurs tampons modifiés ouverts en même temps et utiliser une simple séquence de touches pour les parcourir (MBE sélectionne plus intelligemment les tampons à parcourir mais semble trop lourd pour un problème simple) :

set hidden
noremap <C-TAB> :bnext<CR>
noremap <C-S-TAB> :bprev<CR>

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