Congelación / Bloqueo de la "Tabla de finalización de etiquetas": cómo deshabilitar

8

TLDR: Tengo un archivo de etiquetas grandes que se carga varias veces por sesión, por lo que no se puede usar. No se puede encontrar la fuente del problema o cómo deshabilitarlo: el objetivo principal es saltar a las etiquetas, pero sería bueno completarlo

Recientemente publiqué en el subreddit de emacs y un usuario me recomendó que me uniera a este grupo porque también es amigable con los novatos.

He estado usando emacs como un IDE de C ++, y estoy corrigiendo lentamente cosas que son molestas. Básicamente estoy usando el archivo emacs.d de redguardtoo .

Tengo un archivo de etiqueta de 225 MB (1,6 millones de etiquetas). Mi intención para la etiqueta no es necesariamente completar (usar company), sino más bien saltar el código fuente. Estoy trabajando con una base de código desconocida y, a menudo, necesito ver definiciones de macro o clase.

Cuando empiezo a escribir, en momentos aleatorios, veré un mensaje en el minibúfer

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

Luego, aparece un cuadro de lista emergente con opciones de autocompletado.

Debido a que este archivo de etiqueta es tan grande y no parece que la carga de la etiqueta sea asíncrona, congela emacs durante aproximadamente un minuto. ¡Esto también ocurre varias veces por sesión (con el mismo archivo y con otros archivos en el mismo directorio que usan el mismo archivo de etiqueta)!


Preguntas

  1. ¿Alguien sabe qué está inicializando la carga de la tabla de etiquetas para completar y cómo deshabilitarla? Hice un grep en mi directorio emacs.d para "Realizar la finalización de la etiqueta" y no encontré nada (nota, IIRC, las etiquetas de carga estaban presentes independientemente del uso companyoauto-complete
  2. La finalización sería buena, pero me conformaría con la capacidad de saltar a la ubicación de la etiqueta. ¿Hay alguna manera de conseguir esto?
  3. ¿Cuál es la mentalidad a tomar al abordar problemas como este? Me gustaría poder solucionar problemas por mi cuenta la próxima vez.

información adicional

Modos menores habilitados (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 es igual a

(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
descarado
fuente
1
Para saltar a definición / referencias, puede usar GNU Global con ggtags / helm-gtags. Garantía para trabajar en proyectos grandes como el kernel de Linux sin demora. Es posible que desee ver mi guía C / C ++ . Cubrí la navegación de código (salto a definición / referencias), finalización de código, compilación y soporte de depuración. Ya creé una configuración de demostración para jugar, por lo que solo necesita recorrer las características sin configurar nada.
Tu Do
¡Tus guías fueron los que me ayudaron a comenzar con emacs (especialmente con C + +)! Nuestro sistema de construcción es muy complicado y #include "..."puede vivir en varios lugares que no se conocen hasta el momento de la construcción. Entonces, ggtags no podría generar etiquetas para muchos de los archivos. Actualmente, nuestras herramientas de compilación nos permiten make etagsgenerar etiquetas compatibles con emacs, pero no hay make ggtagsequivalente. Entonces, estoy atrapado con etags por ahora. ¿Algunas ideas?
descarado
Hmm ya veo. La situación es más complicada ahora. Usted mencionó ggtagsque no puede generar etiquetas, pero ¿usó plain gtagsen la línea de comando en la raíz del proyecto? Deberías probar esto e invocar ggtags nuevamente. No debería ser make ggtagsporque el comando real es gtags; ggtagses solo un nombre de paquete de Emacs que lo usa. Otra opción es que puedes usar ctags ; ggtagsTambién puede reconocer ctagsetiquetas y también es rápido. Puede generar etiquetas ctags cuando se invoca ggtags-create-tagsy solicita el uso del ctagscliente.
Tu Do
De todos modos, si gtagsno pudiera conocer tales detalles, no creo que el incorporado etags(viene con Emacs) o ctags(lo vinculé anteriormente) pueda hacerlo. Creo que solo se usa ggtagspara crear etiquetas en el directorio actual, no en la raíz del proyecto. Ejecute el comando gtagsen la raíz del proyecto, o cuando ggtagsle pregunte dónde generar, navegue hasta la raíz del proyecto y estará bien.
Tu Do
Verifiqué su declaración (todos los programas de etiqueta solo pueden generar desde la raíz del proyecto hacia abajo en el árbol). make etagsfunciona porque llama a etags una vez que evalúa dónde .hviven todos los archivos.
cheezy

Respuestas:

2

Sin embargo, para su caso de uso, todavía hay esperanza. Desde su uso etags, se puede usar con helm-etags-selectel comando integrado Helm. Para usarlo, simplemente siga estos pasos:

  • Primero, ejecute el comando para generar el archivo TAGS.
  • Segundo, use find-tagpara alimentarlo a Emacs; si el archivo TAGS es demasiado grande y Emacs le pide que confirme, simplemente acéptelo. Todo su archivo TAGS se cargará en Emacs y no habrá más recarga.
  • Finalmente, simplemente ejecute helm-etags-selectcualquier símbolo en su Emacs. Si solo existe una definición en su proyecto, salte instantáneamente; de lo contrario, muestre un búfer Helm para que elija.

Para completar, ya que tiene una gran base de datos de etiquetas, no querrá usar auto-completeo companyabrir una ventana emergente porque congelaría sus Emacs. En ese caso, puede usar helm-company ; reemplaza companypopup con Helm buffer. Simplemente puede agregarlo a su c-mode-hooko 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
fuente
2
funcionó bien! El uso del timón y la desactivación de las etiquetas de back-end para la empresa mejoraron significativamente el rendimiento. ¡Tu guía en timón me cambió de ido por cierto!
descarado el
Genial escuchar eso :)
Tu Do
1
@Dmitry bien cuando tienes miles de candidatos que necesitas listar, entonces bloquea Emacs.
Tu Do
1
@TuDo Esa no es una buena explicación. Si bien la obtención de tantos candidatos puede llevar algo de tiempo, mostrarlos (y navegar por la lista, buscar, etc.) es muy ágil incluso con 8000 elementos. Simplemente no tengo una combinación de proyecto / backend que devolvería más, para probar.
Dmitry
1
Actualización: 30000 también es ágil, el único retraso perceptible ocurre antes de que se abra la ventana emergente.
Dmitry