it-swarm-eu.dev

Verwendung von Emacs als IDE

Derzeit umfasst mein Workflow mit Emacs, wenn ich in C oder C++ programmiere, drei Fenster. Die größte auf der rechten Seite enthält die Datei, mit der ich arbeite. Die linke Seite ist zweigeteilt, die untere ist eine Shell, die ich zum Kompilieren oder Erstellen von Befehlen verwende, und die obere ist oft eine Art Dokumentation oder README -Datei, die ich während der Arbeit abfragen möchte. Jetzt weiß ich, dass es einige sehr gute Emacs-Benutzer gibt, und ich bin gespannt, was andere Emacs funktionell nützlich sind, wenn sie als komplette IDE verwendet werden soll. Die meisten IDEs erfüllen normalerweise diese Funktionen in irgendeiner Form:

  • Quellcode-Editor
  • Compiler
  • Debugging
  • Nachschlagen der Dokumentation
  • Versionskontrolle
  • OO-Funktionen wie Klassensuche und Objektinspektor 

Für einige von ihnen ist es ziemlich offensichtlich, wie Emacs diese Funktionen anpassen kann, aber wie sieht es mit dem Rest aus? Wenn auf eine bestimmte Sprache fokussiert werden muss, würde ich sagen, es sollte C++ sein. 

Edit: Ein Benutzer hat darauf hingewiesen, dass ich genauer hätte sein sollen, als ich sagte 'was ist mit dem Rest?'. Ich war vor allem neugierig auf eine effiziente Versionskontrolle sowie die Suche nach Dokumentationen. In SLIME ist es beispielsweise recht einfach, eine schnelle Hyperspec-Suche nach einer LISP-Funktion durchzuführen. Gibt es eine schnelle Möglichkeit, etwas in der C++ - STL-Dokumentation nachzuschlagen (wenn ich beispielsweise die genaue Syntax von hash_map vergessen habe)?

163
user7545

Sie müssen genau festlegen, was Sie unter "den Rest" verstehen. Abgesehen von dem Objektinspektor (den ich kenne) erledigt emacs all das ganz leicht:

  • editor (offensichtlich)
  • compiler - führen Sie einfach M-x compile aus und geben Sie Ihren Kompilierungsbefehl ein. Von da an können Sie einfach M-x compile und den Standard verwenden. Emacs erfasst C/C++ - Compiler-Fehler (funktioniert am besten mit GCC) und hilft Ihnen beim Navigieren zu Zeilen mit Warnungen oder Fehlern.
  • Debugging - Wenn Sie ein Debugging durchführen möchten, geben Sie M-x gdb ein. Dadurch wird ein gdb-Puffer mit speziellen Bindungen erstellt
  • Nachschlag für die Dokumentation - emacs verfügt über hervorragende CScope-Bindungen für die Code-Navigation. Für andere Dokumentation: Emacs hat auch einen Manpage-Reader, und für alles andere gibt es das Web und Bücher.
  • versionskontrolle - Es gibt viele Emacs-Bindungen für verschiedene VCS-Backends (CVS, SCCS, RCS, SVN, GIT).

Edit: Ich erkenne, dass meine Antwort zur Dokumentationssuche wirklich auf die Code-Navigation bezogen ist. Hier noch ein paar mehr zu den Punkten: 

Die Google-Suche wird zweifellos weitere Beispiele aufzeigen.

Wie der zweite Link zeigt, können Funktionen (und was auch immer) in anderen Dokumentationen nachgeschlagen werden, auch wenn sie nicht standardmäßig unterstützt werden.

73
Ben Collins

Ich muss Emacs Code Browser als eher "traditionelle" IDE - Umgebung für Emacs empfehlen.

EDIT: Ich empfehle jetzt auch Magit hoch über die Standard-VCS-Schnittstelle in emacs.

29
baudtack

