Comment obtenir l'auto-complétion intelligente en C ++?


43

Emacs ne peut pas rivaliser avec un autre IDE s'il n'a pas de fonction d'achèvement automatique. L'auto-complétion fait simplement de moi un programmeur plus efficace. Je connais l’ extension Auto Complete Mode , mais elle ne fonctionne pas avec C ++.

autocomplete

Comment puis-je réaliser l'auto-complétion intelligente et efficace pour C ++?


Malabarba a posé cette question à l’origine sur la proposition de la zone 51: comment obtenir une complétion automatique intelligente en C ++?


1
Ce serait bien de développer un peu cette question. Il a beaucoup de valeur potentielle, mais pour le moment, la question n'est que le titre.
Malabarba

Le mode Irony semble être la voie à suivre pour le moment.
Sevki

Réponses:


45

Disclaimer: je suis l'auteur de irony-mode

capture d'écran company-irony

Si vous souhaitez simplement une saisie automatique intelligente, je peux vous recommander le mode ironie avec l' entreprise ironique .

  • irony-mode est facile à installer grâce à MELPA
  • l' achèvement est très précis et la performance assez décente grâce à libclang
  • avec company-irony, vous avez un système d’ achèvement asynchrone qui ne vous gênera pas si l’achèvement prend un certain temps
  • company-irony supporte les fonctions surchargées et si vous avez installé Yasnippet, les arguments de la fonction sont insérés comme espaces réservés à remplir
  • si votre projet utilise Doxygen, la brève documentation du candidat à l'achèvement est affichée dans le mini-tampon (voir capture d'écran).
  • l'installation d'un serveur en mode ironie sur un système de type Unix (Linux, OS X) devrait être simple. Windows, d’autre part, nécessite quelques ajustements, mais cela est décrit dans le wiki.

Un autre outil qui n'a pas encore été cité est emacs-ycmd .


2
Merci beaucoup! Souhaite que j'ai découvert plus tôtirony-mode
Luke

@GuillaumePapin Merci d'avoir écrit cette ironie! Auriez-vous des repères de chronométrage disponibles? J'ai remarqué que les appels clang_codeCompleteAtavec une TU analysée (mais les modifications non enregistrées) prennent entre 3 et 5 secondes. Est-ce irony-modeplus rapide que cela?
Pradhan

1
Irony utilise libclang / clang_codeCompleteAt, vous n'aurez donc pas de meilleurs temps que cela. 3-5 secondes peuvent être trop longues selon le contexte (par exemple, les complétions au niveau global prennent beaucoup plus de temps que les autres). Vous pouvez jeter un coup d'œil à certains moments que j'ai récemment écrits
Guillaume Papin


Comment se comparent les rôles de irony-mode et emacs-ycmd? Sont-ils des alternatives les uns aux autres? Serait-il logique d'utiliser les deux?
Praxeolitic

23

Vérifiez mon guide . Il répertorie plusieurs méthodes d’achèvement automatique en C / C ++.

Ces options sont:

  • Utiliser l' ironie . Fortement recommandé, car il utilise Clang et facile à installer par rapport à d’autres solutions.

  • Utilisation de l'analyseur intégré d'Emacs. C’est la meilleure méthode de saisie automatique que vous puissiez obtenir, elle provient de l’analyseur Emacs, Semantic, mais elle serait lente pour les grands projets comme le noyau Linux.

  • Utilisation de company-modepackage avec company-clang. Fournit l'achèvement du code pour les chemins d'inclusion système, car il peut automatiquement obtenir les chemins de Clang, mais doit effectuer une configuration pour le projet local

  • Utiliser company-modeavec company-gtags. Il utilise la base de données de balises générée à partir de GNU Global en tant que complétion. Vous pouvez l'utiliser pour fournir du code complet localement à votre projet. Ce n'est pas tout à fait intelligent car il vous envoie tout ce qui se trouve dans la base de données générée.

  • rtagsva plus loin en fournissant un serveur pour l'analyse en direct. Mais la configuration est compliquée à comparer avec la solution pure Elisp.


Je ne serais pas d'accord pour dire que la mise en place de rtags est plus compliquée qu'une solution pure emacs lisp. La solution pure emacs lisp ne prend généralement pas en compte les fichiers cmake / build et est difficilement en mesure de trouver un en- tête. Rtags est assez facile à configurer en comparaison. C'est juste encore un peu jeune en tant que projet, avec une couverture de test pas très bonne.
mardi

Belle addition au guide de Tuhdo
Victor

9

J'ai eu beaucoup de succès avec RTags + Company .

RTags nécessite un démon distinct rdmqui utilise Clang pour l’achèvement du code, la navigation dans le code et le refactoring. rdmfonctionne également comme une base de données de symboles, ce qui signifie que l'auto-complétion est beaucoup plus rapide que toute solution qui appelle directement clang_codeCompleteAt.

GMD a besoin d' information des drapeaux de compilation pour vos projets qui peuvent être un problème, mais si vous suivez les conseils de la GCTR la page et un lien symbolique gcc-rtags-wrapper.shpour gcc, g++, ccet c++GMD est automatiquement mis à jour avec de nouvelles options de compilation sur recompilation.


Je viens de passer du mode d'ironie à rtags. Irony-mode craps constamment et cesse de fonctionner après environ 15 minutes environ. Rtags semble assez bon jusqu'ici, et a une intégration plus propre avec yasnippet.
Nenchev

6

Solution 1: mode entreprise + clang

Le seul problème est que vous devez indiquer au mode société où rechercher les fichiers d’en-tête c / c ++ de votre projet.

Si vous utilisez cmake, vous pouvez laisser https://github.com/redguardtoo/cpputils-cmake se charger de la configuration (astuce: je suis l'auteur de cpputils-cmake).

OU

Solution 2: mode entreprise + gnu global

Rien de plus à dire, vous devez créer les balises avec l’outil gnu global Cli, comme d’autres l'ont mentionné.


1

J'utilise cmake-ide pour configurer rtags, flycheck, irony et company-clang.

Maintenant, vous pouvez configurer votre système de construction et vos plugins emacs d'analyse statique préférés en même temps!

EDIT: Notez que la société clang fournit des compléments automatiques, ce qui était la fonctionnalité que vous recherchiez. cmake-ide peut également configurer flycheck et rtags, ce qui ajoute plusieurs fonctionnalités supplémentaires similaires à IDE.


1
Veuillez expliquer comment cela répond à la question de savoir comment obtenir la complétion automatique C ++.
Drew

@Drew company-clang propose des finitions
AnimatedRNG le

S'il vous plaît mettez-le dans votre réponse. THX.
Drew

0

Mode sémantique Mx

www.gnu.org/software/emacs/manual/html_node/semantic/Using-Semantic.html#Using-Semantic

&&

Tableaux Tags

trouver . -name "*. [chCH]" -print | etags -

www.gnu.org/software/emacs/manual/html_node/emacs/Tags.html

etags , ctags - génère un fichier de balises pour Emacs, vi

manpages.debian.org/cgi-bin/man.cgi?query=etags&apropos=0&sektion=0&manpath=Debian+8+jessie&format=html&locale=en

CMi (ou M-TAB) achèvement à point. Si le mode sémantique est activé, essaie d'utiliser les données de l'analyseur sémantique. Si le mode sémantique est désactivé ou échoue, tente de terminer à l'aide du tableau des balises sélectionnées (voir Balises).

http://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html#index-C_002dM_002di

M-. (find-tag) invite le nom de la balise && passe à la définition

http://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Tag.html#index-M_002d_002e

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.