Verwendung von Emacs als vollwertige C / C ++ - IDE


50

Ich habe seit über einem Jahr versucht, Emacs als C / C ++ - IDE zu verwenden. Ich war bisher nur am Rande erfolgreich, bin aber unterwegs auf ein paar Ziegelmauern gestoßen. Momentan versuche ich, CEDET zu verwenden, aber ich habe Schwierigkeiten zu verstehen, wie man es effektiv einsetzt.

Die Funktionen, die ich in einer IDE suche, sind wie folgt:

  1. Management von Software "Projekten". Ich möchte, dass meine IDE alle Dateien erfasst, aus denen sich mein aktuelles Projekt zusammensetzt, damit ich Funktionen wie Suchen und Ersetzen in meinem Projekt ausführen kann. (Es wäre schön, wenn ich dies auch erreichen könnte, ohne meinen Quellbaum mit vielen Unterstützungsdateien zu verunreinigen. Warum benötige ich mehr als eine zentrale Projektdatei pro Projekt?)
  2. Die Möglichkeit, das aktuelle Projekt in der IDE zu erstellen, unabhängig davon, welchen Puffer ich gerade besuche. Ich muss in der Lage sein, einen Schlüssel zu binden, der das aktuelle Projekt erstellt.
  3. Fehler melden. Ich möchte nicht mehr als 500 Ausgabezeilen lesen müssen, um die Fehler zu finden, die von den Build-Tools gemeldet wurden. Vorzugsweise erscheinen die Fehler in einem eigenen Puffer mit einer Zeile pro Fehler.
  4. Ein Bewusstsein für Symbole innerhalb des Projekts und wo sie definiert sind. Ich möchte zu einer Symboldefinition springen, unabhängig davon, ob sie sich in meinen Projektdateien oder in den System-Include-Dateien befindet.
  5. Visuelles Debuggen. Ich möchte eine Beobachtungsliste der lokalen Variablen haben, die automatisch aktualisiert werden, wenn ich durch den Code gehe. Ich möchte in der Lage sein, Haltepunkte im Code zu setzen, um zu sehen, welche Codezeile als nächstes ausgeführt wird.

Ich weiß, dass jede dieser Funktionen vorhanden ist, weil ich jede Funktion gleichzeitig mit EDE, Semantic, GDB usw. ausgeführt habe. Das Problem ist, dass ich nie alle Funktionen gleichzeitig ausführen konnte , weil jedes Teil normalerweise für sich konfiguriert werden muss und es in der Regel zu viel Arbeit ist, um herauszufinden, wie alle auf einmal konfiguriert und zusammenarbeiten können.

Welche Lösungen gibt es, um Emacs in eine voll funktionsfähige C / C ++ - IDE zu verwandeln? Müssen Sie immer alles Stück für Stück konfigurieren, oder gibt es eine Möglichkeit, alle Funktionen gleichzeitig einzurichten?

EDIT: Eine gute Antwort auf diese Frage muss nicht alle fünf vorgegebenen Kriterien genau erfüllen. Ich habe lediglich die Liste angegeben, um eine genauere Vorstellung von der Art der Funktionen zu erhalten, die ich sehen möchte, bevor ich eine IDE als "voll funktionsfähig" betrachten würde. Es ist durchaus möglich, dass CEDET in die Rechnung passt, aber ich muss noch ein ausführliches Tutorial finden, um es von Grund auf neu einzurichten.


6
Diese Frage könnte besser in mehrere geteilt werden. Es kann vorkommen, dass Sie eine Reihe von Teilantworten haben, bei denen keinem der Punkte die gebührende Aufmerksamkeit geschenkt wird.
Malabarba

2
Außerdem könnte Punkt 1 ein Duplikat von emacs.stackexchange.com/questions/448/…
Malabarba,

6
@ Malabarba: Wenn ich fünf verschiedene Fragen stellen würde, könnte es sich um ein Duplikat handeln. Der springende Punkt bei dieser Frage ist, dass es möglicherweise fünf verschiedene Pakete gibt, mit denen die fünf verschiedenen Ziele erreicht werden. Es scheint jedoch nahezu unmöglich, alle fünf so zu konfigurieren, dass sie gut miteinander spielen. Wenn die Antwort zurückkommt: "Emacs kann nicht als voll funktionsfähige IDE eingesetzt werden, da die Konfiguration unmögliche Zeit in Anspruch nimmt." Dann ist es halt so.
Nispio

