Tags para Emacs: Relação entre etags, ebrowse, cscope, GNU Global e ctags exuberantes

102

Eu trabalho em projetos C ++ e li o guia de Alex Ott para CEDET e outros tópicos sobre tags no StackOverflow, mas ainda estou confuso sobre como o Emacs faz interface com esses diferentes sistemas de tag para facilitar o preenchimento automático, a procura de definições, a navegação do código base de código ou a visualização de doc-strings.

  1. Qual é a diferença (por exemplo, em termos de recursos) entre etags, ebrowse, exuberant ctags, cscope, GNU Globale GTags? O que preciso fazer para usá-los no Emacs ?

  2. Preciso do semântico / senador (CEDET) se quiser usar tags para navegar / preencher automaticamente os símbolos?

  3. O que a semântica traz para a mesa além desses diferentes utilitários de tag? Como ele se relaciona com essas ferramentas?

Amelio Vazquez-Reina
fonte
2
A julgar pelo tronco , o GTagsprojeto ao qual você vinculou está morto. Se alguém está falando sobre gtags, provavelmente está se referindo ao GNU Global.
Gordon Gustafson

Respostas:

71

Essa é uma boa pergunta, conforme li recentemente aqui, então tentarei explicar a diferença com mais detalhes:

Ponto 1:

etagse ctagsambos geram um arquivo de índice (também conhecido como tag / TAGS) de objetos de linguagem encontrados em arquivos de origem que permite que esses itens sejam rápida e facilmente localizados por um editor de texto ou outro utilitário. Uma tag significa um objeto de idioma para o qual uma entrada de índice está disponível (ou, alternativamente, a entrada de índice criada para esse objeto). As tags geradas por ctags são mais ricas em termos de metadados, mas o Emacs não pode interpretar os dados adicionais de qualquer maneira, então você deve considerá-los mais ou menos iguais (a principal vantagem ctagsseria seu suporte para mais idiomas). O uso principal dos arquivos de tags é procurar declarações / definições de classe / método / função / constante / etc.

cscopeé uma besta muito mais poderosa (pelo menos no que diz respeito a C / C ++ e Java). Embora opere mais ou menos com o mesmo princípio (gerando um arquivo de metadados úteis), ele permite que você faça algumas coisas mais sofisticadas, como encontrar todas as referências a um símbolo, ver onde uma função está sendo chamada, etc (você também pode encontrar definições) .

Resumindo:

ctagsum permite que você navegue para a declaração / definições de símbolo (o que alguns chamariam de pesquisa unilateral ). ctagsé uma ferramenta de uso geral útil para muitos idiomas.

Por outro lado (conforme mencionado na página do projeto) cscopepermite que você:

  • Vá para a declaração de um símbolo
  • Mostra uma lista selecionável de todas as referências a um símbolo
  • Pesquise qualquer definição global
  • Funções chamadas por uma função
  • Funções que chamam uma função
  • Procure por uma string de texto
  • Procure um padrão de expressão regular
  • Encontre um arquivo
  • Encontre todos os arquivos, incluindo um arquivo

Não deve ser nenhuma surpresa para ninguém neste ponto, que quando eu lido com projetos C / C ++ eu faço uso pesado cscopee me importo muito pouco ctags. Ao lidar com outras línguas, a situação seria obviamente inversa.

Ponto 2.

Para ter o autocompletar inteligente, você precisa de um verdadeiro analisador de código-fonte (como o semântico), caso contrário, você não saberá os tipos de objetos (por exemplo) em seus aplicativos e os métodos que podem ser invocados neles. Você pode ter um preenchimento automático baseado em muitas fontes diferentes, mas para obter os melhores resultados, você precisará de um analisador. O mesmo vale para o realce de sintaxe - atualmente o realce de sintaxe nos modos principais do Emacs é baseado simplesmente em expressões regulares e isso é muito frágil e sujeito a erros. Esperançosamente, com a inclusão de semântica no Emacs 23.2 (costumava ser um pacote externo antes disso), começaremos a ver mais usos para ele (como usá-lo para analisar um código-fonte de buffer para destacá-lo apropriadamente)

Já que o Emacs 24.1 semântica pode ser usado a partir da estrutura de completamento do Emacs. A maneira mais fácil de testá-lo é abrir um arquivo de código-fonte C e digitar M-TABou C-M-iobservar como a semântica se completa automaticamente para você. Para idiomas em que a semântica não está ativada por padrão, você pode adicionar a seguinte linha ao seu gancho de modo principal de escolha:

(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)

Ponto 3.

semântica traz a verdadeira consciência de código (para os poucos idiomas que ela suporta atualmente) e fecha a lacuna entre IDEs e Emacs. Realmente não faz interface com ferramentas como etagse cscope, mas não significa que você não pode usá-los juntos.

Espero que minhas explicações façam sentido e sejam úteis para você.

PS: Eu não estou muito familiarizado com globale ebrowse, mas se a memória não me falha, eles fizeram uso de etags.

Bozhidar Batsov
fonte
1
Isso é ótimo. Obrigado! Você sabe como posso usar cscopeno Emacs? Eu li sobre xcscope.elno EmacsWiki aqui, mas não consegui encontrar um link para o arquivo. Além disso, qual .elarquivo você usa para obter o cscopeEmacs?
Amelio Vazquez-Reina,
1
xcscope.elestá localizado em cscope/contrib/xcscope/(estando no pacote de distribuição). É isso que eu uso.
Bozhidar Batsov,
Mais uma pergunta: como se semanticcompara com cscope? Em termos de navegação pelo código-fonte, a semântica fornece alguma funcionalidade que cscopenão? Você usa os dois?
Amelio Vazquez-Reina
4
Não acredito que o GNU Global use etags, aliás. O IIRC mantém e consulta um banco de dados 'adequado' (em vez de varrer um arquivo de texto simples), que oferece vários benefícios de desempenho tanto para consultar quanto (especialmente) para atualizar as tags.
phils
@BozhidarBatsov Quando você disse For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>. O que esse trecho de código faz exatamente?
Amelio Vazquez-Reina
45

Vou tentar adicionar algumas explicações a 1.

O que é isso?

  • Etags é um comando para gerar o arquivo 'TAGS', que é o arquivo de tag do Emacs. Você pode usar o arquivo com etags.el que faz parte do pacote emacs.
  • Ctags é um comando para gerar o arquivo 'tags', que é o arquivo tag do vi. Agora o Exuberant Ctags pode gerar o arquivo 'TAGS' pela opção -e e oferece suporte a 41 linguagens de programação.
  • Cscope é uma ferramenta completa de navegação de código-fonte para linguagem C. Possui CUI (interface de usuário de caractere) e bancos de dados de tag (cscope.in.out, cscope.out, cscope.po.out) próprios. Você pode usar cscope do Emacs usando xcscope.el que faz parte do pacote cscope.
  • GNU GLOBAL é um sistema de marcação de código-fonte. Embora seja semelhante às ferramentas acima, ele difere delas no ponto em que depende de qualquer editor e não tem interface de usuário, exceto para linha de comando. Gtags é um comando para gerar arquivos de tag para GLOBAL (GTAGS, GRTAGS, GPATH). Você pode usar GLOBAL do emacs usando gtags.el que faz parte do pacote GLOBAL. Além disso, existem muitas bibliotecas elisp para ele (xgtags.el, ggtags.el, nothing-gtags.el, helm-gtags.el, etc).

Comparação

  • Ctags e etags tratam apenas de definições. Cscope e GNU GLOBAL tratam não apenas de definições, mas também de referências.
  • Ctags e etags usam um arquivo de tag de texto simples. Cscope e GNU GLOBAL usam bancos de dados de tag de valor-chave.
  • Cscope e GNU GLOBAL têm um mecanismo de busca semelhante ao grep e facilidade de atualização incremental de arquivos de tag.

Combinação

Você pode combinar o suporte de linguagem rica do Exuberant Ctags e a facilidade de banco de dados do GNU GLOBAL usando ctags como um analisador de plug-in do GLOBAL.

Experimente o seguinte: (requer GLOBAL-6.0, Exuberant Ctags-5.5 ou posterior, respectivamente)

Construindo GNU GLOBAL:

$ ./configure --with-exuberant-ctags=/usr/local/bin/ctags
$ sudo make install

Uso:

$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
$ export GTAGSLABEL=ctags
$ gtags                     # invokes Exuberant Ctags internally
$ emacs -f gtags-mode       # load gtags.el

(No entanto, você não pode tratar referências por este método, porque ctags não tratam referências.)

Você também pode usar cscope como um cliente GNU GLOBAL. O pacote GLOBAL inclui um comando chamado 'gtags-cscope' que é uma porta do cscope, ou seja, é o próprio cscope, exceto que usa GLOBAL como mecanismo de busca em vez do cscope.

