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
- ¿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
company
oauto-complete
- 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?
- ¿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
fuente
#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 permitenmake etags
generar etiquetas compatibles con emacs, pero no haymake ggtags
equivalente. Entonces, estoy atrapado con etags por ahora. ¿Algunas ideas?ggtags
que no puede generar etiquetas, pero ¿usó plaingtags
en la línea de comando en la raíz del proyecto? Deberías probar esto e invocar ggtags nuevamente. No debería sermake ggtags
porque el comando real esgtags
;ggtags
es solo un nombre de paquete de Emacs que lo usa. Otra opción es que puedes usar ctags ;ggtags
También puede reconocerctags
etiquetas y también es rápido. Puede generar etiquetas ctags cuando se invocaggtags-create-tags
y solicita el uso delctags
cliente.gtags
no pudiera conocer tales detalles, no creo que el incorporadoetags
(viene con Emacs) octags
(lo vinculé anteriormente) pueda hacerlo. Creo que solo se usaggtags
para crear etiquetas en el directorio actual, no en la raíz del proyecto. Ejecute el comandogtags
en la raíz del proyecto, o cuandoggtags
le pregunte dónde generar, navegue hasta la raíz del proyecto y estará bien.make etags
funciona porque llama a etags una vez que evalúa dónde.h
viven todos los archivos.Respuestas:
Sin embargo, para su caso de uso, todavía hay esperanza. Desde su uso
etags
, se puede usar conhelm-etags-select
el comando integrado Helm. Para usarlo, simplemente siga estos pasos:find-tag
para 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.helm-etags-select
cualquier 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-complete
ocompany
abrir una ventana emergente porque congelaría sus Emacs. En ese caso, puede usar helm-company ; reemplazacompany
popup con Helm buffer. Simplemente puede agregarlo a suc-mode-hook
oc++-mode-hook
:fuente