"Tag-Vervollständigungstabelle erstellen" Einfrieren / Blockieren - Deaktivieren

8

TLDR: Ich habe eine große Tag-Datei, die mehrmals pro Sitzung geladen wird, wodurch sie unbrauchbar wird. Die Ursache des Problems oder die Deaktivierung können nicht gefunden werden. Das Hauptziel besteht darin, zu Tags zu springen, aber die Fertigstellung wäre schön

Ich habe kürzlich auf dem Emacs-Subreddit gepostet und ein Benutzer hat mir empfohlen, dieser Gruppe beizutreten, da sie auch Neulingen gegenüber freundlich ist.

Ich habe Emacs als C ++ - IDE verwendet und korrigiere langsam Dinge, die nerven. Ich verwende im Wesentlichen die emacs.d-Datei von redguardtoo .

Ich habe eine Tag-Datei mit 225 MB (1,6 MB Tags). Meine Absicht für das Tag ist nicht unbedingt die Vervollständigung (Verwendung company), sondern eher das Herumspringen im Quellcode. Ich arbeite mit einer unbekannten Codebasis und muss häufig Makro- oder Klassendefinitionen sehen.

Wenn ich zu zufälligen Zeiten mit der Eingabe beginne, wird im Minibuffer eine Nachricht angezeigt

Making tag completion table for [tag file]...0-100%

Anschließend wird ein Popup-Listenfeld mit Optionen für die automatische Vervollständigung angezeigt.

Da diese Tag-Datei so groß ist und das Laden der Tags nicht asynchron zu sein scheint, friert sie Emacs etwa eine Minute lang ein. Dies geschieht auch mehrmals pro Sitzung (mit derselben Datei und mit anderen Dateien im selben Verzeichnis, die dieselbe Tag-Datei verwenden)!


