“Fazendo a tabela de conclusão de tags” Congela / bloqueia - como desativar

8

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

  1. 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 companyouauto-complete
  2. A conclusão seria legal, mas eu aceitaria apenas a capacidade de pular para o local da tag. Existe uma maneira de conseguir isso?
  3. 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
cheezy
fonte
1
Para pular para definições / referências, você pode usar o GNU Global com ggtags / helm-gtags. Garantia de trabalhar em grandes projetos como o kernel Linux sem demora. Você pode consultar o meu guia C / C ++ . Cobri a navegação de código (pule para definição / referências), conclusão de código, suporte a compilação e depuração. Eu já criei uma configuração demo para brincar, então você só precisa percorrer os recursos sem configurar nada.
Tu Do
Seus guias foram os que me deram início ao emacs (especialmente com o C ++)! Nosso sistema de compilação é muito complicado e #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 permitem make etagsgerar tags compatíveis com o emacs, mas não há make ggtagsequivalente. Então, eu estou preso com etags por enquanto. Alguma ideia?
cheezy
Ah, entendi. A situação é mais complicada agora. Você mencionou ggtagsque não pode gerar tags, mas você usou plain gtagsna linha de comando na raiz do projeto? Você deve tentar isso e chamar o ggtags novamente. Não deveria haver make ggtagsporque o comando real é gtags; ggtagsé apenas um nome de pacote do Emacs que o utiliza. Outra opção é que você pode usar ctags ; ggtagstambém pode reconhecer ctagstags e também é rápido. Você pode gerar tags ctags ao invocar ggtags-create-tagse ele solicita o uso do ctagscliente.
Tu Do
De qualquer forma, se gtagsnão pudesse saber sobre esses detalhes, não acho que o built-in etags(vem com o Emacs) ou ctags(eu liguei acima) seria capaz de fazê-lo. Eu acho que você só usa ggtagspara criar tags no diretório atual, não na raiz do projeto. Execute o comando gtagsna raiz do projeto ou, quando ggtagsperguntar onde gerar, navegue até a raiz do projeto e você ficará bem.
Tu Do
Eu verifiquei sua declaração (todos os programas de tags podem gerar apenas a partir da raiz do projeto na árvore). make etagsfunciona porque chama etags depois de avaliar onde todos os .harquivos estão.
cheezy

Respostas:

2

Para o seu caso de uso, ainda há esperança. Desde que você usa etags, ele pode ser usado com helm-etags-selecto comando interno Helm. Para usá-lo, basta seguir estas etapas:

  • Primeiro, execute o comando para gerar o arquivo TAGS.
  • Segundo, use find-tagpara 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.
  • Por fim, basta executar helm-etags-selectem 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-completeou companypop-up, pois congelaria seu Emacs. Nesse caso, você pode usar helm-company ; ele substitui o companypop - up pelo buffer Helm. Você pode simplesmente adicioná-lo ao seu c-mode-hookou 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
fonte
2
funcionou bem! usar o leme e desabilitar o back-end de tags da empresa melhorou significativamente o desempenho. Seu guia no leme mudou-me de ido btw!
cheezy
Ótimo ouvir isso :)
Tu Do
1
@ Dmitry bem, quando você tem milhares de candidatos que precisam ser listados, então bloqueia o Emacs.
Tu Do
1
@TuDo Essa não é uma boa explicação. Embora a busca por tantos candidatos possa levar algum tempo, exibi-los (e navegar na lista, pesquisar etc.) é muito rápida, mesmo com 8000 itens. Eu simplesmente não tenho uma combinação de projeto / back-end que retornaria mais, para testar.
Dmitry
1
Atualização: 30000 também é rápida, o único atraso perceptível ocorre antes da abertura do pop-up.
Dmitry