$ gtags-cscope          # this is GLOBAL version of cscope

Com as combinações, você pode usar cscope para 41 idiomas.

Boa sorte!

Shigio
fonte
1
Para usuários do Debian e derivados como o Ubuntu: a página da web GNU GLOBAL avisa que os pacotes .deb que vêm com essas distribuições Linux estão desatualizados e não devem ser usados. No meu caso, GLOBAL estava na versão 5.7.1, e não consegui fazer gtags.el, ggtags.el ou helm-gtags.el funcionarem corretamente no Emacs 24. Compilando GNU GLOBAL 6.5 do zero, com suporte para Exuberant Ctags ( Usei 5.8) funcionou muito bem. (Obrigado pelas excelentes dicas, @shigio).
Rob
9

Os arquivos TAGS contêm definições

Um TAGSarquivo contém uma lista de onde as funções e classes são definidas. Geralmente é colocado na raiz de um projeto e tem a seguinte aparência:

^L
configure,3945
as_fn_success () { as_fn_return 0; }^?as_fn_success^A180,5465
as_fn_failure () { as_fn_return 1; }^?as_fn_failure^A181,5502
as_fn_ret_success () { return 0; }^?as_fn_ret_success^A182,5539
as_fn_ret_failure () { return 1; }^?as_fn_ret_failure^A183,5574

Isso permite que o Emacs encontre definições. A navegação básica é integrada com find-tag, masetags-select fornece uma interface do usuário mais agradável quando há várias correspondências.

Você também pode usar arquivos TAGS para autocompletar código. Por exemplo, o back-end etags da empresa usa arquivos TAGS .

Os arquivos TAGS podem ser construídos por diferentes ferramentas

ctags(anteriormente conhecido como 'ctags universais' ou 'ctags exuberantes') pode gerar arquivos TAGS e suporta a mais ampla variedade de idiomas. Ele é mantido ativamente no github.

O Emacs vem com dois programas que geram arquivos TAGS, chamados etagse ctags. Emacs ' ctagsé apenas etagscom a mesma interface CLI que ctags universais. Para evitar confusão, muitas distros renomeiam esses programas (por exemplo,ctags.emacs24 no Debian).

Existem também ferramentas específicas de idioma para gerar arquivos TAGS, como jsctagsehasktags .

Outros formatos de arquivo

ebrowseé um programa C fornecido com o Emacs. Ele indexa o código C / C ++ e gera um BROWSEarquivo. ebrowse.el fornece a definição e o preenchimento habituais de localização. Você também pode abrir o BROWSEarquivo diretamente no Emacs para obter uma visão geral das classes / funções definidas em uma base de código.

GNU Global tem seu próprio formato de banco de dados, que consiste em um GTAGS, GRTAGSeGPATH arquivo. Você pode gerar esses arquivos com o gtagscomando, que analisa o código C / C ++. Para outras linguagens, GNU Global pode ler arquivos gerados por ctags universais.

GNU Global também fornece uma interface CLI para fazer perguntas mais sofisticadas, como 'onde este símbolo é mencionado?'. Ele vem com um pacote Emacs gtags.el, mas ggtags.el também é popular para acessar bancos de dados GNU Global.

Cscope é semelhante em espírito ao GNU Global: ele analisa C / C ++ em seu próprio formato de banco de dados. Ele também pode responder a perguntas como 'localizar todos os chamadores / chamadas desta função'.

Veja também esta discussão HN comparando global e cscope .

Projetos cliente / servidor

rtags analisa e indexa C / C ++ usando um servidor persistente. Ele usa o analisador clang, portanto, lida muito bem com C ++. Ele vem com um pacote Emacs para consultar o servidor.

google-gtags era um projeto em que um grande arquivo TAGS seria armazenado em um servidor. Quando você consultasse o servidor, ele forneceria um subconjunto do arquivo TAGS que era relevante para sua pesquisa.

Semântica (CEDET)

O Semantic é um pacote Emacs embutido que contém um analisador para C / C ++, então ele também pode encontrar definições. Ele também pode importar dados de arquivos TAGS, bancos de dados csope e outras fontes. CEDET também inclui funcionalidade de estilo IDE que usa esses dados, por exemplo, geração de diagramas UML de hierarquias de classes.

Wilfred Hughes
fonte
7

[resposta atualizada de shigio ]

Tentarei adicionar algumas explicações à parte 1 da pergunta.

