cscope atau ctags mengapa memilih satu dari yang lain? [Tutup]

130

Saya terutama menggunakan vim / gvim sebagai editor dan saya sedang melihat kombinasi lxr (Linux Cross Reference) dan cscope atau ctags untuk menjelajahi sumber kernel. Namun, saya belum pernah menggunakan cscope atau ctags dan ingin mendengar mengapa seseorang dapat memilih salah satu dari yang lain dengan mempertimbangkan penggunaan vim sebagai editor utama.

Robert S. Barnes
sumber

Jawaban:

156

ctags memungkinkan dua fitur: memungkinkan Anda untuk beralih dari panggilan fungsi ke definisi mereka, dan penyelesaian omni. Yang pertama berarti bahwa ketika Anda melewati panggilan ke suatu metode, memukul g]atau CTRL-]akan melompat ke tempat di mana metode itu didefinisikan atau diimplementasikan. Fitur kedua berarti bahwa ketika Anda mengetik foo.atau foo->, dan jika foo adalah struktur, maka menu pop-up dengan penyelesaian bidang akan ditampilkan.

cscope juga memiliki fitur pertama - menggunakan set cscopetag- tetapi bukan yang terakhir. Namun cscope juga menambahkan kemampuan untuk melompat ke salah satu tempat di mana fungsi dipanggil juga.

Jadi sejauh mengenai basis kode, ctag hanya akan mengarahkan Anda ke tempat fungsi dijalankan, sedangkan cscope dapat menunjukkan kepada Anda di mana fungsi dipanggil juga.

Mengapa Anda memilih satu dari yang lain? Yah, saya menggunakan keduanya. ctag lebih mudah diatur, lebih cepat dijalankan dan jika Anda hanya peduli untuk melompat satu arah, ctag akan menunjukkan lebih sedikit garis. Anda bisa berlari :!ctags -R .dan g]bekerja saja. Ini juga memungkinkan omni menyelesaikan hal itu.

Cscope bagus untuk basis kode yang lebih besar dan tidak dikenal. Pengaturannya sangat merepotkan karena cscope membutuhkan file yang berisi daftar nama file untuk diurai. Juga di vim, secara default tidak ada binding kunci yang diatur - Anda harus menjalankannya :cscope blah blahsecara manual.

Untuk mengatasi masalah pertama, saya punya skrip bash cscope_gen.shyang terlihat seperti ini:

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

Ini mencari kode yang saya tertarik, membuat daftar cscope.files dan membuat database. Dengan begitu saya bisa menjalankan ":! Cscope_gen.sh" daripada harus mengingat semua langkah pengaturan.

Saya memetakan pencarian cscope ke ctrl-space x 2 dengan snippet ini, yang memitigasi downer lainnya dari cscope:

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

Ada plugin cscope_maps.vim ini yang mengatur sekelompok binding serupa. Saya tidak pernah bisa mengingat apa arti semua opsi, jadi cenderung menempel pada ruang ctrl.

Jadi untuk menyimpulkan: ctag lebih mudah untuk diatur dan sebagian besar bekerja tanpa melakukan banyak hal lain, ini juga penting untuk menyelesaikan-omni. cscope menyediakan lebih banyak fitur jika Anda harus mempertahankan basis kode yang besar dan sebagian besar tidak dikenal, tetapi membutuhkan lebih banyak kerja keras.

richq
sumber
2
Apakah ada cara untuk membuat ctag lebih akurat? Saya melakukannya make tagsdi direktori root kernel dan telah bermain dengan melompat-lompat dan sebagian besar waktu berakhir di tempat yang salah. Saya membaca bahwa ctag memiliki masalah dengan c preprocessor, tetapi mengingat bahwa ctag digunakan dalam lxr pasti ada sesuatu yang bisa dilakukan.
Robert S. Barnes
2
Jika ada voodoo makro dalam, lalu ctags kemungkinan akan gagal :-( Saya menggunakannya sebagian besar untuk C ++ barang-barang, yang mengandalkan kurang pada sisi hal (meskipun yang memiliki masalah sendiri ...)
richq
12
set cscopetag( cst) untuk membuat :tagdan CTRL-]memerintahkan pencarian melalui cscope terlebih dahulu, kemudian beri tag
Hasturkun
1
Juga, ctag sangat lambat dalam pencarian rekursif, menggunakan "ctag -L cscope.files" akan secara signifikan mempercepat pembuatan tag Anda.
Aaron H.
1
@ RobertS.Barnes menggunakan beberapa jenis solusi g C-], vim akan menampilkan daftar tag yang cocok dengan namanya. Anda masih harus menemukan definisi yang tepat yang Anda cari secara manual.
Hubert Kario
15

