Kann emacs support in einem ganzen Projekt zur Funktionserklärung gehen?

12

Verfügt emacs über eine Funktion oder Bibliothek, mit der der Benutzer zur Funktionsdeklaration wechseln kann, auch wenn diese in einer anderen Datei definiert wurde?

Wenn ja, für welche Sprachen gibt es Unterstützung?

Die Inspiration für diese Frage stammt aus dem folgenden Artikel, in dem einige der Gründe genannt werden, warum Emacs niemals in der Lage sein werden, mit IDEs zu konkurrieren.

http://henrikwarne.com/2012/06/17/programmer-productivity-emacs-versus-intellij-idea/

user2522280
quelle
Die Art und Weise, wie Emacs im Allgemeinen damit umgeht, besteht darin, sich auf externe kompilierte Programme (wie clang) zu verlassen, um den Quellcode schnell zu verstehen und auf über die Befehlszeile übermittelte Abfragen zu antworten. Schauen Sie sich irony-clangzu diesem Zweck. Hast du die Kommentare zum Artikel gelesen?
Sean Allred
1
Die von alchemist.el für elixir oder omnisharp für C # bereitgestellten Funktionen, die beide auf externen Programmen für Navigation / Refactoring / Ideensachen beruhen, sind den meisten IDEs auf dem Markt ziemlich ähnlich. (Zumindest für die meisten Anwendungsfälle). Emacs ist nicht im selben Geschäft wie IDEs, daher halte ich es nicht für vernünftig, zu sagen, dass es niemals eine konkurrierende Chance haben wird.
Renan Ranelli
@RenanRanelli IDE ist genau der gleiche Weg, außer dass wir die Integration manuell durchführen müssen, anstatt dass jemand es bereits getan und es als "IDE" bezeichnet hat.
Tu Do
2019 gibt es meiner Meinung nach nur eine Lösung, die Sie in Betracht ziehen sollten. Und das ist ein Zeichen für die Fertigstellung des Unternehmens. Vergessen Sie etags oder das aufgeblähte, instabile CEDET. rtags verwendet Informationen zur Kompilierungszeit, um eine LIVE-Struktur dessen bereitzustellen, was Ihr Projekt verwendet. global et al sind schrecklich - sie sind verherrlichte "Greps", die viel raten und Sie häufig an den falschen Ort bringen. github.com/Andersbakken/rtags
RichieHH

Antworten:

14

Sie können zu jeder Definition / Referenz des gesamten Projekts springen, die so groß wie der Linux-Kernel-Quellbaum (mehr als 36 KB) ist. Weitere Informationen finden Sie in meinem C / C ++ - Handbuch . Für C / C ++ empfehle ich die Verwendung von GNU Global , das C, C ++, Yacc, Java, PHP4 und Assembly unterstützt.

Der Schlüssel ist, wenn Sie IDE-Funktionen einer Sprache haben möchten, müssen Sie das Plugin dieser Sprache installieren. Hier sind einige Pakete für dynamische Sprachen, die ich kenne:

  • Live-Webentwicklung: Spieß-Modus .
  • Javascript: Seeschwalbe . Denken Sie jedoch daran, vorher den js2-Modus zu installieren . Was ist zu js2-modetun, siehe die Beschreibung ; Aber im Wesentlichen js2-modehandelt es sich um einen vollständigen Javascript-Parser, der einen AST generiert, um die richtigen IDE-Funktionen auszuführen. Wenn Sie installieren, skewer-modeals Sie js2-modestandardmäßig haben, skewer-modehängt da davon ab.
  • Python: elpy , siehe die IDE-Funktionen
  • Ruby: robe bietet folgende Funktionen:
  • Zur Methodendefinition springen
  • Springe zu Super oder zu einem Konstruktor, der am Punkt aufgerufen wird
  • Zu einem Modul oder einer Klasse springen (vorausgesetzt, es ist mindestens eine Methode definiert)
  • Methodendokumentation anzeigen
  • Anzeigen von Informationen zu Methoden, die an einem bestimmten Punkt mit ElDoc aufgerufen wurden
  • Vervollständigung der Methode und des konstanten Namens

