O suporte ao emacs pode ir para a declaração de função em um projeto inteiro?

12

O emacs possui uma função ou biblioteca que pode permitir que o usuário acesse a declaração de função mesmo que tenha sido definida em outro arquivo?

Em caso afirmativo, para quais idiomas há suporte?

A inspiração para esta pergunta vem do artigo abaixo, que fala sobre algumas das razões pelas quais o emacs nunca será capaz de competir com os IDE.

http://henrikwarne.com/2012/06/17/programmer-productivity-emacs-versus-intellij-idea/

user2522280
fonte
A maneira como o emacs geralmente lida com isso é contando com programas externos compilados (como clang) para entender o código-fonte rapidamente e responder às consultas passadas pela linha de comando. Confira irony-clangpara este fim. Você leu os comentários no artigo?
Sean Allred
1
A funcionalidade fornecida pelo alchemist.el, para elixir, ou omnisharp, para C #, que dependem de programas externos para coisas de navegação / refatoração / ide-ish, são bastante semelhantes à maioria dos IDEs existentes. (pelo menos para a maioria dos casos de uso). O Emacs não está no mesmo negócio que os IDEs, então não acho razoável dizer que nunca haverá uma chance competitiva.
Renan Ranelli 19/03/2015
O @RenanRanelli IDE é da mesma maneira, exceto que precisamos fazer a integração manualmente, em vez de alguém já ter feito isso e o ter chamado de "IDE".
Tu Do
Em 2019, existe apenas uma solução que você deve considerar na minha opinião. E isso é rtags com a conclusão da empresa. Esqueça as etags ou o inchado e instável CEDET. O rtags usa informações em tempo de compilação para fornecer uma estrutura LIVE do que seu projeto está usando. global e outros são terríveis - eles são "saudações" glorificadas que fazem muita adivinhação e frequentemente o levam ao lugar errado. github.com/Andersbakken/rtags
RichieHH

Respostas:

14

Você pode pular para qualquer definição / referência de projeto inteiro do tamanho da árvore de origem do kernel Linux (mais de 36k) em um instante. Veja meu guia C / C ++ para obter detalhes. Para C / C ++, sugiro usar o GNU Global que suporte C, C ++, Yacc, Java, PHP4 e assembly.

A chave é que, se você deseja ter os recursos IDE de um idioma, é necessário instalar o plug-in desse idioma. Aqui estão alguns pacotes para linguagens dinâmicas que eu conheço:

  • Desenvolvimento web ao vivo: modo espeto .
  • Javascript: tern . Mas antes disso, lembre-se de instalar o modo js2 . Quanto ao que js2-modefaz, veja a descrição ; mas, em essência, js2-modeé um analisador Javascript completo que gera um AST para executar os recursos IDE adequados. Se você instalar o skewer-modeque você terá js2-modepor padrão, uma vez que skewer-modedepende disso.
  • Python: elpy , veja os recursos do IDE
  • Ruby: robe fornece os seguintes recursos:
  • Ir para definição de método
  • Vá para o super ou um construtor chamado no ponto
  • Ir para um módulo ou classe (desde que tenha pelo menos um método definido)
  • Exibir documentação do método
  • Exibir informações sobre o método chamado no ponto usando ElDoc
  • Conclusão de método e nome constante

Você também pode usar ctagspara suportar muitas linguagens, como shell script ou Tcl ...

Tu Do
fonte
Alguma sugestão de suíte para javascript?
user2522280
@ BarryG Há Tern e j2-modeeu editei na minha resposta.
Tu Do
2
Gostaria de apontar que essa anacondapode ser uma solução mais específica para o salto de definição em Python.
PythonNut
@TuDo Você colocou a lista de recursos de Robe no ESS.
Dmitry
Para C ++, há também rtags e ycmd . Eu uso o ycmd, que também funciona com, por exemplo, Python, C #, Go e outras linguagens. Uso o dumb-jump e o aconselhamento-rg como substituto ou para mostrar usos ou menções de um símbolo a comentários / documentos.
Unhammer
18

Eu tive um problema semelhante com o emacs, então fiz o Dumb Jump . Tentei muitas das soluções mencionadas na resposta aceita, mas sempre encontrava um ou mais dos seguintes problemas:

  • A solução funcionou apenas para uma única linguagem de programação
  • A solução exigia um arquivo de índice (TAG) ou processo persistente

Eu queria muito uma solução que "apenas funcionasse" e não exigisse personalização ou configuração. Ou seja, eu queria clonar um repositório aleatório no Github e navegar por ele como qualquer outro projeto meu.

No momento, o Dumb Jump tem suporte básico para:

  • Javascript
  • Emacs Lisp
  • Pitão
  • Ir
  • PHP
  • Rubi
  • Faust
  • R
  • Lua
  • Ferrugem
  • ...e mais

Está disponível através de questões MELPA e GitHub e PRs são mais que bem-vindos.

Jack
fonte
4

A principal solução para isso no emacs é usar arquivos TAGS, criados por programas como etags ou gtags. Eu mesmo uso (e recomendo) ctags exuberantes e etags-select.el para ajudá-lo a restringir destinos quando o símbolo de pesquisa estiver em vários destinos. Os idiomas suportados são bastante numerosos, consulte os manuais das ferramentas individuais. Existe ainda suporte para adicionar seu próprio idioma, no qual você pode fornecer uma expressão regular que instrua ctags como isolar as tags nas quais você está interessado.

InHarmsWay
fonte
1
Oh! Como eu poderia esquecer os tagsfiles? ctags -e -R *do diretório raiz o configurará para você.
Sean Allred
essa é uma solução aceitável quando o seu projeto possui muitas dependências (como os projetos mais recentes de desenvolvimento web javascript)?
precisa
O número de dependências não é em si um impedimento. Você pode ter um arquivo grande de tags que agrega muitas bibliotecas diferentes; Eu fiz isso por muitos anos, a chamada de comando ctags trivialmente faz isso. Ou o que eu recomendo agora é ter um arquivo de tags separado por dependência; O emacs é inteligente o suficiente para carregar vários arquivos de tags. Para facilitar isso, procure etags-table.el, que ajuda a carregar grupos de arquivos de tags por projeto.
InHarmsWay