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.