4
Jeder der Punkte kann eine eigene Frage sein (möglicherweise dupliziert). Die Zusammenfassung aller Punkte in einer Frage kann aufgrund der Paketinteraktion manchmal zu unterschiedlichen Antworten führen.
Jonathan Leech-Pepin

Antworten:


27

Es gibt unterschiedliche "IDE-Ness" -Niveaus für verschiedene Sprachen, und leider werden Sie ohne Konfiguration nie alle IDE-Funktionen erhalten (wenn Sie keine Lust haben, Dinge zu konfigurieren, sollten Sie wahrscheinlich keinen Emacs verwenden). CEDET soll eine Komplettlösung sein, die alle Ihre Anforderungen an unterstützte Sprachen abdeckt, aber ich persönlich habe es nie richtig zum Laufen gebracht. Stattdessen benutze ich ein paar Pakete hintereinander, um meine IDE-Grundlagen abzudecken. Ich werde Ihre Punkte der Reihe nach durchgehen und einige Lösungen für verschiedene Sprachen vorstellen, die ich kenne:

  1. projectile ist das Paket, das der Bereitstellung einer echten IDE-ähnlichen Erfahrung am nächsten kommt. Es bietet jede Menge nützliche Funktionen für jedes Projekt. Wahrscheinlich möchten Sie auch eine Art Fenster- / Arbeitsbereichsverwaltung. Ich verwende meine eigene Lösung namens wacspace , aber andere gute Lösungen umfassen Perspektive , Arbeitsgruppen und Bildschirm .
  2. Verschiedene Sprachen haben unterschiedliche Vorstellungen davon, was ein "Build" ist, können aber M-x compileso ziemlich alles aufnehmen und machen das Blättern durch Fehler einfach (einfach verwenden next-error). Sie können die Einstellungen einfach pro Projekt anpassen, indem Sie Verzeichnisvariablen zum Festlegen verwenden compile-command. Sie können compilemit projectile-compile-project( C-c p c) mit dem Projektil starten .
  3. M-x compileAußerdem haben Sie hier behandelt - Fehler landen in der Regel in einer Zeile im *compilation*Puffer, mit der Sie einfach weiterblättern können next-error.
  4. Wenn Sie zu einem Symbol springen, müssen Sie "Ihren Code verstehen". Die Unterstützung ist in den verschiedenen Sprachen sehr unterschiedlich. Für Elisp können Sie das ausgezeichnete elisp-slime-nav verwenden und dann M-.zur Definition springen. Hier sind einige Pakete, die ähnliche Unterstützung für andere Sprachen bieten: CIDER (für Clojure); SLIME (für Common Lisp); Robe (für Ruby); Semantik- oder Clang-Tags für C / C ++ (Haftungsausschluss: Ich habe auch nie verwendet, daher habe ich keine Ahnung, ob sie gut funktionieren). Wenn alles andere fehlschlägt, können Sie auch die integrierten TAGS-Funktionen von Emacs verwenden, die so etwas wie üppige Tags verwenden , aber ich habe mit TAGS noch nie annähernd akzeptable Ergebnisse erzielt.
  5. Emacs unterstützt Debugger sehr unterschiedlich. GDB mit GUD ist die beste Wahl für C-ähnliche Sprachen. Ansonsten ist es so ziemlich ausschließlich pro Sprache. (Ich halte das sprachübergreifende visuelle Debuggen nicht für ein realistisches Ziel.)

4
Als Side-Node projectilekann direkt mit dem perspectiveAnlegen eines perspective-per-projectautomatisch einschaltenden Projektes eingebunden werden .
Jonathan Leech-Pepin

Ich würde Anmerkungen semanticzu # 4 hinzufügen , Semantik ist ein großartiges Paket, es versteht Ihren Code und kann mit diesen Informationen viele nützliche Dinge tun.
Jordon Biondo

