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.
Qual é a diferença (por exemplo, em termos de recursos) entre
etags
,ebrowse
,exuberant ctags
,cscope
,GNU Global
eGTags
? O que preciso fazer para usá-los no Emacs ?Preciso do semântico / senador (CEDET) se quiser usar tags para navegar / preencher automaticamente os símbolos?
O que a semântica traz para a mesa além desses diferentes utilitários de tag? Como ele se relaciona com essas ferramentas?
emacs
cscope
cedet
gnu-global
Amelio Vazquez-Reina
fonte
fonte
GTags
projeto ao qual você vinculou está morto. Se alguém está falando sobregtags
, provavelmente está se referindo ao GNU Global.Respostas:
Essa é uma boa pergunta, conforme li recentemente aqui, então tentarei explicar a diferença com mais detalhes:
Ponto 1:
etags
ectags
ambos 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 vantagemctags
seria 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:
ctags
um 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)
cscope
permite que você:Não deve ser nenhuma surpresa para ninguém neste ponto, que quando eu lido com projetos C / C ++ eu faço uso pesado
cscope
e me importo muito poucoctags
. 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:
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
etags
ecscope
, 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
global
eebrowse
, mas se a memória não me falha, eles fizeram uso de etags.fonte
cscope
no Emacs? Eu li sobrexcscope.el
no EmacsWiki aqui, mas não consegui encontrar um link para o arquivo. Além disso, qual.el
arquivo você usa para obter ocscope
Emacs?xcscope.el
está localizado emcscope/contrib/xcscope/
(estando no pacote de distribuição). É isso que eu uso.semantic
compara comcscope
? Em termos de navegação pelo código-fonte, a semântica fornece alguma funcionalidade quecscope
não? Você usa os dois?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?Vou tentar adicionar algumas explicações a 1.
O que é isso?
Comparação
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:
Uso:
(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.
Com as combinações, você pode usar cscope para 41 idiomas.
Boa sorte!
fonte
Os arquivos TAGS contêm definições
Um
TAGS
arquivo 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: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
etags
ectags
. Emacs 'ctags
é apenasetags
com 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
jsctags
ehasktags
.Outros formatos de arquivo
ebrowse
é um programa C fornecido com o Emacs. Ele indexa o código C / C ++ e gera umBROWSE
arquivo. ebrowse.el fornece a definição e o preenchimento habituais de localização. Você também pode abrir oBROWSE
arquivo 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
,GRTAGS
eGPATH
arquivo. Você pode gerar esses arquivos com ogtags
comando, 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.
fonte
[resposta atualizada de shigio ]
Tentarei adicionar algumas explicações à parte 1 da pergunta.
O que é isso?
TAGS
arquivo que é o formato de arquivo de tag do Emacs . Você pode usar um arquivo Etags com oetags.el
qual faz parte do Emacs.Ctags
é o termo genérico para qualquer coisa que pode gerar umtags
arquivo, que é o formato de arquivo de tag nativo para Vi. Ctags universais (também conhecidos comoUCtags
Ctags Exuberantes) também podem gerar Etags com a-e
opção.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 .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
grep
mecanismo de busca semelhante.less
(pager), Doxygen e qualquer navegador da web.gtags.el
por 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 :
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!
fonte
--with-exuberant-ctags=...
quando agora, a partir de 2019, há uma--with-universal-ctags
opção. Isso deve ser alterado para o último?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:
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.
fonte