Haben Sie statt eines Befehls "make" im Shell-Fenster versucht, M-x zu kompilieren? Es führt den Befehl make aus, zeigt Fehler an und macht es in vielen Fällen sehr einfach, zu der Codezeile zu springen, die den Fehler verursacht hat, wenn die Ausgabe Dateinamen und Zeilennummern enthält.

Wenn Sie ein Fan von IDEs sind, sollten Sie sich auch das Speedbar-Paket (M-x Speedbar) von emacs ansehen. Wenn Sie dies noch nicht getan haben, erfahren Sie, wie Sie mit Hilfe von Tags Tabellen durch Ihren Code navigieren.

19
Bryan Oakley

Es gibt Ecken von Emacs, die Sie auf eine Weise produktiver machen, an die Sie nie gedacht haben. Wie andere bereits erwähnt haben, ist die Verwendung von Tags eine fantastische und schnelle Methode, um den Quellcode zu zoomen, und die Verwendung von M-/(dabbrev-expand) bewirkt häufig genau das, was Sie beim Vervollständigen eines Variablennamens erwarten.

Die Verwendung von happen ist nützlich, um einen Puffer mit allen Vorkommen eines regulären Ausdrucks in einem Puffer abzurufen. Dies ist sehr praktisch, wenn Sie Code umgestalten und nach Codefragmenten oder Variablen suchen oder wenn Sie TODO-Marker in Ihren Quelldateien verwenden und sie alle besuchen möchten.

flush-Lines, Sort-Numeric-Fields, Replace-Regexp und Rectangle-Funktionen können sehr nützlich sein, um einen Dump von einem Tool in nützliche Daten wie ein Elisp-Programm oder eine durch Kommas getrennte Tabelle zu konvertieren.

Ich habe eine Seite über IDE geschrieben, wie man es mit Emacs machen kann

http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html

Das Lernen von elisp ist eine weitere großartige Möglichkeit, um selbst zu beantworten, was Emacs sonst noch tun kann, als es ein typisches IDE kann.

Zum Beispiel habe ich über das Schreiben von Perforce-Hilfefunktionen wie "Schuld" gebloggt.

http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html

Ich habe auch Code geschrieben, der dynamisch Kommentare für eine Funktion erstellt, die den Codierungsstandards entspricht, mit denen ich arbeite.

Keiner meiner elisp-Codes ist besonders gut und das meiste davon existiert bereits in Bibliotheken, aber es ist wirklich nützlich, Emacs dazu zu bringen, benutzerdefinierte Dinge zu tun, die nur an einem Arbeitstag auftauchen.

15
justinhj

Eine ausführliche Beschreibung der Integration von Emacs und Versionskontrolle finden Sie auf my site . Ich arbeite auch an einem Artikel über die Verwendung von Emacs als Entwicklungsumgebung für viele Sprachen - C/C++, Java, Perl, LISP/Scheme, Erlang usw.

10
Alex Ott

Okay, jeder hier gibt perfekte Tipps, um Emacs zu einer großartigen IDE zu machen. 

Jeder sollte jedoch bedenken, dass wenn Sie Ihre Emacs mit vielen Erweiterungen anpassen (insbesondere mit denen für die Typprüfung im laufenden Betrieb, Funktionsdefinitionsabfragen usw.), werden Ihre Emacs für einen Editor sehr, sehr langsam geladen. 

Um dieses Problem zu umgehen, würde ich dringend empfehlen, Emacs in server mode zu verwenden. 

Es ist ziemlich einfach zu bedienen, Sie müssen Ihre Init-Datei nicht anpassen. Sie müssen emacs nur im Daemon-Modus starten.

emacs --daemon

Dadurch wird ein Emacs-Server erstellt, den Sie dann entweder vom Terminal oder von GUI verbinden können. Ich würde auch empfehlen, einige Aliase zu erstellen, um das Aufrufen zu erleichtern. 

