"Creazione della tabella di completamento dei tag" Blocca / Blocca: come disabilitare


8

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

  1. 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 companyoauto-complete
  2. Il completamento sarebbe bello, ma mi accontenterei solo della possibilità di saltare alla posizione del tag. C'è un modo per ottenerlo?
  3. 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

1
Per saltare alla definizione / riferimenti, puoi usare GNU Global con ggtags / helm-gtags. Garanzia di lavorare su grandi progetti come il kernel Linux senza alcun ritardo. Potresti voler dare un'occhiata alla mia guida C / C ++ . Ho coperto la navigazione del codice (vai alla definizione / riferimenti), il completamento del codice, la compilazione e il supporto al debug. Ho già creato una configurazione demo per giocare, quindi devi solo esplorare le funzionalità senza configurare nulla.
Ma Do,

Le tue guide sono state quelle che mi hanno fatto iniziare con emacs (specialmente con C / C ++)! Il nostro sistema di compilazione è molto complicato e #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 etagsdi generare tag compatibili con emacs, ma non esiste un make ggtagsequivalente. Quindi, sono bloccato con etags per ora. Qualche idea?
Cheezy

Hmm capisco. La situazione ora è più complicata. Hai detto che ggtagsnon è possibile generare tag, ma hai usato semplicemente gtagssulla riga di comando nella radice del progetto? Dovresti provare questo e invocare di nuovo ggtags. Non dovrebbe esserci make ggtagsperché il vero comando è gtags; ggtagsè solo un nome di pacchetto di Emacs che lo utilizza. Un'altra opzione è che puoi usare i tag ; ggtagspuò anche riconoscere i ctagstag ed è anche veloce. È possibile generare tag ctags quando si richiama ggtags-create-tagse richiede l'utilizzo del ctagsclient.
Ma Do,

Ad ogni modo, se gtagsnon 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 ggtagsper creare tag nella directory corrente, non nella radice del progetto. Esegui il comando gtagsnella radice del progetto o quando ti ggtagschiede dove generare, vai alla radice del progetto e andrà tutto bene.
Ma Do,

Ho verificato la tua dichiarazione (tutti i programmi di tag possono generare solo dalla radice del progetto nella struttura ad albero). make etagsfunziona perché chiama etags dopo aver valutato dove .hvivono tutti i file.
Cheezy

Risposte:


2

Per il tuo caso d'uso, c'è comunque speranza. Dal momento che si utilizza etags, può essere utilizzato con helm-etags-selectil comando integrato Helm. Per usarlo, basta seguire questi passaggi:

  • Innanzitutto, esegui il comando per generare il file TAGS.
  • In secondo luogo, utilizzare find-tagper alimentarlo a Emacs; se il file TAGS è troppo grande ed Emacs ti chiede di confermare, accettalo. L'intero file TAGS verrà caricato in Emacs e non sarà più necessario ricaricare.
  • Infine, esegui semplicemente helm-etags-selectqualsiasi simbolo sul tuo Emacs. Se esiste una sola definizione nel tuo progetto, salta all'istante; in caso contrario, visualizzare un buffer Helm tra cui scegliere.

Per il completamento, poiché si dispone di un database di tag di grandi dimensioni, non si desidera utilizzare auto-completeo companypopup perché bloccherebbe Emacs. In tal caso, puoi usare helm-company ; sostituisce il companypopup con il buffer Helm. Puoi semplicemente aggiungerlo al tuo 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)

2
ha funzionato bene! l'utilizzo di helm e la disabilitazione del back-end dei tag per l'azienda hanno migliorato notevolmente le prestazioni. La tua guida sul timone mi ha commutato da ido a proposito!
sfacciato

È

1
@Dmitry bene quando hai migliaia di candidati che hanno bisogno di essere elencati, quindi blocca Emacs.
Ma Do,

1
@TuDo Non è una buona spiegazione. Mentre il recupero di così tanti candidati può richiedere del tempo, visualizzarli (e navigare nell'elenco, cercare, ecc.) È molto scattante anche con 8000 articoli. Semplicemente non ho una combinazione progetto / backend che tornerebbe di più, da testare.
Dmitry,

1
Aggiornamento: 30000 è anche scattante, l'unico ritardo percepibile si verifica prima dell'apertura del popup.
Dmitry,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.