web-dev-qa-db-fra.com

Omnicompletion de Vim avec Python ne fonctionne tout simplement pas

J'ai cherché pendant une heure, à la fois sur Stack Overflow et ailleurs. Hélas! S'il vous plaît aider. L'omnification de Vim, juste ne fonctionne pas .

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

  2. filetype plugin on est dans mon .vimrc.

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

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

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

Maintenant, partout où j'essaye C-x C-otout ce que je reçois c'est:

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

Qu'est-ce que je fais mal?

Mise à jour 2: Quand je tape C-x C-o C-n au niveau du module, Vim affiche un popup de finalisation avec quelques constantes au niveau du module provenant d'autres modules de mon projet. Mais ce ne sont que des constantes (symboles majuscules) et la complétion ne fonctionne toujours pas ailleurs.

Mise à jour 3: J'ai trouvé que C-x C-o en haut du fichier commence une sorte d'omnivialisation, et l'achèvement de pprint. fait apparaître le menu et la référence rapide de tout le contenu du module pprint. Cependant, aucune des importations de mon propre module n'est en cours d'achèvement.

Mise à jour 4, un an plus tard: J'ai abandonné et appris Emacs. J'ai visité le côté obscur, le pays mystique de l'intrigue et des épices, et je vous dis que j'ai trouvé le Chemin.

Mise à jour 5, deux ans plus tard: Je suis retourné à Vim. Emacs est beau, mais même après 1,5 ans d’Emacs, je suis toujours plus rapide dans mon travail à Vim. Cependant, j'ai arrêté d'écrire Python pour le moment et je ne peux pas tester l'efficacité de ces suggestions.

50
a paid nerd

Quel module contient le symbole que vous essayez de compléter? Est-ce dans le python stdlib? Ou est-ce un module tiers?

Assurez-vous que le module/package est dans PYTHONPATH.

Dans Vim, faites-vous:

:python import sys
:python print sys.path

Pour ajouter le répertoire du module:

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

Puisque vous êtes prudent et que votre code est accessible par PYTHONPATH, selon la suggestion de codeape, existe-t-il une possibilité que vous rencontriez le bogue import pour Vim Python omni-complete ? Ce bogue existe toujours à partir de Vim 7.2.245.

Essentiellement, si l'instruction any échoue dans le fichier dans lequel vous travaillez, qu'elle soit ou non encapsulée dans une clause Try-Except, elle interrompt complètement l'achèvement de la tâche. Cela devrait être assez facile à vérifier car la plupart des importations ont lieu au tout début du fichier.

Si vous décidez que ce bogue est la cause de vos problèmes, vos options incluent:

  • en s'assurant que les modules que vous importez sont sur le chemin du système, pas seulement les fichiers du projet
  • commentant toute instruction import qui échoue
  • corriger le bug
  • en utilisant ropevim comme méthode de complétion
  • en utilisant un éditeur différent; Netbeans IDE prend en charge Python et le plug-in jVi est plutôt utile si vous êtes un dépendant de Vim comme moi (ne vous laissez pas berner par le look des années 1990 de la page d'accueil).
9
gotgenes

On dirait que le questionneur est depuis longtemps passé du côté obscur *, mais je trouve ce symptôme intéressant, et dans mon cas, la cause est qu'un module que j'utilisais reposait sur Python 2.7, mais ma version de Vim était compilé avec Python 2.5.

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

Pour résoudre, je viens de faire Sudo port install vim +python27. Mais c'est pour OSX. YMMV.

(* Je rigole. Les utilisateurs d'Emacs sont nos amis. C'est la programmation des gens dans Notepad que nous devons tous sauvegarder ...)

9
Kris Jenkins

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

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

dans ~/.vimrc et maintenant cela fonctionne à nouveau.

2
Sardathrion

J'ai eu un problème similaire avec l'achèvement complet ne fonctionne pas. Dans mon cas, il s'est avéré que le plugin minibufexpl.vim interférait avec l'achèvement complet. Voici comment j'ai découvert:

La complétion normale des mots clés fonctionne. Omni complete ne fonctionne dans aucune langue, pas seulement dans Python. omnifunc est défini correctement. Après I C-X C-O, rien ne se passe. Je fais ": py print globals ()" et il est clair que le fichier pythoncomplete n'a pas été chargé. Je peux ": appeler pythoncomplete # Complete (1, '')" et le voir se charger. Pour moi, cela exclut qu'il s'agisse d'un problème lié à Vim. Il semble que quelque chose interfère avec le mappage de clé ou intercepte autrement la demande d'achèvement omni. Je commence donc à désactiver mes plugins un à un. Il se trouve que le coupable dans mon cas est "minibufexpl". J'ai la version Holgado de github. 

Selon le système de suivi des problèmes sur github, il semble y avoir de nombreux problèmes en suspens avec MBE et aucun progrès n’a été enregistré depuis le début de 2012. Je vais simplement le désactiver pour le moment afin que je puisse 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>
2
fspeech

Si vous utilisez python2, assurez-vous de 

Sudo apt-get install vim.nox-py2 

et utilisez vim.nox-py2 au lieu de vim.

0
csghone

Avez-vous essayé d'utiliser <C_x><C-]>?

0
m42a

c-x c-n permet d'obtenir la liste des membres d'un objet.

0
bytemangler

J'ai utilisé supertab (http://www.vim.org/scripts/script.php?script_id=1643)

C-x C-o est un peu frustrant à utiliser

dans .vimrc:

let g:SuperTabDefaultCompletionType = "<c-x><c-o>"

puis utilisez simplement Tabb pour l'omnification

0
klippo