alias ec="emacsclient -t"
alias ecc="emacsclient -c &"
# some people also prefer this but no need to fight here;
alias vi="emacsclient -t"

Auf diese Weise wird Emacs noch schneller als gedit hochgehen, versprochen.

Das hier mögliche Problem: Wenn Sie den emacs-Dämon von Ihrem gelegentlichen Benutzer ausführen, können Sie den emacs-Server wahrscheinlich nicht als root verbinden. 

Wenn Sie also eine Datei öffnen müssen, die über Root-Zugriff verfügt; Verwenden Sie stattdessen tramp. Führen Sie einfach Ihren emacs-Client mit Ihrem normalen Benutzer aus und öffnen Sie Dateien wie folgt.

C-x C-f
/Sudo:[email protected]/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:[email protected]` 

Dies machte mein Leben einfacher, ich kann meinen schweren Python IDE auf diese Weise in Millisekunden öffnen. Sie können auch emacs --daemon zum Systemstart hinzufügen oder eine Desktop-Datei für emacsclient erstellen. Das liegt an dir. 

Weitere Informationen zu emacs daemon und emacs client finden Sie im Wiki.

http://www.emacswiki.org/emacs/EmacsAsDaemon

http://www.emacswiki.org/emacs/EmacsClient

8
Muhammet Can

Für die Versionskontrolle können Sie abhängig vom verwendeten Versionskontrollsystem verschiedene Dinge verwenden. Ein Teil der Funktionalität ist jedoch allen gemeinsam.

vc.el ist die integrierte Möglichkeit, die Versionskontrolle auf Dateiebene durchzuführen. Es hat Backends für die meisten Versionskontrollsysteme. Zum Beispiel wird das Subversion-Backend mit Emacs geliefert, und es gibt Git-Backends und andere, die aus anderen Quellen verfügbar sind.

Der nützlichste Befehl ist C-x v v (vc-next-action) führt die entsprechende nächste Aktion für die von Ihnen besuchte Datei aus. Dies kann bedeuten, dass Sie aus dem Repository aktualisieren oder Ihre Änderungen bestätigen, vc.el bindet auch neu C-x C-q Ein- und Auschecken von Dateien, wenn Sie ein System verwenden, das dies benötigt (wie RCS).

Andere sehr nützliche Befehle sind C-x v l und C-x v = das zeigt Ihnen das Protokoll und den aktuellen Diff der Datei, die Sie verwenden.

Für eine echte Produktivität sollten Sie jedoch die Verwendung der einzelnen vc.el-Befehle nur für einfache Dinge vermeiden. Es gibt mehrere Pakete, die Ihnen einen Überblick über den Status Ihres gesamten Baums geben und Ihnen mehr Leistung verleihen. Außerdem können Sie nicht die Möglichkeit zum Erstellen kohärenter Commits für mehrere Dateien angeben.

Die meisten davon sind stark beeinflusst oder basieren auf dem Original pcl-cvs/pcvs für CVS. Es gibt sogar zwei von ihnen, die mit Subversion kommen, psvn.el und dsvn.el. Es gibt Pakete für Git usw.

8
dkagedal

Ich bin damit einverstanden, dass Sie etwas über M-x compile lernen sollten (binden Sie das und M-x next-error an eine kurze Tastenfolge).

Erfahren Sie mehr über die Bindungen für die Versionskontrolle (z. B. vc-diff, vc-next-action usw.).

Schau in die Register. Sie können sich nicht nur Positionen in Puffern merken, sondern auch ganze Fensterkonfigurationen (C-x r w - Fensterkonfiguration-zu-Register).

7
HD.

Ein Ausgangspunkt (der möglicherweise nicht offensichtlich ist) zum Erkunden der VC - Funktionen von Emacs ist M-x vc-next-action

Abhängig vom Status der Datei und dem Backend von VC führt sie die "nächste logische Versionskontrolloperation" für die aktuelle Datei aus. Wenn die Datei also nicht der Versionskontrolle unterliegt, wird sie registriert, wenn die Datei geändert wurde, werden die Änderungen übermittelt usw. 

Es ist etwas gewöhnungsbedürftig, aber ich finde es sehr nützlich. 

Die Standard-Tastenkombination ist C-x v v

6
Chopmo

Es gibt ein TFS.el für die Integration von Emacs in Microsoft TFS . Es funktioniert mit jedem TFS, einschließlich dem TFS, auf dem Codeplex.com ausgeführt wird. 

Grundlegende Schritte zum Einrichten:

  1. Platzieren Sie tfs.el in Ihrem Ladepfad.

  2. In Ihrer .emacs-Datei: 

    (require 'tfs)
    (setq tfs/tf-exe  "c:\\vs2008\\common7\\ide\\tf.exe")
    (setq tfs/login "/login:domain\\userid,password")
          -or-
    (setq tfs/login (getenv "TFSLOGIN"))  ;; if you have this set
    
  3. legen Sie auch in Ihrer .emacs-Datei lokale oder globale Schlüsselbindungen für tfs-Befehle fest. wie so:

    (global-set-key  "\C-xvo" 'tfs/checkout)
    (global-set-key  "\C-xvi" 'tfs/checkin)
    (global-set-key  "\C-xvp" 'tfs/properties)
    (global-set-key  "\C-xvr" 'tfs/rename)
    (global-set-key  "\C-xvg" 'tfs/get)
    (global-set-key  "\C-xvh" 'tfs/history)
    (global-set-key  "\C-xvu" 'tfs/undo)
    (global-set-key  "\C-xvd" 'tfs/diff)
    (global-set-key  "\C-xv-" 'tfs/delete)
    (global-set-key  "\C-xv+" 'tfs/add)
    (global-set-key  "\C-xvs" 'tfs/status)
    (global-set-key  "\C-xva" 'tfs/annotate)
    (global-set-key  "\C-xvw" 'tfs/workitem)
    
4
Cheeso

compile, next-error und previous-error sind wichtige Befehle für die C++ - Entwicklung in Emacs (funktioniert auch mit der grep-Ausgabe). Etags, visit-tags-table und find-tag sind ebenfalls wichtig. completion.el ist einer der großen unbesungenen Hacks des 20. Jahrhunderts und kann Ihr C++ - Hacken um eine Größenordnung beschleunigen. Oh, und lasst uns Ediff nicht vergessen.

Ich muss noch lernen, wie man die Versionskontrolle verwendet, ohne eine Shell zu besuchen, aber jetzt, wo ich mehr Commits ausführt (mit git), muss ich dies wahrscheinlich tun.

3
jfm3

Ich benutze Emacs unter Windows. Das Kompilierungsmodul ist Nizza, aber ich wollte, dass Kompilieren die Befehlszeile des Kompilierens klüger macht. Es ist möglich, "Dateivariablen" zu verwenden, um compile-command anzugeben, aber ich wollte etwas intelligenteres als das. Also habe ich eine kleine Funktion geschrieben, um zu helfen. Er ruft den Befehl zum Kompilieren ab, mit dem der Benutzer aufgefordert wird, wenn compile ausgeführt wird. 

Die Schätzfunktion sucht nach einer vbproj- oder csproj- oder sln-Datei. Wenn sie gefunden wird, wird msbuild vorgeschlagen. Dann wird nach dem Namen der Pufferdatei gesucht und, abhängig davon, verschiedene Dinge vorgeschlagen. Eine .wxs-Datei bedeutet, dass es sich um ein WIX-Projekt handelt, und Sie möchten wahrscheinlich eine MSI erstellen. Die Vermutungslogik schlägt daher den Befehl "nmake" für die MSI vor. Wenn es sich um ein Javascript-Modul handelt, sollten Sie jslint-for-wsh.js ausführen, um die .js-Datei zu fädeln. Als Rückfall deutet dies an, dass es nicht anders geht. 

Der Code, den ich verwende, sieht so aus:

(defun cheeso-guess-compile-command ()
  "set `compile-command' intelligently depending on the
