Pergunta

Eu uso principalmente vim / gvim como um editor e estou olhando para usar uma combinação de lxr (a referência Linux Cross) e quer cscope ou ctags para explorar a fonte do kernel. No entanto, eu não já usado tanto cscope ou ctags e gostaria de saber por que alguém poderia escolher um sobre o outro, levando em consideração o meu uso do vim como um editor principal.

Foi útil?

Solução

ctags permite duas características: o que lhe permite saltar de chamadas de função para as suas definições e completar omni. O primeiro meio que, quando você tem mais de uma chamada para um método, acertando g] ou CTRL-] irá saltar para o lugar onde esse método é definido ou implementadas. O segundo meio de recursos que quando você digita foo. ou foo->, e se foo é uma estrutura, em seguida, um menu pop-up com a conclusão campo será mostrado.

cscope também tem a primeira característica - usando set cscopetag - mas não o último. No entanto cscope também adiciona a capacidade de saltar para qualquer um dos lugares onde a função é chamada assim.

Assim, tanto quanto salto em torno de uma base de código está em causa, ctags só vai levar você para o lugar onde a função é implementada, enquanto cscope pode mostrar onde a função é chamada também.

Por que você iria escolher um sobre o outro? Bem, eu uso ambos. ctags é mais fácil de configurar, mais rápido para executar e se você só se preocupam com saltar de uma maneira que irá mostrar-lhe menos linhas. Você pode apenas executar :!ctags -R . e g] simplesmente funciona. Ele também permite que coisa completa omni.

Cscope é ótimo para, bases de código desconhecidos maiores. A configuração é uma dor porque cscope precisa de um arquivo contendo uma lista de nomes de arquivos para analisar. Também no vim, por padrão, não há atalhos de teclado configurado - você precisa executar :cscope blah blah manualmente

.

Para resolver o problema punho Eu tenho um cscope_gen.sh script que se parece com isso:

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

Isto procura por código que eu estou interessado, cria a lista cscope.files e cria o banco de dados. Dessa forma eu posso correr! ": Cscope_gen.sh". Em vez de ter que lembrar de todo o conjunto até etapas

I Mapa Pesquisar cscope a ctrl-espaço x 2 com esse trecho, o que atenua o outro infortúnio de cscope:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

este cscope_maps.vim plug-in que configura um monte de ligações semelhantes. Eu nunca consigo lembrar o que todas as opções significa, por isso, tendem a manter a ctrl-espaço.

Portanto, para concluir: ctags é mais fácil de configurar e principalmente trabalha sem fazer muito mais, é vital para omni-completo também. cscope oferece mais recursos se você tem que manter um grande e praticamente desconhecido base de código, mas exige um trabalho mais perna.

Outras dicas

Eu estava na mesma situação há alguns meses ...

A falta de precisão de ctags é uma dor em um .., e acho cscope muito melhor para todas as macros coisas relacionadas (e há um monte de macros no kernel linux) ..

sobre o uso, isso é realmente simples ... basta digitar cscope -R na raiz do seu kernel e, em seguida, você não tem nada com que se preocupar .. (quero dizer, se você quiser apenas para explorar que é perfeito .. .)

Em seguida, as teclas são todos baseados em Ctrl- \ (você pode remapear-lo se você é alérgico a Ctrl), você principalmente utilização s e g ....,

O desenvolvimento do kernel, eu não preciso de tanto a conclusão ....

De qualquer forma, ir para cscope, este é muito mais conveniente e preciso.

Hmm ... Você provavelmente deve usar etags em vez de ctags ...

Se você usar cscope, então você pode ver cadeias de chamadas, ou seja, que chama essa função e que funciona faz isso chamada de função?

Eu não tenho certeza se isso pode ser feito usando etags / ctags ...

Isso é apenas um recurso ... o que sobre encontrar o arquivo que contém a definição de função particular? Isso você começa apenas em cscope.

Eu uso ambos cscope e etags, ambos são bons para coisas diferentes, especialmente quando se trabalha com uma grande base de código, como o Kernel Linux. Na verdade, eu comecei a usar cscope e etags quando comecei a trabalhar com o Linux Kernel / Xen.

LXR não é grande, porque você tem que clicar, passar por cima da rede, etc., ao passo que você pode construir as bases de dados cscope e tags em seu código do kernel e não tem que passar por cima da rede (ao contrário de LXR).

sugerem o uso gtags globais. Poderia usar vim plug-in gen_tags para integrar gtags com o vim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top