Saya berada dalam situasi yang sama beberapa bulan yang lalu ...

Kurangnya presisi ctag adalah rasa sakit di .., dan saya menemukan cscope jauh lebih baik untuk semua hal-hal terkait makro (dan ada banyak makro di kernel linux) ..

mengenai penggunaannya, itu sebenarnya mudah ... Anda cukup mengetikkan cscope -R pada akar kernel Anda dan kemudian Anda tidak perlu khawatir tentang .. (maksud saya jika Anda hanya ingin menjelajahi yang sempurna ...)

Kemudian, binding kunci semuanya didasarkan pada Ctrl- \ (Anda dapat memetakannya kembali jika Anda alergi terhadap Ctrl), Anda terutama menggunakan s dan g ....,

Mengembangkan untuk kernel, saya tidak membutuhkan banyak penyelesaian ....

Bagaimanapun, gunakan cscope, ini jauh lebih mudah, akurat.

LB40
sumber
4
<< Anda cukup mengetikkan cscope -R di root kernel Anda .... Lebih baik ketik "make cscope" di bawah kernel, jika tidak, Anda akan berakhir dengan semua Arsitektur yang ada di kernel Linux dan karenanya banyak definisi ke simbol C yang sama.
kumar
4

Hmm ... Anda mungkin harus menggunakan etag bukan ctag ...

Jika Anda menggunakan cscope, maka Anda dapat melihat rantai panggilan, yaitu, siapa yang memanggil fungsi ini & fungsi mana yang dipanggil fungsi ini?

Saya tidak yakin apakah ini dapat dilakukan menggunakan etags / ctags ...

Itu hanya satu fitur ... bagaimana dengan mengetahui file yang berisi definisi fungsi tertentu? Ini Anda dapatkan hanya di cscope.

Saya menggunakan kedua cscope dan etags, mereka berdua baik untuk hal-hal yang berbeda, terutama ketika bekerja dengan basis kode besar, seperti Kernel Linux. Sebenarnya, saya mulai menggunakan cscope dan etag ketika saya mulai bekerja dengan Linux Kernel / Xen.

LXR tidak bagus, karena Anda harus mengklik, pergi ke jaringan dll, sedangkan Anda dapat membangun cscope dan menandai basis data pada kode kernel Anda dan tidak harus melalui jaringan (tidak seperti lxr).

rmk
sumber
Bukankah etag hanya untuk emacs? Saya menggunakan g / vim secara eksklusif.
Robert S. Barnes
Ya kamu benar. Dari halaman manual: Program etags digunakan untuk membuat file tabel tag, dalam format yang dipahami oleh emacs (1); program ctags digunakan untuk membuat tabel serupa dalam format yang dipahami oleh vi (1).
rmk
1
ada dua rasa etag dan ctag yang saya percaya. Satu adalah emacs satu, yang lain adalah ctags yang bersemangat. Yang pertama ditulis untuk emacs, tetapi dapat digunakan untuk vi juga; yang kedua pertama kali ditulis untuk vi, tetapi juga dapat digunakan untuk emacs. Saya menemukan yang kedua (ctag riang) lebih mudah digunakan, meskipun saya adalah pengguna emacs. Jika Anda menginstal paket exagtant-ctags, tautan ke biner etags / ctags akan berubah, dan arahkan ke berbagai binari.
ustun
1

Sarankan gunakan gtag global. Bisa menggunakan plugin vim gen_tags untuk mengintegrasikan gtags dengan vim.

Hongbo Liu
sumber