current buffer, or the contents of the current directory."
  (interactive)
  (set (make-local-variable 'compile-command)
       (cond
        ((or (file-expand-wildcards "*.csproj" t)
             (file-expand-wildcards "*.vcproj" t)
             (file-expand-wildcards "*.vbproj" t)
             (file-expand-wildcards "*.shfbproj" t)
             (file-expand-wildcards "*.sln" t))
         "msbuild ")

        ;; sometimes, not sure why, the buffer-file-name is
        ;; not set.  Can use it only if set.
        (buffer-file-name
         (let ((filename (file-name-nondirectory buffer-file-name)))
           (cond

            ;; editing a .wxs (WIX Soluition) file
            ((string-equal (substring buffer-file-name -4) ".wxs")
             (concat "nmake "
                     ;; (substring buffer-file-name 0 -4) ;; includes full path
                     (file-name-sans-extension filename)
                     ".msi" ))

            ;; a javascript file - run jslint
            ((string-equal (substring buffer-file-name -3) ".js")
             (concat (getenv "windir")
                     "\\system32\\cscript.exe c:\\users\\cheeso\\bin\\jslint-for-wsh.js "
                     filename))

            ;; something else - do a typical .exe build
            (t
             (concat "nmake "
                     (file-name-sans-extension filename)
                     ".exe")))))
        (t
         "nmake "))))


