TLDR: Eu tenho um grande arquivo de tags que é carregado várias vezes por sessão, tornando-o inutilizável. Não é possível encontrar a fonte do problema ou como desabilitá-lo - o objetivo principal é pular para as tags, mas a conclusão seria boa
Recentemente, publiquei no subreddit emacs e um usuário recomendou que eu ingresse neste grupo porque também é amigável para iniciantes.
Eu tenho usado o emacs como um IDE C ++, e estou lentamente corrigindo coisas que são irritantes. Estou essencialmente usando o arquivo emacs.d do redguardtoo .
Eu tenho um arquivo de tags com 225 MB (1,6 milhões de tags). Minha intenção para a tag não é necessariamente a conclusão (usando company
), mas mais para pular o código-fonte. Estou trabalhando com uma base de código desconhecida e muitas vezes preciso ver definições de macro ou classe.
Quando começo a digitar, em momentos aleatórios, vejo uma mensagem no minibuffer
Making tag completion table for [tag file]...0-100%
Em seguida, uma caixa de listagem pop-up é exibida com opções de preenchimento automático.
Como esse arquivo de tags é muito grande e não parece que o carregamento seja assíncrono, ele congela o emacs por cerca de um minuto. Isso também acontece várias vezes por sessão (com o mesmo arquivo e com outros arquivos no mesmo diretório que usam o mesmo arquivo de tag)!
Questões
- Alguém sabe o que está inicializando o carregamento da tabela de tags para conclusão e como desativá-lo? Eu fiz um grep no meu diretório emacs.d para "Concluindo a Marcação" e não encontrei nada (observe, IIRC as marcações de carregamento estavam presentes, independentemente do uso
company
ouauto-complete
- A conclusão seria legal, mas eu aceitaria apenas a capacidade de pular para o local da tag. Existe uma maneira de conseguir isso?
- Qual é a mentalidade a seguir ao abordar problemas como esse? Eu gostaria de poder solucionar problemas por conta própria da próxima vez.
informação adicional
Modos secundários ativados (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
é 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
fonte
#include "..."
pode viver em vários lugares que não são conhecidos até o momento da compilação. Portanto, o ggtags não seria capaz de gerar tags para muitos dos arquivos. Atualmente, nossas ferramentas de criação nos permitemmake etags
gerar tags compatíveis com o emacs, mas não hámake ggtags
equivalente. Então, eu estou preso com etags por enquanto. Alguma ideia?ggtags
que não pode gerar tags, mas você usou plaingtags
na linha de comando na raiz do projeto? Você deve tentar isso e chamar o ggtags novamente. Não deveria havermake ggtags
porque o comando real égtags
;ggtags
é apenas um nome de pacote do Emacs que o utiliza. Outra opção é que você pode usar ctags ;ggtags
também pode reconhecerctags
tags e também é rápido. Você pode gerar tags ctags ao invocarggtags-create-tags
e ele solicita o uso doctags
cliente.gtags
não pudesse saber sobre esses detalhes, não acho que o built-inetags
(vem com o Emacs) ouctags
(eu liguei acima) seria capaz de fazê-lo. Eu acho que você só usaggtags
para criar tags no diretório atual, não na raiz do projeto. Execute o comandogtags
na raiz do projeto ou, quandoggtags
perguntar onde gerar, navegue até a raiz do projeto e você ficará bem.make etags
funciona porque chama etags depois de avaliar onde todos os.h
arquivos estão.Respostas:
Para o seu caso de uso, ainda há esperança. Desde que você usa
etags
, ele pode ser usado comhelm-etags-select
o comando interno Helm. Para usá-lo, basta seguir estas etapas:find-tag
para alimentá-lo no Emacs; se o arquivo TAGS for muito grande e o Emacs solicitar que você confirme, aceite-o. Todo o seu arquivo TAGS será carregado no Emacs e não será mais necessário recarregar.helm-etags-select
em qualquer símbolo no seu Emacs. Se existir apenas uma definição no seu projeto, pule instantaneamente; caso contrário, exiba um buffer de leme para você escolher.Para concluir, como você possui um grande banco de dados de tags, não gostaria de usar
auto-complete
oucompany
pop-up, pois congelaria seu Emacs. Nesse caso, você pode usar helm-company ; ele substitui ocompany
pop - up pelo buffer Helm. Você pode simplesmente adicioná-lo ao seuc-mode-hook
ouc++-mode-hook
:fonte