Fragen

  1. Weiß jemand, was das Laden der Tag-Tabelle zum Abschluss initialisiert und wie man sie deaktiviert? Ich habe in meinem Verzeichnis emacs.d nach "Tag-Vervollständigung durchführen" gesucht und nichts gefunden (Hinweis: IIRC, die Lade-Tags waren unabhängig von der Verwendung von companyoder vorhandenauto-complete
  2. Die Fertigstellung wäre schön, aber ich würde mich nur mit der Möglichkeit zufrieden geben, zum Tag-Speicherort zu springen. Gibt es einen Weg, dies zu bekommen?
  3. Wie ist die Denkweise bei der Bewältigung solcher Probleme? Ich möchte in der Lage sein, das nächste Mal selbst weiter Fehler zu beheben.

zusätzliche Information

Aktivierte Nebenmodi (Ch m)

Enabled minor modes: Abbrev Auto-Composition Auto-Compression
Auto-Encryption Blink-Cursor Column-Number Company Desktop-Save
Display-Time Electric-Indent Electric-Pair Evil Evil-Local
Evil-Matchit Evil-Surround Fic File-Name-Shadow Flyspell-Lazy
Font-Lock Ggtags Global-Auto-Revert Global-Company Global-Eldoc
Global-Evil-Matchit Global-Evil-Surround Global-Font-Lock Global-Linum
Global-Page-Break-Lines Global-Pointback Global-Undo-Tree Helm
Helm-Match-Plugin Helm-Occur-Match-Plugin Line-Number Linum Menu-Bar
Mouse-Wheel Override-Global Pointback Recentf Savehist Shell-Dirtrack
Subword Tooltip Undo-Tree Which-Function Window-Numbering Winner Yas
Yas-Global

package-activated-list entspricht

(ace-jump-mode ag s dash anaconda-mode f dash s dash json-rpc auto-compile packed bbdb bookmark+ browse-kill-ring buffer-move clean-aindent-mode cmake-mode coffee-mode color-theme company cpputils-cmake crontab-mode csharp-mode diminish dired+ dired-details dropdown-list dsvn elnode kv db kv fakir kv dash noflet creole kv noflet s noflet dash web s dash emmet-mode erlang evil-args evil goto-chg undo-tree evil-search-highlight-persist exec-path-from-shell expand-region f dash s fakir kv dash noflet fancy-narrow flymake-coffee flymake-easy flymake-css flymake-easy flymake-haml flymake-easy flymake-jslint flymake-easy flymake-lua flymake-python-pyflakes flymake-easy flymake-ruby flymake-easy flymake-sass flymake-easy flymake-shell flymake-easy flyspell-lazy fringe-helper ggtags git-gutter git-timemachine gitconfig-mode gitignore-mode goto-chg haskell-mode helm-descbinds helm async helm-gtags helm async hl-sexp htmlize ibuffer-vc idomenu iedit json-mode json-snatcher json-reformat json-reformat json-rpc json-snatcher kv legalese less-css-mode lua-mode magit git-rebase-mode git-commit-mode markdown-mode maxframe mic-paren move-text multi-term mwe-log-commands noflet org-fstree packed page-break-lines paredit pointback pomodoro pretty-mode project-local-variables quack rainbow-delimiters regex-tool rinari jump inflections findr ruby-compilation inf-ruby inf-ruby robe inf-ruby ruby-compilation inf-ruby rvm sass-mode haml-mode scratch scss-mode session sr-speedbar string-edit dash switch-window tagedit dash s textile-mode undo-tree unfill w3m web s dash wgrep ws-butler yaml-mode yasnippet
frech
quelle
1
Um zu Definitionen / Referenzen zu springen, können Sie GNU Global mit ggtags / helm-gtags verwenden. Garantieren Sie, dass Sie ohne Verzögerung an großen Projekten wie dem Linux-Kernel arbeiten können. Vielleicht möchten Sie sich meine C / C ++ - Anleitung ansehen . Ich behandelte die Code-Navigation (Sprung zu Definition / Referenzen), Code-Vervollständigung, Kompilierung und Debugging-Unterstützung. Ich habe bereits eine Demokonfiguration zum Spielen erstellt, sodass Sie nur durch die Funktionen gehen müssen, ohne etwas zu konfigurieren.
Tu Do
Ihre Guides haben mich dazu gebracht, mit Emacs (insbesondere mit C ++) zu beginnen! Unser Build-System ist sehr kompliziert und #include "..."kann an verschiedenen Orten leben, die bis zur Build-Zeit nicht bekannt sind. Daher könnten ggtags für viele Dateien keine Tags generieren. Derzeit können wir mit unseren Build-Tools make etagsEmacs-kompatible Tags generieren, aber es gibt kein make ggtagsÄquivalent. Also bin ich vorerst mit Etags festgefahren. Irgendwelche Ideen?
freche
Hmm, ich verstehe. Die Situation ist jetzt komplizierter. Sie haben erwähnt, dass ggtagskeine Tags generiert werden können, aber haben Sie gtagsin der Befehlszeile im Projektstamm einfach verwendet ? Sie sollten dies versuchen und ggtags erneut aufrufen. Es sollte nicht geben, make ggtagsweil der eigentliche Befehl ist gtags; ggtagsist nur ein Paketname von Emacs, die es verwenden. Eine andere Option ist, dass Sie ctags verwenden können ; ggtagskann auch ctagsTags erkennen und es ist auch schnell. Sie können beim Aufrufen ctags-Tags generieren ggtags-create-tags, die die Verwendung des ctagsClients erfordern .
Tu Do
Wie auch immer, wenn gtagsich nicht über solche Details Bescheid wissen könnte, denke ich nicht, dass das eingebaute etags(mit Emacs gelieferte) oder ctags(ich habe oben verlinkt) dazu in der Lage wäre. Ich denke, Sie verwenden nur ggtags, um Tags im aktuellen Verzeichnis zu erstellen, nicht Projektstamm. Führen Sie den Befehl gtagsim Projektstamm aus, oder ggtagsnavigieren Sie zum Projektstamm , wenn Sie gefragt werden, wo er generiert werden soll.
Tu Do
Ich habe Ihre Aussage überprüft (alle Tag-Programme können nur aus dem Projektstamm im Baum generiert werden). make etagsfunktioniert, weil es etags aufruft, sobald es ausgewertet hat, wo sich alle .hDateien befinden.
freche

Antworten:

2

Für Ihren Anwendungsfall gibt es jedoch noch Hoffnung. Da Sie verwenden etags, kann es mit helm-etags-selectdem integrierten Helm-Befehl verwendet werden. Befolgen Sie dazu einfach die folgenden Schritte:

  • Führen Sie zunächst den Befehl aus, um eine TAGS-Datei zu generieren.
  • Zweitens verwenden find-tag, um es Emacs zu füttern; Wenn die TAGS-Datei zu groß ist und Emacs Sie zur Bestätigung auffordert, akzeptieren Sie sie einfach. Ihre gesamte TAGS-Datei wird in Emacs geladen und es wird nicht mehr neu geladen.
  • Führen Sie helm-etags-selectzum Schluss einfach ein beliebiges Symbol auf Ihrem Emacs aus. Wenn in Ihrem Projekt nur eine Definition vorhanden ist, springen Sie sofort. Andernfalls zeigen Sie einen Helmpuffer an, aus dem Sie auswählen können.

Zum Abschluss möchten Sie, da Sie über eine große Tag-Datenbank verfügen, diese nicht verwenden auto-completeoder ein companyPopup erstellen, da dies Ihre Emacs einfrieren würde. In diesem Fall können Sie die Helmfirma verwenden . Es ersetzt das companyPopup durch den Helmpuffer. Sie können es einfach zu Ihrem c-mode-hookoder hinzufügen c++-mode-hook:

(defun helm-company-setup ()
   (local-set-key (kbd "C-i") 'helm-company)
   (local-set-key (kbd "<tab>") 'helm-company))

(add-hook 'c-mode-hook 'helm-company-setup)
(add-hook 'c++-mode-hook 'helm-company-setup)
Tu Do.
quelle
2
es hat gut funktioniert! Durch die Verwendung von helm und das Deaktivieren des Tags-Backends für das Unternehmen wurde die Leistung erheblich verbessert. Ihr Führer am Ruder hat mich übrigens von ido umgestellt!
freche
Schön das zu hören :)
Tu Do
1
@Dmitry gut, wenn Sie Tausende von Kandidaten haben, die aufgelistet werden müssen, dann blockiert es Emacs.
Tu Do
1
@ TuDo Das ist keine gute Erklärung. Während das Abrufen so vieler Kandidaten einige Zeit in Anspruch nehmen kann, ist das Anzeigen (und Navigieren in der Liste, Suchen usw.) selbst bei 8000 Elementen sehr schnell. Ich habe einfach keine Projekt / Backend-Kombination, die zum Testen mehr zurückgeben würde.
Dmitry
1
Update: 30000 ist auch bissig, die einzige wahrnehmbare Verzögerung tritt auf, bevor das Popup geöffnet wird.
Dmitry