Saisie semi-automatique dans Vim

257

En un mot, je recherche une fonctionnalité de saisie semi-automatique fonctionnelle pour l'éditeur Vim. J'ai déjà soutenu que Vim remplace complètement un IDE sous Linux et bien que cela soit certainement vrai, il manque une caractéristique importante: la saisie semi-automatique.

Je connais Ctrl+ N, l' intégration Exuberant Ctags , Taglist , cppcomplete et OmniCppComplete . Hélas, rien de tout cela ne correspond à ma description de "la saisie semi-automatique de travail:"

  • Ctrl+N fonctionne bien (uniquement) si vous avez oublié comment épeler class, ou while. Tant pis.
  • Ctags vous donne les rudiments mais a beaucoup d'inconvénients.
  • Taglist est juste un wrapper Ctags et en tant que tel, hérite de la plupart de ses inconvénients (bien qu'il fonctionne bien pour lister les déclarations).
  • cppcomplete ne fonctionne tout simplement pas comme promis, et je ne peux pas comprendre ce que j'ai fait de mal, ou s'il «fonctionne» correctement et que les limitations sont de par leur conception.
  • OmniCppComplete semble avoir les mêmes problèmes que cppcomplete, c'est-à-dire que l'auto-complétion ne fonctionne pas correctement. De plus, le tagsfichier doit à nouveau être mis à jour manuellement.

Je suis conscient du fait que même les IDE modernes ne proposent pas une bonne complétion de code C ++. C'est pourquoi j'ai accepté le manque de Vim dans ce domaine jusqu'à présent. Mais je pense qu'un niveau fondamental de complétion de code n'est pas trop demander et est en fait requis pour une utilisation productive. Je cherche donc quelque chose qui puisse accomplir au moins les choses suivantes.

  • Connaissance de la syntaxe . cppcomplete promesses (mais ne tient pas pour moi), auto-complétion correcte et consciente de la portée des éléments suivants:

    variableName.abc
    variableName->abc
    typeName::abc

    Et vraiment, tout le reste est complètement inutile.

  • Configurabilité . J'ai besoin de spécifier (facilement) où se trouvent les fichiers source, et donc d'où le script obtient ses informations d'auto-complétion. En fait, j'ai un Makefile dans mon répertoire qui spécifie les chemins d'inclusion requis. Eclipse peut interpréter les informations qui s'y trouvent, pourquoi pas un script Vim également?

  • Actualité . Dès que je change quelque chose dans mon fichier, je veux que l'auto-complétion reflète cela. Je ne pas envie de déclencher manuellement ctags(ou quelque chose de comparable). En outre, les changements devraient être supplémentaires , à savoir quand j'ai changé un seul fichier , il est tout à fait inacceptable pour ctagsla re-analyser l'arborescence du répertoire entier (qui peut être énorme).

Ai-je oublié quelque chose? N'hésitez pas à mettre à jour.

Je suis à l'aise avec beaucoup de configuration et / ou de bricolage, mais je ne veux pas programmer une solution à partir de zéro, et je ne suis pas bon pour déboguer les scripts Vim.

Une dernière note, j'aimerais vraiment quelque chose de similaire pour Java et C #, mais je suppose que c'est trop à espérer: ctagsseuls les fichiers de code analysent et Java et C # ont d'énormes cadres précompilés qui devraient être indexés. Malheureusement, développer .NET sans IDE est encore plus un PITA que C ++.

Konrad Rudolph
la source
4
Cela fait longtemps que vous n'avez pas posé cette question, en avez-vous enfin trouvé une bonne? Je demande parce que je ne vois aucune réponse acceptée. Personnellement, je dois admettre que j'ai eu recours au préfixe de mes variables / fonctions. Par exemple, tous commencent par sh(ce qui signifie que c'est dans ma bibliothèque) et sont suivis de l'abréviation de ma classe. Par exemple shPpour la Parserclasse. Ensuite, tout ce que vous devez faire est d'écrire shPet d'appuyer sur CTRL + p (ou CTRL + n si vous voulez) et d'obtenir les membres de la classe de la dernière utilisation à la première (ou du premier à la dernière si CTRL + n)
Shahbaz
4
@Shahbaz En fait, je suis convaincu qu'il n'y a pas de bonne solution pour le moment. clang_completeest techniquement le plus sonore mais excessivement lent en raison du manque de mise en cache des résultats et de la compilation partielle. Je dois admettre que je n'ai pas essayé toutes les réponses car certaines nécessitent une configuration compliquée et longue. Je retiendrai mon souffle pour un plugin utilisable maintenant que clang permet enfin aux développeurs de construire des AST à partir de sources C ++ (jusqu'à présent, il n'y avait pas de bons analyseurs gratuits pour C ++ disponibles).
Konrad Rudolph
2
Avez-vous essayé clang_completerécemment? Il peut être utilisé libclangavec la mise en cache maintenant et devrait donc être plus rapide.
Jan Larres
@Jan Merci pour l'info. Lors de ma dernière tentative, le support de libclang était encore incomplet. Je devrais probablement réessayer une fois que j'aurai le temps.
Konrad Rudolph
(Raison de l'annulation de la modification: les noms de produit ne sont pas du code, ils n'appartiennent pas formatted like this.)
Konrad Rudolph

Réponses:

171

Essayez YouCompleteMe . Il utilise Clang via l'interface libclang, offrant une complétion sémantique C / C ++ / Objective-C. C'est un peu comme clang_complete, mais beaucoup plus rapide et avec une correspondance floue.

En plus de ce qui précède, YCM fournit également une complétion sémantique pour C #, Python, Go, TypeScript, etc.

Valloric
la source
69
En fait, je vais accepter cette solution. Enfin un plugin qui livre. Je l'utilise depuis plusieurs jours maintenant. Il n'a fallu que quatre ans pour répondre à cette question. ;-)
Konrad Rudolph
5
travail génial avec YouCompletMe valloric! Congrats
statquant
5
Dommage que YouCompleteMe soit un PITA complet à installer sur Windows :(
xx
2
@DrTwox D'après le fichier lisez-moi: "YCM n'a pas de support officiel pour Windows , mais cela ne signifie pas que vous ne pouvez pas le faire fonctionner là-bas. Consultez la page wiki du Guide d'installation de Windows. N'hésitez pas à y ajouter."
user456584
7
Cet article doit mentionner que vous êtes l'auteur, car il s'agit d'une auto-promotion limite (bien que je ne prétende pas qu'il réponde à la question, vous devez néanmoins inclure un avertissement).
EntangledLoops
36

Il y a aussi clang_complete qui utilise le clangcompilateur pour fournir l'achèvement du code pour les projets C ++. Il y a une autre question avec des conseils de dépannage pour ce plugin.

Le plugin semble fonctionner assez bien tant que le projet se compile, mais il est excessivement lent pour les grands projets (car il tente une compilation complète pour générer la liste des balises).

Konrad Rudolph
la source
Le clang_completeplugin fonctionne bien sur Cygwin et Windows. Je ne peux rien dire sur les grands projets car je n'en ai pas. :)
Lumi
Il semble que clang_complete utilise libclang a maintenant un cache. Ce devrait être alors la réponse acceptée. Avez-vous essayé clang_complete sur le noyau Linux? le meilleur indexage que j'ai vu pour le noyau utilise Eclipse CDT, si clang_complete peut gérer le noyau, il devrait être en mesure de compléter n'importe quoi.
dashesy
clang_complete est tout simplement le meilleur plugin Vim que j'utilise.
Cromulent
1
@Cromulent Ah, vérifiez YouCompleteMe, c'est beaucoup mieux.
Konrad Rudolph
@KonradRudolph Merci. Je vérifierai.
Cromulent
6

Je viens de trouver le projet Eclim lié dans une autre question . Cela semble assez prometteur, du moins pour l'intégration Java.

Konrad Rudolph
la source
L'avez-vous testé? Semble intéressant.
Pacane
@ Pacane: non. Je n'ai pas eu à utiliser Java depuis des mois et je n'ai pas eu de temps libre pour expérimenter.
Konrad Rudolph
1
Eclim semble être une excellente solution pour Java, bien qu'Eclipse reste une bête à charger même dans une configuration sans tête
Drupad Panchal
2
Pour Java, vous pouvez utiliser Vrapper . Je trouve que c'est généralement OK avec une superbe auto-complétion. Pour les éditions occasionnelles de texte lourd, je peux lancer Vim réel comme un outil externe.
kizzx2
2

est ce que vous cherchez quelque chose comme intellisense?

insevim semble résoudre le problème.

lien vers les captures d'écran ici

Ric Tokyo
la source
2
Ce serait ce que je recherche, oui. Malheureusement, il ne fonctionne que sur Windows (j'utilise OS X). De plus, la dernière mise à jour semble avoir été faite vers 2003. :-(
Konrad Rudolph
Eh bien, vous pouvez obtenir le code source :) sinon, la seule chose à laquelle je peux penser est l'omnicompletion .. ou jetez un œil à ceci: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop pour les trucs .net au moins ..
Ric Tokyo
Ric, veuillez fournir votre commentaire sous la forme de deux réponses distinctes, elles sont inestimables et je voudrais les honorer correctement! Cela dit, MonoDevelop est inutilisable sous OS X à partir de maintenant, et j'examine actuellement OmniCppComplete.
Konrad Rudolph
Lol c'est des fenêtres seulement! :( Pourquoi devriez-vous vouloir cela sur des fenêtres où vous avez VS .. Je recherche une solution sur Linux.
Nils
Nils: Tout le monde n'a pas accès à Visual Studio, aussi beaucoup de gens ont des compétences vi qu'ils veulent appliquer dans l'environnement Windows. Il y avait un port pour Linux, mais il est actuellement en panne. Dans tous les cas, qu'essayez-vous de réaliser? êtes-vous sûr que vous n'avez pas seulement besoin des fonctions de saisie semi-automatique par défaut? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Ric Tokyo