(defun cheeso-invoke-compile-interactively ()
  "fn to wrap the `compile' function.  This simply
checks to see if `compile-command' has been previously set, and
if not, invokes `cheeso-guess-compile-command' to set the value.
Then it invokes the `compile' function, interactively."
  (interactive)
  (cond
   ((not (boundp 'cheeso-local-compile-command-has-been-set))
    (cheeso-guess-compile-command)
    (set (make-local-variable 'cheeso-local-compile-command-has-been-set) t)))
  ;; local compile command has now been set
  (call-interactively 'compile))

;; in lieu of binding to `compile', bind to my monkeypatched function
(global-set-key "\C-x\C-e"  'cheeso-invoke-compile-interactively)

Ich habe versucht, dies als "Vorher-Rat" für die Kompilierfunktion zu tun, konnte aber nicht zufriedenstellend arbeiten. Also habe ich eine neue Funktion definiert und an die gleiche Tastenkombination gebunden, die ich für compile verwendet habe. 


EDIT gibt es jetzt " smarter-compile.el ", was diese Idee noch einen Schritt weiterbringt.

3
Cheeso

Tabbar könnte auch nützlich sein. Es emuliert das einzige Verhalten, das ich beim Wechsel von Eclipse zu Emacs übersehen habe. Gebunden an "," und "." Um zur vorherigen und zur nächsten Tab-Leiste zu gelangen, müssen Sie den Puffer ständig durch Strg-xb wechseln.

Leider enthält die erwähnte Webseite nicht die richtige Version zum Herunterladen. Die meisten Ubuntu-Versionen liefern es jedoch in ihren Emacs-Goodies-Paketen.

3
wr.

Ich weiß, das ist ein sehr alter Beitrag. Diese Frage gilt jedoch für Emacs-Anfänger.

IMO Die beste Möglichkeit, emacs als ide zu verwenden, ist die Verwendung eines Sprachserverprotokolls mit Emacs. In der verlinkten Website finden Sie alle Informationen zu Sprachservern. 

Für eine schnelle Einrichtung möchte ich Sie bitten, diese Seite zu besuchen eglot . IMO Eglot macht seinen Job ziemlich gut. Es lässt sich gut in Auto-Komplettierungspakete wie zB Unternehmen integrieren. Bietet Suchreferenz und mehr. 

Für einen Debugger benötigen Sie möglicherweise bestimmte Debugger für bestimmte Sprachen. Sie können gdb innerhalb von emacs verwenden. Geben Sie einfach M-x gdb ein. 

Um den Code zu kompilieren, verwenden Sie am besten Shell-Befehle. Ich arbeite an diesem Projekt eproj . Es wird eine Weile dauern, bis es fertig ist. Aber alles, was es tut, ist, Shell-Befehl dem Projekttyp zuzuordnen. Und baut Ihr Projekt via Shell auf. Der Befehl wird genauso ausgeführt. Ich kann Hilfe benötigen, um dieses Projekt abzuschließen. Es ist nicht einsatzbereit, aber wenn Sie ein bisschen von elisp wissen, können Sie den Code durchgehen. 

Abgesehen davon ist es immer am besten, den Befehl emacs compile zu verwenden.

Für die Versionskontrolle habe ich noch kein anderes Paket gesehen, das der Leistungsfähigkeit von magit entspricht. Es ist spezifisch für git. Auch für git gibt es ein weiteres Paket git-timemachine, das ich sehr nützlich finde.

Das Nachschlagen von Objekten und das Nachschlagen von Klassen werden vom Sprachserver-Protokoll bereitgestellt. 

Ein Projektbaum kann für eine ide-ähnliche Schnittstelle mit treemacs verwendet werden.

Es gibt auch ein Projekt Interaction Library mit dem Namen projectile .

Für die automatische Vervollständigung finde ich Company-Mode sehr nützlich. 

Wirklich Emacs können gemacht werden, um alles zu tun.

2
sidharth arya

Nachschlagen der Dokumentation: Dies hängt von Ihrer Programmiersprache (n) ab.

C-Bibliotheken und Systemaufrufe werden normalerweise in Manpages dokumentiert. Dafür können Sie M-x man verwenden. Einige Dinge können auf Infoseiten besser dokumentiert werden; Verwenden Sie M-x info.

Verwenden Sie für elisp selbst C-h f. Für Python verwenden Sie >>> help(<function, class, module>) im Interpreter.

Ich finde, dass die meisten anderen Sprachen Dokumentation in HTML-Form anbieten. Versuchen Sie dazu einen eingebetteten Browser (ich verwende w3m). Setzen Sie Ihre Umgebungsvariable BROWSER auf ein Wrapper-Skript um emacsclient -e "(w3m-goto-url-new-session \"[email protected]\")" (on * nix), falls ein Browser einen Browser öffnen kann und Sie ihn in emacs öffnen möchten.

2
Jonas Kölker

In den letzten Jahren wurde Clang zu einem wichtigen Bestandteil der Emacs C++ - Unterstützung. Atila Neves hatte auf der CppCon 2015 einen Vortrag: "Emacs als C++ IDE"

Es ist ein 16-minütiger Vortrag, in dem er Lösungen für die folgenden Themen zeigt:

  • Springe zur Definition
  • Auto-Vervollständigung
  • Direktes Hervorheben der Syntax
  • Datei im Projekt suchen

Folien finden Sie hier .

1
Philipp Claßen

Im Unix- oder X-Windows-Stil weiß ich nicht, dass es eine integrierte IDE gibt, die für alles funktioniert. 

Für die Interaktion mit Debuggern, einer einzigen Komponente einer IDE, sollten Sie realgud berücksichtigen. Die andere Sache, die ich für nützlich halte, sind Parser für Standortnachrichten. Wenn Sie also einen Call-Stack-Trace haben und an einer bestimmten Stelle im Callstack bearbeiten möchten, kann dies diese Front-End-Schnittstelle. 

Bei weitem könnte dieses Programm eine Verbesserung nutzen. Dann könnten aber auch Leute daran arbeiten, die daran arbeiten, um es zu verbessern. 

Haftungsausschluss: Ich arbeite an Realgud

0
rocky