cscope veya ctags neden birini diğerine tercih etsin? [kapalı]


131

Ben öncelikle editör olarak vim / gvim kullanmak ve bir arada kullanarak bakıyorum LXR (Linux Çapraz Referans) ve ya cscope veya ctags çekirdek kaynağını keşfetmek için. Bununla birlikte, cscope veya ctag'leri hiç kullanmadım ve vim'i birincil editör olarak kullanmamı dikkate alarak neden birinin diğerini seçebileceğini duymak istiyorum.

Yanıtlar:


157

ctags iki özelliği etkinleştirir: işlev çağrılarından tanımlarına atlamanıza olanak tanır ve çok amaçlı tamamlama. İlki, bir yönteme yapılan bir çağrının üzerindeyken, o yöntemin tanımlandığı veya uygulandığı yere vurmak g]veya CTRL-]bu yere atlamak anlamına gelir . İkinci özellik, foo.veya yazdığınızda foo->ve foo bir yapı ise, alan tamamlama ile bir açılır menü görüntüleneceği anlamına gelir.

cscope ayrıca ilk özelliğe sahiptir - kullanma set cscopetag- ama sonuncu değil. Bununla birlikte, cscope ayrıca bir işlevin çağrıldığı yerlerden herhangi birine atlama yeteneği ekler.

Bir kod tabanının etrafında atlama söz konusu olduğunda, ctag'ler sizi yalnızca işlevin uygulandığı yere götürür, oysa cscope size bir işlevin nerede çağrıldığını da gösterebilir.

Neden birini diğerine tercih ettin? Ben ikisini de kullanıyorum. ctags daha kolay kurulur, daha hızlı koşar ve sadece bir yönden atlamayı önemsiyorsanız, size daha az çizgi gösterecektir. Sadece koşabilirsin :!ctags -R .ve g]çalışır. Aynı zamanda bu çok yönlü tam şeyi sağlar.

Cscope daha büyük, bilinmeyen kod tabanları için harikadır. Kurulum bir acıdır çünkü cscope, ayrıştırılacak dosyaların adlarının bir listesini içeren bir dosyaya ihtiyaç duyar. Ayrıca vim'de varsayılan olarak ayarlı bir tuş bağlama yoktur - :cscope blah blahmanuel olarak çalıştırmanız gerekir.

İlk problemi çözmek için cscope_gen.shşuna benzeyen bir bash betiğim var :

#!/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

Bu ilgilendiğim kodu arar, cscope.files listesini oluşturur ve veritabanını oluşturur. Bu şekilde tüm kurulum adımlarını hatırlamak yerine ":! Cscope_gen.sh" çalıştırabilirim.

Bu kod parçacığı ile cscope aramasını ctrl-space x 2 ile eşledim, bu da cscope'un diğer düşürücüsünü azaltır:

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

Orada eklenti bu cscope_maps.vim benzer bağları bir demet kadar o setleri. Tüm seçeneklerin ne anlama geldiğini asla hatırlayamıyorum, bu yüzden ctrl-boşluğuna bağlı kalın.

Sonuç olarak: ctag'lerin kurulumu daha kolaydır ve çoğunlukla başka bir şey yapmadan çalışır, omni-complete için de hayati önem taşır. cscope, büyük ve çoğunlukla bilinmeyen bir kod tabanına sahip olmanız gerekiyorsa daha fazla özellik sağlar, ancak daha fazla çalışma gerektirir.


2
Ctag'leri daha doğru hale getirmenin bir yolu var mı? make tagsKernel root dizininde yaptım ve etrafta zıplayarak oynuyordum ve çoğu zaman yanlış yere gittim . Ctags'in c önişlemcisi ile sorunları olduğunu okudum, ancak ctag'lerin lxr'de kullanıldığını düşünürsek, kesinlikle yapılabilecek bir şey olmalı.
Robert S. Barnes

2
Derin makro voodoo varsa, ctag'ler muhtemelen başarısız olacaktır :-( Ben çoğunlukla C ++ şeyler için kullanıyorum, ki bu da işlerin o tarafına daha az bağlı (kendi sorunları var ...)
richq

