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:
- 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?)
- 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.
- 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.
- 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.
- 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.
Antworten:
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:
M-x compile
so ziemlich alles aufnehmen und machen das Blättern durch Fehler einfach (einfach verwendennext-error
). Sie können die Einstellungen einfach pro Projekt anpassen, indem Sie Verzeichnisvariablen zum Festlegen verwendencompile-command
. Sie könnencompile
mitprojectile-compile-project
(C-c p c
) mit dem Projektil starten .M-x compile
Außerdem haben Sie hier behandelt - Fehler landen in der Regel in einer Zeile im*compilation*
Puffer, mit der Sie einfach weiterblättern könnennext-error
.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.quelle
projectile
kann direkt mit demperspective
Anlegen einesperspective-per-project
automatisch einschaltenden Projektes eingebunden werden .semantic
zu # 4 hinzufügen , Semantik ist ein großartiges Paket, es versteht Ihren Code und kann mit diesen Informationen viele nützliche Dinge tun.semantic
und ich denke, ich erinnere mich, dass es unvollständige C ++ - Unterstützung gibt, aber ich habe es der Antwort hinzugefügt.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,
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 h
Läufthelm-projectile
mit Helm, um eine Datei im aktuellen Projekt zu finden.Projectile kann Ihre Projekte erstellen.
C-c p c
Läuft,projectile-compile-project
wobei 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.Die Fehler werden beim Ausführen in einem eigenen Puffer angezeigt,
projectile-compile-project
aber ich bin mir nicht sicher, ob sie so hübsch sind, wie Sie möchten.Sie können das Paket verwenden,
helm-gtags
das mit demgtags
Programm 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-dwim
kann zu jeder Verwendung einer Variablen oder Funktion gesprungen werden, und wenn eine Header-Datei ausgeführt wird, wird diese Header-Datei geöffnet.Ich habe das noch nicht ausprobiert.
Das aufgeführte Handbuch enthält sehr ausführliche Konfigurationsinformationen zu den ersten Schritten.
quelle
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 compile
wie 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 global
in 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.elAntwort 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.
quelle
CMakeLists.txt
?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 compile
ausgiebig und binde globale Schlüssel an den nächsten und vorherigen Fehler. Für die Suche in "Projekten" verwende ich in der Regel nurM-x find-grep
. Beachten Sie, dass für den nächsten und den vorherigen Fehler dieselben Tastenkombinationen verwendet werden.quelle
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-file
eine beliebige Datei des Projekts öffnen. Es gibt eine Reihe anderer Befehle, die pro Projekt ausgeführt werden.Flycheck unterstützt die Syntaxprüfung mit clang / gcc.
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
quelle
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 dannrecompile
in einem beliebigen Puffer verwenden können.quelle
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.
quelle
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.
quelle
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.
quelle