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 blah
secara manual.
Untuk mengatasi masalah pertama, saya punya skrip bash cscope_gen.sh
yang 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.
make tags
di 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.cscopetag
(cst
) untuk membuat:tag
danCTRL-]
memerintahkan pencarian melalui cscope terlebih dahulu, kemudian beri tagg C-]
, vim akan menampilkan daftar tag yang cocok dengan namanya. Anda masih harus menemukan definisi yang tepat yang Anda cari secara manual.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.
sumber
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).
sumber
Sarankan gunakan gtag global. Bisa menggunakan plugin vim gen_tags untuk mengintegrasikan gtags dengan vim.
sumber