it-swarm.com.de

Emacs C IDE / Gnu Global helm-gtags

Hallo Ubuntu Community,

als erstes möchte ich also sagen, dass ich mit Ubuntu (16.10) und Linux noch recht neu bin. Ich entschied mich dafür, Windows so wenig wie möglich zu verwenden und wollte auch die Programmiersprache C lernen. Ich dachte jedoch, es wäre schön, dies in Emacs zu tun, also fing ich an, Emacs zu lernen, und machte einige Tutorials über Emacs. Meistens Basics und dann learning by doing. Also habe ich dieses Tutorial gefunden https://tuhdo.github.io/c-ide.html Davor habe ich viele Pakete installiert, einschließlich helm und gtags und helm-gtags. Ich habe auch ncurses libary installiert, um gnu global zu installieren.

Nun kommen wir zu meinem Problem/meiner Frage. Erstens, wenn ich ehrlich bin, weiß ich jetzt nicht wirklich, was Gtags sind, aber ich dachte, ich werde es herausfinden, wenn ich es installiere (Etwas für die Navigation, denke ich). Im Abschnitt 'Source Code Navigation' spricht er über:

"Bevor Sie ggtags oder helm-gtags verwenden, müssen Sie daran denken, eine GTAGS-Datenbank zu erstellen, indem Sie gtags in Ihrem Projektstamm im Terminal ausführen:" .. und dann einige Befehle

Ich denke, ich muss irgendwie eine Bibliothek mit Emacs verbinden. Ich habe GNU_Global FAQ geschrieben, um einen Link zu meinem Projektordner zu erstellen, der sich auf:/usr/src/lib bezieht

Aber in meinem/usr/src Verzeichnis befindet sich kein lib Ordner. Nun, ich denke, weil Ubuntu etwas andere Strukturen als andere Linux-Distributionen hat, ist diese Bibliothek woanders? Oder liege ich völlig falsch? Ich konnte mit Google keine Antworten finden, vielleicht können Sie mich aufklären.

Danke im Voraus, Andi

3
Andi

gtags ist ein Linux-Tool, das eine Symboldatenbank für den Quellcode generiert und dann die Suche nach diesen Symbolen zur Verwendung und Definition ermöglicht. ggtags ist das "Plugin" für Emacs, das ein automatisiertes Frontend für das Tool bietet. Einige Alternativen, die ähnliche Funktionen wie gtags haben, sind ctags, etags und cscope, von denen die meisten ihre eigenen Emacs-Plugins haben.
Insbesondere sind viele dieser Tools aufgrund der Art und Weise, wie sie ihre Datenbanken speichern, nicht sehr gut im Umgang mit großen Codebasen (Linux-Kernelgröße und größer). Der Linux-Kernel generiert beispielsweise eine 2-GB-Textdatei, wenn nur gtags verwendet werden. Diese Datei muss geladen und durchsucht werden, wenn Sie versuchen, eine Symbolsuche durchzuführen. Es gibt Problemumgehungen, um dieses Problem zu beheben (siehe unten).

Einfache lösung

1.Installieren Sie gtags auf Ihrem System.

Sudo apt-get install global

In einer Befehlszeile sollten Sie nun in der Lage sein, diesen Befehl auszuführen und zu sehen, wo er installiert ist:

which gtags

2. Teilen Sie dem Emacs-Plug-in ggtags mit, wo sich das Tool gtags befindet.

Fügen Sie unter Verwendung des vom Befehl which gtags zurückgegebenen Pfads die folgende Zeile zu Ihrer ~/.emacs-Datei hinzu:

(setq ggtags-executable-directory "/path/to/gtags/parent/dir")

3.Erstellen Sie eine gtags-Datenbank für ein Code-Projekt.

