TLDR: ho un file di tag di grandi dimensioni che si carica più volte per sessione, rendendolo inutilizzabile. Impossibile trovare la fonte del problema o come disabilitarlo: l'obiettivo principale è passare ai tag, ma il completamento sarebbe gradito
Di recente ho pubblicato su emacs subreddit e un utente mi ha consigliato di unirmi a questo gruppo perché è anche amichevole con i neofiti.
Ho usato emacs come IDE C ++ e sto lentamente correggendo cose che sono fastidiose. Sto essenzialmente usando il file emacs.d di redguardtoo .
Ho un file di tag che è 225 MB (tag 1.6M). Il mio intento per il tag non è necessariamente il completamento (utilizzo company
), ma più per saltare nel codice sorgente. Sto lavorando con una base di codice sconosciuta e spesso ho bisogno di vedere le definizioni di macro o di classe.
Quando comincio a digitare, in momenti casuali, vedrò un messaggio nel minibuffer
Making tag completion table for [tag file]...0-100%
Quindi, viene visualizzata una casella di riepilogo popup con opzioni di completamento automatico.
Poiché questo file di tag è così grande e non sembra che il caricamento dei tag sia asincrono, blocca emacs per circa un minuto. Questo accade anche più volte per sessione (con lo stesso file e con altri file nella stessa directory che utilizzano lo stesso file tag)!
Domande
- Qualcuno sa cosa sta inizializzando il caricamento della tabella dei tag per il completamento e come disabilitarlo? Ho fatto un grep sul mio elenco emacs.d per "Fare il completamento tag" e trovato nulla (nota, IIRC i tag di carico era presente indipendentemente utilizzando
company
oauto-complete
- Il completamento sarebbe bello, ma mi accontenterei solo della possibilità di saltare alla posizione del tag. C'è un modo per ottenerlo?
- Qual è la mentalità da prendere quando si affrontano problemi come questo? Mi piacerebbe essere in grado di risolvere ulteriormente i problemi la prossima volta.
informazioni addizionali
Modalità secondarie abilitate (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
è uguale 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
#include "..."
può vivere in vari luoghi sconosciuti fino al momento della compilazione. Quindi, ggtags non sarebbe in grado di generare tag per molti file. Attualmente, i nostri strumenti di creazione ci consentono make etags
di generare tag compatibili con emacs, ma non esiste un make ggtags
equivalente. Quindi, sono bloccato con etags per ora. Qualche idea?
ggtags
non è possibile generare tag, ma hai usato semplicemente gtags
sulla riga di comando nella radice del progetto? Dovresti provare questo e invocare di nuovo ggtags. Non dovrebbe esserci make ggtags
perché il vero comando è gtags
; ggtags
è solo un nome di pacchetto di Emacs che lo utilizza. Un'altra opzione è che puoi usare i tag ; ggtags
può anche riconoscere i ctags
tag ed è anche veloce. È possibile generare tag ctags quando si richiama ggtags-create-tags
e richiede l'utilizzo del ctags
client.
gtags
non potessi conoscere tali dettagli, non penso che il built-in etags
(fornito con Emacs) o ctags
(che ho linkato sopra) sarebbe in grado di farlo. Penso che tu usi solo ggtags
per creare tag nella directory corrente, non nella radice del progetto. Esegui il comando gtags
nella radice del progetto o quando ti ggtags
chiede dove generare, vai alla radice del progetto e andrà tutto bene.
make etags
funziona perché chiama etags dopo aver valutato dove .h
vivono tutti i file.