Utilisation d'Emacs en tant qu'EDI C / C ++ complet


50

Cela fait maintenant plus d'un an que j'essaie d'utiliser Emacs en tant qu'EDI C / C ++. Mon succès n’a été que marginalement jusqu’à présent, mais je me suis heurté à quelques murs de briques. Actuellement, j'essaie d'utiliser CEDET, mais j'ai du mal à comprendre comment l'utiliser efficacement.

Les fonctionnalités que je recherche dans un IDE sont les suivantes:

  1. Gestion de "projets" logiciels. Je souhaite que mon IDE ait une idée de tous les fichiers qui composent mon projet actuel afin de pouvoir exécuter des fonctions telles que la recherche et le remplacement dans mon projet. (Ce serait bien si je pouvais également y parvenir sans surcharger mon arbre source avec beaucoup de fichiers de support. Pourquoi ai-je besoin de plus d'un fichier de projet centralisé par projet?)
  2. La possibilité de construire le projet actuel à partir de l'EDI, quel que soit le tampon sur lequel je visite actuellement. Je dois être capable de lier une clé qui construira le projet actuel.
  3. Rapport d'erreur. Je ne veux pas avoir à lire plus de 500 lignes de sortie pour trouver les erreurs rapportées par les outils de construction. De préférence, les erreurs apparaissent dans leur propre tampon avec une ligne par erreur.
  4. Une prise de conscience des symboles dans le projet et où ils sont définis. Je souhaite accéder à une définition de symbole, qu'il soit dans les fichiers de mon projet ou dans les fichiers inclus du système.
  5. Débogage visuel. Je souhaite disposer d'une liste de surveillance des variables locales qui se mettent à jour automatiquement lorsque je parcours le code. Je veux être capable de définir des points d'arrêt dans le code pour voir quelle ligne de code sera exécutée ensuite.

Je sais que chacune de ces fonctionnalités existe parce que je les ai déjà utilisées à un moment ou à un autre en utilisant EDE, Semantic, GDB, etc. Le problème est que je n'ai jamais pu faire fonctionner toutes ces fonctionnalités en même temps. , car chaque pièce doit généralement être configurée par elle-même, et il s’agit en général de trop de travail pour déterminer comment les configurer toutes en même temps et les faire fonctionner ensemble.

Quelles sont les solutions pour transformer Emacs en un IDE C / C ++ complet? Devez-vous toujours tout configurer à la pièce ou existe-t-il un moyen de configurer toutes les fonctionnalités à la fois?

EDIT: Une bonne réponse à cette question ne doit pas nécessairement répondre aux cinq critères donnés. J'ai simplement fourni la liste pour donner une idée plus concrète du type de fonctionnalités que je veux voir avant de considérer un IDE comme "complet". Il est tout à fait possible que CEDET convienne, mais je n'ai pas encore trouvé de didacticiel pas à pas permettant de l'installer à partir de zéro.


6
Cette question pourrait être mieux divisée en plusieurs. Vous pourriez vous retrouver avec un tas de réponses partielles, où aucun des éléments ne reçoit l’attention qu’il mérite.
Malabarba

2
En outre, l'élément 1 pourrait être un duplicata de emacs.stackexchange.com/questions/448/…
Malabarba

6
@Malabarba: Si je posais cinq questions distinctes, cela pourrait être un doublon. Le point essentiel de cette question est qu'il peut y avoir cinq packages différents qui atteignent les cinq objectifs différents, mais il est presque impossible de les configurer pour qu'ils fonctionnent bien l'un avec l'autre. Si la réponse revient sous la forme "Emacs ne peut pas fonctionner comme un IDE complet, car la configuration prend beaucoup de temps." alors ainsi soit-il.
nispio

4
Chacun des points peut être sa propre question (potentiellement dupliquée), les regrouper en une seule question peut parfois conduire à des réponses différentes en raison de l’interaction des packages.
Jonathan Leech-Pepin

Réponses:


27

Il existe différents niveaux "IDE-ness" pour différentes langues et, malheureusement, vous n'obtiendrez jamais toutes les fonctionnalités de l'IDE sans une configuration (si vous n'aimez pas configurer, vous ne devriez probablement pas utiliser Emacs). CEDET vise à être une solution complète qui couvre tous vos besoins pour les langues prises en charge, mais personnellement, je ne l’ai jamais fait fonctionner correctement; Au lieu de cela, j'utilise quelques paquets en tandem pour couvrir mes bases IDE. Je vais passer en revue vos points dans l’ordre, avec quelques solutions pour les différentes langues que je connais:

  1. projectile est le paquet le plus proche pour fournir une expérience semblable à celle d'un IDE. Il fournit une tonne de fonctionnalités utiles pour chaque projet. Vous voudrez probablement aussi une sorte de gestion de fenêtre / espace de travail; J'utilise ma propre solution appelée wacspace , mais d'autres bonnes solutions incluent la perspective , les groupes de travail et elscreen .
  2. Différentes langues ont des idées différentes sur ce qu'est un "build", mais M-x compilepeuvent tout faire et permettent de retrouver facilement les erreurs (utilisation simple next-error). Vous pouvez facilement personnaliser projet par projet en utilisant des variables de répertoire à définir compile-command. Vous pouvez exécuter compileavec projectile using projectile-compile-project( C-c p c).
  3. M-x compilea également couvert ici - les erreurs finissent généralement par une dans la *compilation*mémoire tampon, avec pagination facile avec next-error.
  4. Passer à un symbole implique de "comprendre votre code" et c’est là que le support varie énormément d’une langue à l’autre. Pour Elisp, vous pouvez utiliser l'excellent elisp-slime-nav , puis M-.passer directement à la définition. Voici quelques paquets qui fournissent un support similaire pour d’autres langues: CIDER (for Clojure); SLIME (pour Common Lisp); robe (pour Ruby); balises sémantiques ou clang pour C / C ++ (disclaimer: je n'ai jamais utilisé non plus, donc je ne sais pas si elles fonctionnent bien). Si tout le reste échoue, vous pouvez également utiliser les installations TAGS intégrées d'Emacs en utilisant quelque chose comme des balises ctags exubérantes , mais je n'ai jamais obtenu de résultats aussi acceptables avec TAGS.
  5. Emacs a un support très dispersé pour les débogueurs. GDB avec GUD est votre meilleur choix pour les langues de type C; sinon, c'est à peu près entièrement par langue. (Je ne pense pas que le débogage visuel multilingue soit vraiment un objectif réaliste.)

4
En tant que nœud latéral, il est projectilepossible de s’intégrer directement à la perspectivecréation perspective-per-projectautomatique d’ un commutateur de projet.
Jonathan Leech-Pepin

Je voudrais ajouter des notes sur le point semanticn ° 4, Sémantique est un bon paquet, il comprend votre code et peut faire beaucoup de choses utiles avec ces informations.
Jordon Biondo

Je ne l'ai jamais vraiment utilisé semantic, et je pense me souvenir qu'il dispose d'une prise en charge C ++ incomplète, mais je l'ai ajouté à la réponse.
Shosti

15

J'ai utilisé ce guide pour commencer à utiliser Emacs en tant qu'EDI C ++. Il présente Helm et Projectile qui aident à répondre à plusieurs de vos questions. En être témoin,

  1. Projectile gère les projets. Il recherche dans l’arborescence des répertoires les fichiers Makefile, SConstruct, Git, SVN et peut-être un autre fichier de système de construction ou de contrôle de version pour connaître automatiquement les fichiers associés au projet en cours. Par exemple, les C-c p hexécutions helm-projectilequi utilisent Helm pour rechercher un fichier dans le projet en cours.

  2. Projectile peut construire vos projets. C-c p cexécute projectile-compile-projectqui essaie d’exécuter Make / SCons / CMake en fonction des fichiers disponibles. Je n'ai jamais eu à configurer cela; il a toujours su quoi faire.

  3. Les erreurs apparaissent dans leur propre tampon lorsque vous vous lancez, projectile-compile-projectmais je ne suis pas sûr que ce soit aussi joli que vous le voudriez.

  4. Vous pouvez utiliser le paquet helm-gtagsqui interface avec le gtagsprogramme (que vous devriez avoir disponible sur votre système). Notez que gtags est un projet GNU et qu'il est donc peu probable qu'il fonctionne immédiatement sous Windows.

    Une fois configuré, Helm prend conscience des symboles du projet et peut naviguer dans les définitions et utiliser les emplacements. Par exemple, vous helm-gtags-dwimpouvez accéder à n'importe quelle utilisation d'une variable ou d'une fonction et, lorsqu'il est exécuté sur un fichier d'en-tête, ouvre ce fichier d'en-tête.

  5. Je n'ai pas encore essayé cela.

Le guide répertorié fournit des informations de configuration très explicites sur la façon de commencer.


J'ai aussi trébuché sur ce guide et je l'ai appliqué. IMHO c'est en quelque sorte un poids lourd et change beaucoup d'interaction basique avec emacs. J'ai désactivé un certain nombre de configurations liées à Helm car elles interféraient avec les raccourcis habituels (comme ouvrir facilement un répertoire courant dans un tampon ou ouvrir un fichier dans un sous-répertoire en quelques frappes de touche). Cela vaut le coup d'œil, mais devrait probablement être essayé progressivement, et non dans son ensemble.
Stéphane Gourichon

9

Puisque vous demandez maintenant un IDE complet en C / C ++, je pourrais être qualifié.

J'ai utilisé tous les IDE MS de vc4 à Visual Studio 2010, alors je comprends tout à fait ce que vous voulez.

La bonne nouvelle est qu’Emacs pourrait être à 95% aussi performant que Visual Studio et qu’il peut faire beaucoup plus. mais vous pourriez ne pas être intéressé par la partie "plus". Je me concentrerai donc uniquement sur vos questions.

Maintenant le point clé, vous devez utiliser CMake , même votre application C ++ est uniquement pour Windows! Fin de l'histoire. Pas d'autre choix, je sais de quoi je parle. Si vous n'utilisez pas CMake, il est inutile de continuer.

Réponse à la question 1 : Vous n'avez besoin de rien configurer, installez cpputils-cmake ( https://github.com/redguardtoo/cpputils-cmake ) pour configurer d'autres plugins. C'est encore plus pratique que Visual Studio. Donc, la configuration par projet n'est pas nécessaire. Pour remplacer la recherche, je combine la puissance de bash / perl / git et de percol ( https://github.com/mooz/percol ), ce qui est bien meilleur que n’importe quel IDE. consultez mon blog ( http://blog.binchen.org/categories/emacs.html ) et mon ~ / .bashrc ( https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc ). Par exemple, je peux rechercher remplacer les fichiers dans certains commit.

Réponse à la question 2 : C'est déjà configuré par cpputils-cmake, vous avez juste besoin, M-x compilecomme d'habitude.

Réponse à la question 3 : identique à la question 2. Je ne sais pas pourquoi c'est un problème. c'est exactement le même comportement que VS, avec de meilleures raccourcis clavier.

Réponse à la question 4 : Maintenant, la plupart des gens n'utilisent que Gnu Global, qui pourrait être combiné avec cpputils-cmake. Je comprends que le vrai problème est de détecter automatiquement les répertoires contenant tous les en-têtes C ++ inclus . Cela peut être fait avec cpputils-cmake, tout le reste est facile. S'il vous plaît man globalen shell et lisez le manuel sur la variable d'environnement GTAGSLIBPATH. Il existe de nombreux plugins pour fournir une bonne UX basée sur Global pour la navigation de code, je recommande ggtags.el

Réponse à la question 5 : Débogage visuel, beaucoup de gens ont recommandé M-x gdb-many-window, j'ai essayé mais cela n'a pas fonctionné. C'est simplement parce que ma version de gdb est obsolète (Hint, j'utilise OSX 10.7.3) et que je suis trop paresseux pour mettre à niveau mon système d'exploitation. Mais GUD va bien. Je crée une petite touche pour imprimer une variable pour moi dans la fenêtre d'édition. tout le matériel de débogage est utilisable. Il n'a pas de disposition de table UX en tant que VS. mais pour être honnête avec vous. Le débogueur Microsoft de Microsoft n’est pas non plus le meilleur au monde. DDD ( http://www.gnu.org/software/ddd/) est le meilleur débogueur convivial .) Gud et VS craignent tous les deux. Ces jours-ci, je viens d'insérer du code de connexion avec yasnippet, qui est un autre plug-in d'Emacs. Pour clarifier, je connais toutes les astuces avancées sur les points d'arrêt, c'est simplement parce que je suis trop paresseux pour appliquer ces astuces. Insérer du code de journalisation dans Emacs est beaucoup plus facile.

Il y a beaucoup d'autres choses à propos d'IDE: l'achèvement du code? utilisez le mode entreprise, aucun besoin d'installation. vérification de la syntaxe en temps réel? utilisez cpputils-cmake, puis(flymake-mode 1)

La meilleure chose à faire est que vous avez besoin de moins de configuration que de VS si vous utilisez ma configuration à ( https://github.com/redguardtoo/emacs.d ) Cette configuration a pour titre "Configuration emacs de Purcell plus support C / C ++" .

Maintenant, il y a quelque chose que je dois souligner, Emacs vous donne une totale liberté . Vous pouvez choisir n'importe quel moyen de commencer. manière difficile ou facile.

Le moyen le plus simple est simplement de copier ma configuration (ou celle de n’importe qui sur github, de compter les étoiles au début), vous obtiendrez un IDE C ++ entièrement fonctionnel en 5 minutes. VS n'a pas fini de démarrer dans ces 5 minutes.

La difficulté consiste à peaufiner la configuration à partir de rien. Si vous choisissez la voie difficile, ne vous plaignez pas Emacs . C'est ton choix.

BTW, à long terme, un peu de connaissances sur Emacs Lisp pourraient être utiles. Je pense que c'est trivial pour un développeur professionnel en C ++ comparé au temps que j'ai perdu sur MS sh * t. Il y a de nombreuses années, MS a mis à niveau silencieusement son environnement d'exécution VC dans certaines mises à jour Windows. Mon produit a fonctionné correctement sur les machines de la société, mais est tombé en panne sur les ordinateurs des clients .

Après cet incident, j'ai commencé à comprendre Richard Stallman.


1
Intéressant. "vous DEVEZ UTILISER CMake" -> Donc, vous dites que lorsque vous travaillez sur un logiciel gratuit et aléatoire qui utilise autoconf ou un script personnel, vous devez écrire un wrapper CMakeLists.txt?
Stéphane Gourichon

1
Vous pouvez utiliser GNU Global à la place, pas aussi parfait que la solution cmake. Mais plus souple, voir blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin

5

Pour le n ° 4, je recommande fortement exuberant-ctags et le support des balises intégrées, que j'ai utilisé pendant des années. Alternativement, je viens tout récemment de passer à GNU Global et au paquet ggtags et je les ai trouvés légèrement supérieurs; bien qu'ils fonctionnent presque à l'identique. Les deux fonctionnent avec presque aucune configuration. Pour les autres fonctionnalités de l'IDE, j'aime aussi le package de saisie automatique. De même, j'utilise M-x compilebeaucoup et lie les clés globales aux erreurs suivantes et précédentes. Pour chercher dans les "projets", je me sers généralement M-x find-grep. Notez qu'il utilisera les mêmes raccourcis clavier pour l'erreur suivante et précédente.


4

Gestion de "projets" logiciels. Je souhaite que mon IDE ait une idée de tous les fichiers qui composent mon projet actuel afin de pouvoir exécuter des fonctions telles que la recherche et le remplacement dans mon projet. (Ce serait bien si je pouvais également y parvenir sans surcharger mon arbre source avec beaucoup de fichiers de support. Pourquoi ai-je besoin de plus d'un fichier de projet centralisé par projet?)

Le projectile semble être la meilleure option pour la gestion de projet dans emacs. Il est extrêmement léger, vous n’avez pas besoin d’ajouter de fichier supplémentaire à votre projet. Il essaiera de détecter automatiquement les projets pour vous en fonction de la présence de certains fichiers spéciaux. Par exemple, si vous travaillez dans un dépôt git, projectile le traitera comme un projet (tous les fichiers suivis par git seront traités comme faisant partie du projet), vous pourrez alors utiliser les commandes projectile-find-filepermettant d’ouvrir tous les fichiers du projet. Il a un tas d'autres commandes qui fonctionnent par projet.

Rapport d'erreur. Je ne veux pas avoir à lire plus de 500 lignes de sortie pour trouver les erreurs rapportées par les outils de construction. De préférence, les erreurs apparaissent dans leur propre tampon avec une ligne par erreur.

Flycheck prend en charge la vérification de la syntaxe à l'aide de clang / gcc.

Une prise de conscience des symboles dans le projet et où ils sont définis. Je souhaite accéder à une définition de symbole, qu'il se trouve dans les fichiers de mon projet ou dans les fichiers inclus du système

Je vous recommande de jeter un oeil à rtags . Il utilise clang comme back-end et permet de passer rapidement à la définition et à l’achèvement. Cela peut également vous aider avec # 3 puisqu'il intègre également flymake pour afficher les erreurs et les avertissements à l'aide de clang. En outre, il bénéficie d'un soutien limité pour la refactorisation. Une autre option pour l'auto-complétion intelligente est le mode ironie


2

La version CEDET actuellement livrée avec Emacs est difficile à installer, mais celle que vous pouvez obtenir sur le site officiel est plus facile à installer et pourrait répondre à vos besoins n ° 2 et n ° 4.

L'EDE de CEDET vous permet de gérer, par exemple, des projets makefile et automake, d'y ajouter des cibles et d'associer des fichiers à des cibles. Vous pouvez ensuite compiler votre projet en utilisant les commandes EDE. Comme il utilise le mode de compilation intégré d'Emacs, votre besoin # 3 est également satisfait.

La sémantique de CEDET possède des analyseurs syntaxiques pour plusieurs langages, dont le C ++. Il peut récupérer les balises définies dans un fichier, comme exuberant-ctags et GNU Global, mais il possède également des fonctionnalités précises de complétion automatique et de saut. Si vous avez deux méthodes appelées "foo", le saut de Semantic est suffisamment intelligent pour vous amener sur la bonne.

Pour le n ° 1, j'utilise personnellement projectile et j'ai utilisé avec succès GDB pour le n ° 5 il y a quelques temps.

Astuce pour # 3: Si EDE vous surpasse, Emacs a la commande M-x recompilepour lancer votre dernière commande de compilation, afin que vous puissiez exécuter votre compilation une première fois, puis l’utiliser recompiledans n’importe quel tampon.


1

Pour # 4, semble être un nouveau projet appelé YouCompleteme , et le client Emacs correspondant, qui semble être la prochaine bonne chose. Parce qu'il utilise clang, il a une meilleure vue du code que les balises ou global.


1
Merci pour la suggestion, mais comme je recherche des éléments qui s’intègrent bien, je ne suis pas sûr que tenter d’obtenir l’une des fonctionnalités à l’aide d’un plug-in Vim avec un prototype de client Emacs soit le meilleur point de départ.
nispio

3
Essayez github.com/abingham/emacs-ycmd à la place pour le client emacs (notez qu'il utilise github.com/Valloric/ycmd , et non github.com/Valloric/YouCompleteMe ). Cela fonctionne avec le mode société (recommandé par d'autres réponses ici), donc il s'intègre bien au reste d'Emacs. Vous pouvez installer ycmd et company-ycmd depuis MELPA ( sprunge.us/LXGY is my config); et suivez les instructions de construction pour ycmd. Le seul défi est de placer vos drapeaux de compilation dans un fichier comme github.com/Valloric/ycmd/blob/master/examples/…
unhammer

1

J'ai été satisfait de CEDET depuis son dépôt source + BCE + gtags + cscope. Cela dit, je vais essayer de nombreuses suggestions sur ce post.


1
Pourriez-vous expliquer ce que vous avez dû faire pour que tous ces outils fonctionnent ensemble?
nispio

4
À l'heure actuelle, cela ressemble presque à un commentaire égaré. :-) Si vous voulez être gentil, veuillez élaborer un peu.
Malabarba

Désolé d'être laconique. L'application StackExchange prend l'habitude de s'y habituer. Cette solution répond à la question 4, traitant de la navigation par symboles et de l'analyse de la source. CEDET, bien sûr, contient la sémantique. ECB est le navigateur de code Emacs et utilise CEDET pour répertorier les méthodes et rapporter les informations de symbole. Gtags et Cscope construisent tous deux des tableaux d'informations sur les symboles à partir de la base source (helm le fait également) et s'intègrent à Emacs pour permettre la navigation par balises ou symboles.
Argile Haapala

1

Comme mentionné ci-dessus, le projectile (éventuellement avec barre) est une solution brillante pour la gestion de projet.

Ycmd est idéal pour compléter le code et une certaine navigation, et le meilleur client pour cela est emacs-ycmd (divulgation complète: j'ai écrit le client emacs.)

Pour les "tags" et l'indexation, la meilleure solution globale que j'ai trouvée est la recherche de code (plus de détails: j'ai aussi écrit celle-ci.) et cela fonctionne bien dans plusieurs langues.

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.