Standardmäßig durchsucht ggtags den Verzeichnisbaum in der Datei, in der Sie eine Symbolsuche durchgeführt haben, um eine GTAGS-Datei zu finden. Diese GTAGS-Datei (und möglicherweise einige zugehörige) ist Ihre Symboldatenbank. Wenn für das Symbol in der ersten Datenbankdatei keine Übereinstimmung gefunden wird, wird der Verzeichnisbaum weiterhin nach zusätzlichen Datenbanken durchsucht. Übereinstimmungen werden basierend auf der Nähe der Symbolverwendung/-definition zu der Datei, in der Sie suchen, priorisiert. Die Generierung dieser Datenbank wird als "Tagging" bezeichnet und befindet sich normalerweise im Stammverzeichnis eines Quellbaums, den Sie taggen möchten. Das Tool "gtags" selbst führt diese Fortsetzungssuche nicht durch, da ein Pfad zu einer bestimmten Datenbank übergeben wurde. Das von Emacs bereitgestellte Plug-in "gtags" verwaltet dieses Verhalten für eine einzelne Datenbank.

Um eine gtags-Datenbank für einen Quellordner aus Emacs zu erstellen, wenn Sie das ggtags-Plugin verwenden (empfohlen über das native Emacs-gtags-Plugin), müssen Sie den Befehl ggtags-create-tags ausführen. Die Standardtastenbelegung für die Ausführung beliebiger Befehle in Emacs ist M-x. Drücken Sie diese Taste und geben Sie dann ggtags-create-tags ein. Sie werden aufgefordert, einen Ordner anzugeben, der mit Tags versehen und die Datenbank platziert werden soll. Zeigen Sie daher auf das oberste Verzeichnis des Quellordners, den Sie mit Tags versehen möchten. Es wird eine Weile ausgeführt, möglicherweise eine Weile, wenn Sie einen großen Quelltextbaum haben, der die gesamte Emacs-Benutzeroberfläche blockiert, während die Tag-Datenbank generiert wird. Sobald es abgeschlossen ist, wird es bei Bedarf automatisch von ggtags verwendet.

Viel bessere Lösung

Eines der Probleme mit gtags, ctags, etags und cscope ist die Größe der erzeugten Datenbanken. Da sie kennzeichnen, wo Symbole definiert sind und wo sie verwendet werden, können Sie eine Datenbank erhalten, die größer ist als Ihr tatsächlicher Quellbaum. Sehr große Datenbanken weisen dann das Problem auf, sie in angemessener Zeit zu durchsuchen. Die Verwendung von ggtags mit dem standardmäßig installierten gnu-global-Tool von Ubuntu führt zu einem sehr ineffizienten Datenbankformat, das mit zunehmender Größe exponentiell schlechter wird. Dies liegt hauptsächlich daran, dass Ubuntu immer noch das gnu-global-Tool aus dem Jahr 2008 statt einer modernen Version bereitstellt und nicht dafür ausgelegt ist, die wesentlich effizienteren ctags-Tools als zugrunde liegendes Framework zu verwenden.

Um die Probleme mit gtags zu vermeiden und die effizienteren ctags zu verwenden, benötigen Sie global-6.4 oder höher, und es muss so erstellt werden, dass es auf Ihre ctags-Installationen verweist. Die einzige Möglichkeit, die ich wirklich gefunden habe, besteht darin, sie aus dem Quellcode zu erstellen und die richtigen Optionen sowie alle erforderlichen abhängigen Paketinstallationen bereitzustellen. Am Ende habe ich ein Shell-Skript geschrieben, um diese Installation und Einrichtung für mich durchzuführen, und ich behalte es in GitHub zusammen mit den restlichen Konfigurations- und Installationsskripten für meinen Emacs. Sie können es von https://github.com/mtalexan/emacs-settings/blob/master/global_install.sh herunterladen.

Sie müssen einige Einstellungen in Ihren ~/.emacs vornehmen, um dies voll ausnutzen zu können:

(setq ggtags-use-idutils t)
(setq ggtags-use-project-gtagsconf nil)

Dies ermöglicht die Verwendung des sehr effizienten Unterpakets idutils und stellt sicher, dass gtags-Aufrufe Ihre globalen Einstellungen für gtags verwenden, die Sie jetzt kompiliert haben.

Wie benutzt man gtags/ggtags/helm-gtags