Sie können auch verwenden ctags, um sehr viele Sprachen wie Shell-Skript oder Tcl zu unterstützen ...

Tu Do
quelle
Irgendwelche Suite Vorschläge für Javascript?
user2522280
@BarryG Da ist Tern und j2-modeich habe es in meiner Antwort bearbeitet.
Tu Do
2
Ich möchte darauf hinweisen, dass dies anacondamöglicherweise eine spezifischere Lösung für das Definitionsspringen in Python ist.
PythonNut
@TuDo Sie haben Robes Funktionsliste unter ESS gestellt.
Dmitry
Für C ++ gibt es auch rtags und ycmd . Ich benutze ycmd, das auch mit zB Python, C #, Go und anderen Sprachen funktioniert. Ich benutze Dumb-Jump und Counsel-Rg als Fallback oder um Verwendungen oder kommentierte / dokumentierte Erwähnungen eines Symbols anzuzeigen.
Unhammer
17

Ich bin auf ein ähnliches Problem mit Emacs gestoßen und habe Dumb Jump gemacht . Ich habe viele der in der akzeptierten Antwort genannten Lösungen ausprobiert, bin jedoch immer auf eines oder mehrere der folgenden Probleme gestoßen:

  • Lösung funktionierte nur für eine einzige Programmiersprache
  • Die Lösung erforderte eine Indexdatei (TAG) oder einen persistenten Prozess

Ich wollte unbedingt eine Lösung, die "gerade funktioniert" und keine Anpassung oder Einrichtung erfordert. Das heißt, ich wollte ein zufälliges Repo auf Github klonen und wie jedes andere meiner eigenen Projekte darin navigieren.

Im Moment hat Dumb Jump grundlegende Unterstützung für:

  • JavaScript
  • Emacs Lisp
  • Python
  • Gehen
  • PHP
  • Rubin
  • Faust
  • R
  • Lua
  • Rost
  • ...und mehr

Es ist über MELPA und GitHub erhältlich und PRs sind mehr als willkommen.

Jack
quelle
4

Die primäre Lösung hierfür in emacs ist die Verwendung von TAGS-Dateien, die von Programmen wie etags oder gtags erstellt werden. Ich selbst verwende (und empfehle) üppige ctags und etags-select.el, um Ziele einzugrenzen, wenn das Suchsymbol in mehreren Zielen liegt. Die unterstützten Sprachen sind sehr zahlreich, siehe die Handbücher der einzelnen Tools. Es gibt sogar Unterstützung für das Hinzufügen Ihrer eigenen Sprache, wobei Sie einen regulären Ausdruck bereitstellen können, der ctags anweist, wie die Tags, an denen Sie interessiert sind, zu isolieren sind.

InHarmsWay
quelle
1
Oh! Wie könnte ich Tags-Dateien vergessen? ctags -e -R *aus dem Stammverzeichnis wird es für Sie eingerichtet.
Sean Allred
Ist dies eine akzeptable Lösung, wenn Ihr Projekt viele Abhängigkeiten aufweist (z. B. neuere Javascript-Webentwicklungsprojekte)?
Rudolf Olah
Die Anzahl der Abhängigkeiten ist selbst kein Hindernis. Sie können entweder eine große Tag-Datei haben, in der viele verschiedene Bibliotheken zusammengefasst sind. Ich habe dies viele Jahre lang getan, der Aufruf des Befehls ctags tut dies trivial. Oder was ich jetzt empfehle, ist, eine unterschiedliche Umbautenakte pro Abhängigkeit zu haben; emacs ist intelligent genug, um mehrere Tags-Dateien zu laden. Um dies zu vereinfachen, durchsuchen Sie die Datei etags-table.el, mit der Sie Gruppen von Tag-Dateien pro Projekt laden können.
InHarmsWay