O que é isso?

  1. Etags gera um TAGSarquivo que é o formato de arquivo de tag do Emacs . Você pode usar um arquivo Etags com o etags.elqual faz parte do Emacs.
  2. Ctagsé o termo genérico para qualquer coisa que pode gerar um tagsarquivo, que é o formato de arquivo de tag nativo para Vi. Ctags universais (também conhecidos como UCtagsCtags Exuberantes) também podem gerar Etags com a -eopção.
  3. Cscope é uma ferramenta de navegação de código fonte de tudo-em-um para C (com menor suporte para C ++ e Java), com as suas próprias bases de dados de tag ( cscope.in.out, cscope.out, cscope.po.out) e TUI . O suporte do Cscope é integrado ao Vim; você pode usar o Cscope do Emacs usando o pacote xcscope.el . Existem também GUIs baseadas em Cscope .
  4. GNU GLOBAL (também conhecido como Gtags) é mais um sistema de marcação de código-fonte (com diferenças significativas - consulte a próxima seção), pois também gera arquivos de marcação.

Comparação

  • Ctags e Etags tratam apenas definições (de, por exemplo, variáveis ​​e funções). Cscope e Gtags também tratam referências.
  • Os arquivos de tag Ctags e Etags são planos . Os tagfiles Cscope e Gtags são bancos de dados de valores-chave mais poderosos , que permitem (por exemplo) atualização incremental.
  • Cscope e Gtags têm um grepmecanismo de busca semelhante.
  • Ctags tem suporte embutido para mais idiomas e formatos de dados: veja a lista atual no repositório de analisadores universais Ctags . UCtags também documentou como desenvolver seu próprio analisador .
  • Cscope e Gtags são independentes do editor.
  • Gtags não fornece sua própria interface de usuário, mas pode atualmente (outubro de 2016) ser usado a partir de linha de comando (CLI), Emacs e parentes, Vi e parentes, less(pager), Doxygen e qualquer navegador da web.
  • Gtags fornece gtags.elpor meio do pacote GLOBAL, mas também há muitas outras extensões elisp, incluindo xgtags.el, ggtags.el, nothing-gtags.el, helm-gtags.el.

Combinação

Você pode combinar o suporte à linguagem rica do Universal Ctags com o banco de dados do Gtags e várias extensões usando o Ctags como um analisador de plug-in GLOBAL :

# build GNU GLOBAL
./configure --with-exuberant-ctags=/usr/local/bin/ctags
sudo make install

# use it
export GTAGSCONF=/usr/local/share/gtags/gtags.conf
export GTAGSLABEL=ctags
gtags                     # invokes Universal Ctags internally
emacs -f gtags-mode       # load gtags.el

Observe novamente que se você usar Ctags como o analisador para seus Gtags, você perderá a capacidade de tratar referências (por exemplo, uso de variável, chamadas de função) que os Gtags forneceriam de outra forma. Essencialmente, você troca o rastreamento de referência do Gtags pelo maior suporte de linguagem integrado do Ctags.

Você também pode usar Cscope como um cliente de Gtags: gtags-cscope.

Boa sorte!

TomRoche
fonte
Eu li: "Observe novamente que se você usar Ctags como analisador para seus Gtags, você perderá a capacidade de tratar referências (por exemplo, uso de variável, chamadas de função) que os Gtags forneceriam de outra forma. Essencialmente, você troca o rastreamento de referência dos Gtags por Maior suporte de idioma embutido do Ctags. " Isso é verdade para as ctags antigas enviadas com o Emacs ou ainda é verdade para as Ctags universais? Além disso, li "combinar a linguagem rica do Ctag Universal", mas no snippet de shell que ele usa --with-exuberant-ctags=...quando agora, a partir de 2019, há uma --with-universal-ctagsopção. Isso deve ser alterado para o último?
bgoodr
3

Na verdade, não verifiquei, mas de acordo com o manual CEDET ( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):

semantic pode usar CScope como um back end para pesquisas de banco de dados. Para habilitá-lo, use:

 (semanticdb-enable-cscope-databases)

Isso permitirá o uso de cscope para todos os buffers C e C ++.

CScope será então usado para pesquisas em todo o projeto como um backup quando pesquisas de banco de dados semânticas pré-existentes podem não ter analisado todos os seus arquivos.

Clément B.
fonte
1
Isso não parece funcionar no Emacs 24.3.1, usando o vanilla CEDET 2.0 que o acompanha (nenhum método semanticdb-enable-cscope-databases).
Rob