Ich persönlich benutze ggtags und keine helm-gtags oder gtags. Emacs bietet standardmäßig ein "Plugin" für gtags an, hat jedoch eine viel schlechtere Oberfläche als ggtags und durchsucht nur eine einzige Datenbank. Ich benutze helm für die meisten Dinge regelmäßig, aber ich mag es, wenn meine ggtags-Schnittstelle von meiner helm-Schnittstelle getrennt ist, wenn ich Übereinstimmungen analysiere, also verwende ich keine helm-gtags. Auch helm-gtags ist ziemlich langsam, wenn Ihre gtags-Datenbank groß ist.

Für ggtags müssen Sie den ggtags-Modus einstellen, damit er nützlich ist. Fügen Sie dies hinzu, um den C-Modus automatisch auszulösen, indem Sie Ihrer .emacs-Datei Folgendes hinzufügen

(add-hook 'c-mode-common-hook
  (lambda ()
    (when (derived-mode-p 'c-mode 'c++-mode 'Java-mode)
     (ggtags-mode 1))))

Alternativ können Sie festlegen, dass es immer aktiviert sein soll, indem Sie stattdessen eine Zeile wie die folgende verwenden:

(setq ggtags-global-mode 1)



Einstellungen, die ich für die Verwendung einer großen Codebasis empfehle, erfordern die folgenden Zeilen in Ihrer ~/.emacs-Datei:

; Allow very large database files
(setq ggtags-oversize-limit 104857600)
(setq ggtags-sort-by-nearness t)



Beim Durchsuchen des Codes folge ich am häufigsten einem Symbol unter meinem Cursor, finde alle Verwendungszwecke eines Symbols unter meinem Cursor und führe gelegentlich eine Symbolsuche unabhängig von der Position meines Cursors durch. Diese entsprechen den Befehlen: ggtags-find-tag-dwim und ggtags-find-reference. Diese Befehle wirken sich auf einen Punkt aus (die Position Ihres Emacs-Cursors). Sie werden jedoch aufgefordert, ein Symbol einzugeben, wenn sich kein Symbol unter Ihrem Punkt befindet oder wenn Sie von M-x aufgerufen werden.
Wenn Sie ggtags-find-tag-dwim ausführen, können Sie eine Reihe von Dingen ausführen, die Sie am besten verstehen, wenn Sie damit spielen. Im Allgemeinen wird jedoch zu einem Match gesprungen, wenn es nur ein Match gibt (Entsprechung, die nicht automatisch überspringt, ist ggtags-find-tag) oder öffnet ein Seitenfenster wie ggtags-find-reference mit einer Liste möglicher Übereinstimmungen, die die Datei, die Zeilennummer und einen Kontext enthält, in dem jeder Eintrag angeklickt werden kann, um direkt dorthin zu springen.
Seien Sie vorsichtig, wenn dieses Fenster geöffnet ist. Es versetzt Sie in einen speziellen Nebenmodus, dh die Auf- und Ab-Tasten wechseln zwischen Übereinstimmungen, bis Sie die Eingabetaste drücken, um eine Übereinstimmung offiziell auszuwählen.
Wenn Sie eine Übereinstimmung auswählen, bleibt Ihre Tag-Markierung erhalten. Dies bedeutet, dass Sie den Befehl pop-tag-mark verwenden können, um zu der letzten Stelle zurückzukehren, an der Sie sich befanden. Tag-Mark ist ein Stapel von Tag-Marks. Sie können also wiederholt nach Symbolen suchen und immer zu jeder Position zurückkehren, bevor Sie einer Suche folgen. Wenn Sie nur eine manuelle Suche durchführen möchten, anstatt auf der Grundlage des Symbols am Punkt, gibt es einige ggtags-Funktionen, die wie ggtags-find-tag-dwim funktionieren, aber Sie im Minipuffer zur Eingabe des Symbols auffordern. ggtags-find-tag-dwim tut dies auch, wenn sich unter dem Punkt kein Symbol befindet.

4
mtalexan