Ich habe es nie wirklich benutzt semanticund ich denke, ich erinnere mich, dass es unvollständige C ++ - Unterstützung gibt, aber ich habe es der Antwort hinzugefügt.
Shosti

15

Ich habe dieses Handbuch verwendet , um Emacs als C ++ - IDE zu verwenden. Es werden Helm und Projektil vorgestellt, mit denen Sie eine Reihe Ihrer Fragen beantworten können. Nämlich,

  1. Projectile verwaltet Projekte. Es durchsucht die Verzeichnisstruktur nach einem Makefile, SConstruct, Git Repo, SVN Repo und möglicherweise anderen Buildsystem- oder Versionskontrolldateien, um automatisch zu erfahren, welche Dateien mit dem aktuellen Projekt verknüpft sind. Beispiel: C-c p hLäuft helm-projectilemit Helm, um eine Datei im aktuellen Projekt zu finden.

  2. Projectile kann Ihre Projekte erstellen. C-c p cLäuft, projectile-compile-projectwobei versucht wird, Make / SCons / CMake basierend auf den verfügbaren Dateien auszuführen. Ich musste das nie konfigurieren; es hat immer gewusst, was zu tun ist.

  3. Die Fehler werden beim Ausführen in einem eigenen Puffer angezeigt, projectile-compile-projectaber ich bin mir nicht sicher, ob sie so hübsch sind, wie Sie möchten.

  4. Sie können das Paket verwenden, helm-gtagsdas mit dem gtagsProgramm verbunden ist (das auf Ihrem System verfügbar sein sollte). Beachten Sie, dass gtags ein GNU-Projekt ist und daher unter Windows wahrscheinlich nicht sofort funktioniert.

    Einmal konfiguriert, erkennt Helm Symbole im Projekt und kann zu Definitionen und Verwendungsorten navigieren. Beispielsweise helm-gtags-dwimkann zu jeder Verwendung einer Variablen oder Funktion gesprungen werden, und wenn eine Header-Datei ausgeführt wird, wird diese Header-Datei geöffnet.

  5. Ich habe das noch nicht ausprobiert.

Das aufgeführte Handbuch enthält sehr ausführliche Konfigurationsinformationen zu den ersten Schritten.


Ich bin auch auf diesen Leitfaden gestoßen und habe ihn angewendet. IMHO ist es irgendwie schwergewichtig und verändert eine Menge grundlegender Emacs-Interaktionen zu sehr. Ich habe eine Reihe von Steuerstand-bezogenen Konfigurationen deaktiviert, weil sie gewöhnliche Verknüpfungen beeinträchtigten (z. B. das einfache Öffnen des aktuellen Verzeichnisses in einem Puffer oder das Öffnen einer Datei in einem Unter-Unterverzeichnis mit wenigen Tastenanschlägen). Einen Blick wert, sollte aber wohl Schritt für Schritt probiert werden, nicht als Ganzes.
Stéphane Gourichon

9

Da Sie jetzt nach einer voll ausgestatteten C / C ++ - IDE fragen, bin ich möglicherweise qualifiziert.

Ich habe alle MS IDEs von vc4 bis Visual Studio 2010 verwendet, sodass ich genau verstehe, was Sie wollen.

Die gute Nachricht ist, dass Emacs 95% so gut sein könnte wie Visual Studio und viel mehr kann. Aber Sie interessieren sich vielleicht nicht für den "mehr" Teil. Ich werde mich also nur auf Ihre Fragen konzentrieren.

Nun ist der entscheidende Punkt, Sie MÜSSEN CMake VERWENDEN , auch Ihre C ++ - Anwendung ist nur für Windows! Ende der Geschichte. Keine andere Wahl, ich weiß wovon ich spreche. Wenn Sie CMake nicht verwenden, ist es sinnlos, fortzufahren.

