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 blah
manuel 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.
make tags
Kernel 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ı.