12
set cscopetag( cst) yapmak :tagve CTRL-]komutlar sonra, ilk cscope yoluyla etiketleri arama
Hasturkun

1
Ayrıca, ctags yinelemeli aramada oldukça yavaştır, "ctags -L cscope.files" kullanmak etiket oluşturmanızı önemli ölçüde hızlandıracaktır.
Aaron H.

1
@ RobertS.Barnes bir çeşit çözüm kullanıyor g C-], vim size isimle eşleşen etiketlerin listesini gösterecek. Yine de manuel olarak aradığınız doğru tanımı bulmanız gerekecek.
Hubert Kario

15

Birkaç ay önce aynı durumdaydım ...

Ctag'lerin kesinlik eksikliği bir ağrıdır ve makrolarla ilgili tüm şeyler için cscope'u çok daha iyi buluyorum (ve linux çekirdeğinde bir sürü makro var) ..

kullanımla ilgili olarak, bu aslında basittir ... sadece çekirdeğinizin köküne cscope -R yazarsınız ve sonra endişelenecek bir şeyiniz olmaz .. (Yani sadece keşfetmek istiyorsanız, bu mükemmel ...)

Ardından, anahtar bağlamalarının tümü Ctrl- \'ye dayanır (Ctrl'ye alerjiniz varsa yeniden eşleştirebilirsiniz), esas olarak s ve g .... kullanırsınız,

Çekirdek için geliştirme yaparken, tamamlanmaya çok ihtiyacım yoktu ...

Her neyse, cscope'a gidin, bu çok daha uygun, doğru.


4
<< çekirdeğinizin köküne sadece cscope -R yazarsınız .... Çekirdeğin altına "make cscope" yazmanız daha iyi olur, aksi takdirde Linux çekirdeğinde bulunan tüm Mimariler ve dolayısıyla aynı C sembolünün çoklu tanımları ile sonuçlanırsınız.
kumar

4

Hmm ... Muhtemelen ctag yerine etag kullanmalısınız ...

Cscope kullanırsanız, çağrı zincirlerini görebilirsiniz, yani bu işlevi kim çağırır ve bu işlev hangi işlevleri çağırır?

Bunun etags / ctags kullanılarak yapılıp yapılamayacağından emin değilim ...

Bu sadece bir özellik ... belirli bir fonksiyon tanımını içeren dosyayı bulmaya ne dersiniz? Bu sadece cscope'ta elde edilir.

Kullandığım hem cscope ve ETAGların, böyle çekirdeğe olarak, büyük bir kod temeli çalışırken özellikle farklı şeyler için hem iyi. Aslında, Linux Kernel / Xen ile çalışmaya başladığımda cscope ve etag'leri kullanmaya başladım.

LXR harika değildir, çünkü tıklamanız, ağın üzerinden geçmeniz vb . Gerekir , oysa cscope ve etiket veritabanlarını çekirdek kodunuz üzerinde oluşturabilir ve ağ üzerinden geçmek zorunda kalmazsınız (lxr'den farklı olarak).


Etags sadece emacs için değil mi? Yalnızca g / vim kullanıyorum.
Robert S. Barnes

Evet haklısın. Kılavuz sayfasından: Etags programı, emacs (1) tarafından anlaşılan bir formatta bir etiket tablosu dosyası oluşturmak için kullanılır; ctags programı vi (1) tarafından anlaşılan bir formatta benzer bir tablo oluşturmak için kullanılır.
rmk

1
İnandığım iki çeşit etag ve ctag var. Biri emacs biri, diğeri coşkulu ctags biri. İlki ilk olarak emacs için yazılmıştır, ancak vi için de kullanılabilir; ikincisi ilk olarak vi için yazılmıştır, ancak emac'ler için de kullanılabilir. Bir emacs kullanıcısı olmama rağmen ikincisini (coşkulu ctags) daha kolay buluyorum. Eğer coşkulu-ctags paketini kurarsanız, etags / ctags ikili dosyalarının bağlantıları değişecek ve farklı ikili dosyaları gösterecektir.
ustun

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.