Antwort auf Frage 1 : Sie brauchen nichts einzurichten, installieren Sie cpputils-cmake ( https://github.com/redguardtoo/cpputils-cmake ), das andere Plugins einrichtet . Es ist noch praktischer als Visual Studio. Pro Projekt wird also kein Setup benötigt. Für das Suchen und Ersetzen kombiniere ich die Leistung von bash / perl / git und percol ( https://github.com/mooz/percol ), was viel besser ist als jede IDE. Überprüfen Sie mein Blog ( http://blog.binchen.org/categories/emacs.html ) und mein ~ / .bashrc ( https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc ). Zum Beispiel kann ich die Dateien in bestimmten Commits durch Suchen ersetzen.

Antwort auf Frage 2 : Es wird bereits von cpputils-cmake eingerichtet, Sie brauchen nur M-x compilewie gewohnt.

Antwort auf Frage 3 : Wie Frage 2. Ich weiß nicht, warum dies ein Problem ist. Es ist genau das gleiche Verhalten wie bei VS, mit besseren Tastenkombinationen.

Antwort auf Frage 4 : Jetzt verwenden die meisten Leute nur noch Gnu Global, das mit cpputils-cmake kombiniert werden kann. Ich verstehe, das eigentliche Problem besteht darin , die Verzeichnisse mit allen enthaltenen C ++ - Headern automatisch zu erkennen . Das geht mit cpputils-cmake, alles andere ist einfach. Bitte man globalin der Shell und im Handbuch über die Umgebungsvariable GTAGSLIBPATH lesen. Es gibt viele Plugins, die auf Global basierendes UX für die Code-Navigation bereitstellen. Ich empfehle ggtags.el

Antwort auf Frage 5 : Visual Debugging, viele Leute haben es empfohlen M-x gdb-many-window, ich habe es versucht, aber es hat nicht funktioniert. Es liegt einfach daran, dass meine GDB-Version veraltet ist (Hinweis, ich verwende OSX 10.7.3) und ich zu faul bin, um mein Betriebssystem zu aktualisieren. Aber GUD ist in Ordnung. Ich erstelle eine kurze Taste, um die Variable für mich im Editorfenster zu drucken. Das gesamte Debug-Material ist verwendbar. Es hat kein Tabellen-UX-Layout wie VS. aber um ehrlich zu sein. Microsofts Debugger UX ist auch nicht der beste der Welt. Der benutzerfreundlichste Debugger ist DDD ( http://www.gnu.org/software/ddd/).). Gud und VS saugen beide an diesem Thema. Heutzutage füge ich nur den Logcode mit yasnippet ein, einem weiteren Emacs-Plugin. Zur Verdeutlichung kenne ich alle fortgeschrittenen Tricks zu Haltepunkten, nur weil ich zu faul bin, diese Tricks anzuwenden. Das Einfügen von Protokollcode in Emacs ist viel einfacher.

Es gibt noch viel mehr Dinge über IDE: Code-Vervollständigung? Verwenden Sie den Firmenmodus, kein Setup erforderlich. Echtzeit-Syntaxprüfung? Verwenden Sie dann cpputils-cmake(flymake-mode 1)

Das Beste ist, Sie müssen weniger Setup als VS ausführen, wenn Sie mein Setup unter ( https://github.com/redguardtoo/emacs.d ) verwenden. Dieses Setup trägt den Titel "purcells emacs configuration plus C / C ++ support" .

Jetzt gibt es etwas, das ich hervorheben muss. Emacs gibt dir die volle Freiheit . Sie können einen beliebigen Startweg wählen. harter Weg oder einfacher Weg.

Der einfache Weg ist, einfach mein Setup zu kopieren (oder jedes Setup auf Github, zähle zuerst die Sterne). In 5 Minuten hast du eine voll funktionsfähige C ++ IDE. VS hat den Start in diesen 5 Minuten noch nicht abgeschlossen.

Der harte Weg ist, das Setup von Grund auf zu optimieren. Wenn Sie sich für den harten Weg entscheiden, beschweren Sie sich nicht über Emacs . Es ist deine Wahl.

Übrigens, auf lange Sicht könnte ein bisschen Emacs Lisp-Wissen hilfreich sein. Ich denke, es ist trivial für einen professionellen C ++ - Entwickler im Vergleich zu der Zeit, die ich mit MS sh * t verschwendet habe. Vor vielen Jahren hat MS in einigen Windows-Updates die VC-Laufzeit unbemerkt aktualisiert. Dadurch lief mein Produkt auf den Maschinen des Unternehmens einwandfrei, stürzte jedoch auf den Computern der Kunden ab .

Nach diesem Vorfall begann ich Richard Stallman zu verstehen.


1
Interessant. "Sie MÜSSEN CMake VERWENDEN" -> Wenn Sie also an einem zufälligen freien Softwarepaket arbeiten, das Autoconf oder ein persönliches Skript verwendet, sollten Sie einen Wrapper schreiben CMakeLists.txt?
Stéphane Gourichon

1
Sie können stattdessen GNU Global verwenden, nicht so perfekt wie cmake solution. Aber flexibler, siehe blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin

5

Für # 4 empfehle ich auf jeden Fall exuberant-ctags und die integrierte Tags-Unterstützung, die ich seit Jahren verwende. Alternativ habe ich kürzlich auf GNU Global und das Paket ggtags umgestellt und festgestellt, dass sie etwas überlegen sind. obwohl sie fast identisch funktionieren. Beide arbeiten fast ohne Konfiguration. Für andere IDE-Funktionen mag ich auch das Auto-Vervollständigungspaket. Ebenso verwende ich M-x compileausgiebig und binde globale Schlüssel an den nächsten und vorherigen Fehler. Für die Suche in "Projekten" verwende ich in der Regel nur M-x find-grep. Beachten Sie, dass für den nächsten und den vorherigen Fehler dieselben Tastenkombinationen verwendet werden.


4

Management von Software "Projekten". Ich möchte, dass meine IDE alle Dateien erfasst, aus denen sich mein aktuelles Projekt zusammensetzt, damit ich Funktionen wie Suchen und Ersetzen in meinem Projekt ausführen kann. (Es wäre schön, wenn ich dies auch erreichen könnte, ohne meinen Quellbaum mit vielen Unterstützungsdateien zu verunreinigen. Warum brauche ich mehr als eine zentrale Projektdatei pro Projekt?)

Projectile scheint die beste Option für das Projektmanagement in Emacs zu sein. Es ist extrem leicht, Sie müssen Ihrem Projekt keine zusätzliche Datei hinzufügen. Es wird versucht, Projekte basierend auf dem Vorhandensein bestimmter spezieller Dateien automatisch für Sie zu erkennen. Beispiel: Wenn Sie in einem Git-Repository arbeiten, wird es von Projectile als Projekt behandelt (alle von Git verfolgten Dateien werden als Teil des Projekts behandelt). Anschließend können Sie mit Befehlen projectile-find-fileeine beliebige Datei des Projekts öffnen. Es gibt eine Reihe anderer Befehle, die pro Projekt ausgeführt werden.

Fehler melden. Ich möchte nicht mehr als 500 Ausgabezeilen lesen müssen, um die Fehler zu finden, die von den Build-Tools gemeldet wurden. Vorzugsweise erscheinen die Fehler in einem eigenen Puffer mit einer Zeile pro Fehler.

Flycheck unterstützt die Syntaxprüfung mit clang / gcc.

Ein Bewusstsein für Symbole innerhalb des Projekts und wo sie definiert sind. Ich möchte zu einer Symboldefinition springen, unabhängig davon, ob sie sich in meinen Projektdateien oder in den System-Include-Dateien befindet

Ich würde dir empfehlen, dir rtags anzuschauen . Es verwendet Clang als Backend und eine ziemlich gute Aufgabe, um zur Definition und Vervollständigung zu springen. Es kann Ihnen auch bei # 3 helfen, da es auch in flymake integriert ist, um Fehler und Warnungen mit clang anzuzeigen. Außerdem wird das Refactoring nur eingeschränkt unterstützt. Eine weitere Option für die intelligente automatische Vervollständigung ist der Ironiemodus


2

Die derzeit mit Emacs gelieferte CEDET-Version ist schwierig einzurichten, aber die auf der offiziellen Website erhältliche ist einfacher einzurichten und könnte Ihren Anforderungen Nr. 2 und Nr. 4 entsprechen.

Mit CEDET EDE können Sie beispielsweise Makefile- und Automake-Projekte verwalten, Ziele hinzufügen und Dateien mit Zielen verknüpfen. Anschließend können Sie Ihr Projekt mit EDE-Befehlen übersetzen. Da der Emacs den integrierten Kompilierungsmodus verwendet, wird auch Ihr dritter Bedarf erfüllt.

Semantic von CEDET enthält Parser für mehrere Sprachen, einschließlich C ++. Es kann die in einer Datei definierten Tags wie exuberant-ctags und GNU Global abrufen, verfügt jedoch auch über genaue Auto-Vervollständigungs- und Sprungfunktionen. Wenn Sie zwei Methoden haben, die "foo" genannt werden, ist der Sprung von Semantic klug genug, um Sie auf die richtige zu bringen.

Für # 1 benutze ich persönlich Projectile und ich habe GDB vor einiger Zeit erfolgreich für # 5 verwendet.

Tipp für # 3: Wenn Ihnen EDE zu viel bedeutet, hat Emacs den Befehl M-x recompile, Ihren letzten Kompilierungsbefehl zu starten, damit Sie Ihre Kompilierung zum ersten Mal ausführen und dann recompilein einem beliebigen Puffer verwenden können.


1

Für # 4 scheint ein neues Projekt namens YouCompleteme und der entsprechende Emacs-Client das nächste coole Ding zu sein. Da clang verwendet wird, hat es eine bessere Sicht auf den Code als tags oder global.


1
Vielen Dank für den Vorschlag, aber da ich nach Dingen suche, die gut zusammenpassen, bin ich mir nicht sicher, ob der Versuch, eine der Funktionen mithilfe eines Vim-Plugins mit einem Emacs-Client-Prototyp zu erhalten, der beste Ausgangspunkt ist.
Nispio

3
Versuchen Sie stattdessen github.com/abingham/emacs-ycmd für den Emacs-Client (beachten Sie, dass github.com/Valloric/ycmd und nicht github.com/Valloric/YouCompleteMe verwendet wird ). Es funktioniert im Firmenmodus (empfohlen durch andere Antworten hier), so dass es sich gut in den Rest von Emacs integrieren lässt. Sie können ycmd und company-ycmd von MELPA aus installieren ( sprunge.us/LXGY ist meine Konfiguration). und folge den Bauanweisungen für ycmd. Die einzige Herausforderung ist , dass Sie Ihre Kompilierung Fahnen in eine Datei wie setzen müssen github.com/Valloric/ycmd/blob/master/examples/...
unhammer

1

Ich bin mit CEDET von seinem Quellrepo + ECB + gtags + cscope glücklich gewesen. Das heißt, es gibt viele Vorschläge zu diesem Beitrag, die ich versuchen werde.


1
Können Sie erläutern, was Sie tun müssen, damit all diese Tools zusammenarbeiten?
Nispio

4
Im Moment sieht das fast wie ein verlegter Kommentar aus. :-) Wenn Sie nett wären, bitte etwas näher erläutern.
Malabarba

Tut mir leid, dass ich so knapp bin. Die StackExchange App ist gewöhnungsbedürftig. Diese Lösung beantwortet # 4 und befasst sich mit der Symbolnavigation und der Analyse der Quelle. CEDET enthält natürlich Semantik. Die EZB ist der Emacs-Code-Browser und verwendet CEDET, um Methoden aufzulisten und Symbolinformationen zu melden. Gtags und Cscope erstellen beide Tabellen mit Symbolinformationen aus der Quelldatenbank (das macht auch helm) und integrieren sie in Emacs, um die Navigation nach Tags oder Symbolen zu ermöglichen.
Clay Haapala

1

Wie bereits erwähnt, ist Projectile (optional mit Helm) eine hervorragende Lösung für das Projektmanagement.

Ycmd eignet sich hervorragend zur Code-Vervollständigung und zur Navigation, und der beste Client dafür ist emacs-ycmd (vollständige Offenlegung: Ich habe den Emacs-Client geschrieben.)

Für "Tags" und Indizierung ist die beste Gesamtlösung, die ich gefunden habe, die Codesuche (mehr Offenlegung: Ich habe diese auch geschrieben) und es funktioniert gut in mehreren Sprachen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.