«Faire un tableau de complétion de balise» se bloque / bloque - comment désactiver

8

TLDR: J'ai un gros fichier de balises qui se charge plusieurs fois par session, ce qui le rend inutilisable. Impossible de trouver la source du problème ou comment le désactiver - l'objectif principal est de passer aux balises, mais l'achèvement serait bien

J'ai récemment posté sur le subreddit emacs et un utilisateur m'a recommandé de rejoindre ce groupe car il est également convivial avec les débutants.

J'ai utilisé emacs comme IDE C ++, et je corrige lentement des choses ennuyeuses. J'utilise essentiellement le fichier emacs.d de redguardtoo .

J'ai un fichier de balises de 225 Mo (balises de 1,6 Mo). Mon intention pour la balise n'est pas nécessairement l'achèvement (en utilisant company), mais plus pour sauter le code source. Je travaille avec une base de code inconnue et j'ai souvent besoin de voir des définitions de macro ou de classe.

Lorsque je commence à taper, à des moments aléatoires, je vois un message dans le mini-tampon

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

Ensuite, une liste déroulante apparaît avec des options de saisie semi-automatique.

Étant donné que ce fichier de balises est si volumineux et qu'il ne semble pas que le chargement des balises soit asynchrone, il fige emacs pendant environ une minute. Cela se produit également plusieurs fois par session (avec le même fichier et avec d'autres fichiers du même répertoire qui utilisent le même fichier de balises)!


Des questions

  1. Quelqu'un sait-il ce qui initialise le chargement de la table de balises pour l'achèvement et comment le désactiver? J'ai fait un grep sur mon répertoire emacs.d pour "Faire la complétion des balises" et je n'ai rien trouvé (note, IIRC les balises de chargement étaient présentes indépendamment de l'utilisation companyouauto-complete
  2. L'achèvement serait bien, mais je me contenterais de pouvoir sauter à l'emplacement du tag. Y a-t-il un moyen de l'obtenir?
  3. Quelle est la mentalité à adopter pour aborder des problèmes comme celui-ci? Je voudrais être en mesure de dépanner davantage par moi-même la prochaine fois.

information additionnelle

Modes mineurs activés (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 est égal à

(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
cheezy
la source
1
Pour passer à la définition / références, vous pouvez utiliser GNU Global avec ggtags / helm-gtags. Garantie de travailler sur de gros projets comme le noyau Linux sans aucun délai. Vous voudrez peut-être consulter mon guide C / C ++ . J'ai couvert la navigation dans le code (passer à la définition / références), l'achèvement du code, la compilation et le débogage. J'ai déjà créé une configuration de démonstration pour jouer avec, vous n'avez donc qu'à parcourir les fonctionnalités sans rien configurer.
Tu Do
Vos guides ont été ceux qui m'ont permis de démarrer avec emacs (en particulier avec C ++)! Notre système de construction est très compliqué et #include "..."peut vivre dans divers endroits qui ne sont connus qu'au moment de la construction. Ainsi, ggtags ne pourrait pas générer de balises pour de nombreux fichiers. Actuellement, nos outils de build nous permettent make etagsde générer des tags compatibles emacs, mais il n'y a pas d' make ggtagséquivalent. Donc, je suis coincé avec des étiquettes pour le moment. Des idées?
cheezy
Hmm je vois. La situation est maintenant plus compliquée. Vous avez mentionné que ggtagsvous ne pouvez pas générer de balises, mais avez-vous utilisé plain gtagssur la ligne de commande à la racine du projet? Vous devriez essayer ceci et invoquer à nouveau ggtags. Il ne devrait pas y en avoir make ggtagsparce que la vraie commande est gtags; ggtagsest juste un nom de package d'Emacs qui l'utilise. Une autre option est que vous pouvez utiliser des ctags ; ggtagspeut également reconnaître les ctagsbalises et c'est aussi rapide. Vous pouvez générer des balises ctags lors de l'appel ggtags-create-tagset il demande d'utiliser le ctagsclient.
Tu Do
Quoi qu'il en soit, si gtagsje ne pouvais pas connaître ces détails, je ne pense pas que le intégré etags(fourni avec Emacs) ou ctags(que j'ai lié ci-dessus) serait en mesure de le faire. Je pense que vous utilisez uniquement ggtagspour créer des balises dans le répertoire actuel, pas la racine du projet. Exécutez la commande gtagsà la racine du projet, ou lorsque ggtagsvous demandez où générer, accédez à la racine du projet et tout ira bien.
Tu Do
J'ai vérifié votre déclaration (tous les programmes de balises ne peuvent être générés qu'à partir de la racine du projet dans l'arborescence). make etagsfonctionne car il appelle etags une fois qu'il a évalué l'emplacement de tous les .hfichiers.
cheezy

Réponses:

2

Pour votre cas d'utilisation, il y a encore de l'espoir. Depuis que vous l'utilisez etags, il peut être utilisé avec helm-etags-selectla commande intégrée Helm. Pour l'utiliser, suivez simplement ces étapes:

  • Tout d'abord, exécutez la commande pour générer le fichier TAGS.
  • Deuxièmement, utilisez-le find-tagpour alimenter Emacs; si le fichier TAGS est trop volumineux et qu'Emacs vous demande de le confirmer, acceptez-le. Votre fichier TAGS entier sera chargé dans Emacs et il n'y a plus de rechargement.
  • Enfin, exécutez simplement helm-etags-selectn'importe quel symbole sur votre Emacs. S'il n'existe qu'une seule définition dans votre projet, sautez instantanément; sinon, affichez un tampon Helm parmi lequel vous pouvez choisir.

Pour terminer, puisque vous avez une grande base de données de balises, vous ne voudriez pas utiliser auto-completeou companypopup car cela gèlerait vos Emacs. Dans ce cas, vous pouvez utiliser helm-company ; il remplace companypopup par Helm buffer. Vous pouvez simplement l'ajouter à votre c-mode-hookou 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
la source
2
cela a bien fonctionné! l'utilisation de la barre et la désactivation du backend des tags pour l'entreprise ont considérablement amélioré les performances. Votre guide à la barre m'a fait passer de ido btw!
cheezy
Super d'entendre ça :)
Tu Do
1
@Dmitry bien quand vous avez des milliers de candidats à lister, alors ça bloque Emacs.
Tu Do
1
@TuDo Ce n'est pas une bonne explication. Bien que la recherche de tant de candidats puisse prendre un certain temps, leur affichage (et la navigation dans la liste, la recherche, etc.) est très rapide, même avec 8000 éléments. Je n'ai tout simplement pas de combinaison projet / backend qui reviendrait plus, à tester.
Dmitry
1
Mise à jour: 30000 est également accrocheur, le seul délai perceptible se produit avant l'ouverture de la fenêtre contextuelle.
Dmitry