Bagaimana cara melompat ke fungsi panggilan?

14

Setelah membuat file tag dengan exuberant-ctagssaya bisa melompat dari panggilan fungsi ke deklarasi <C-]>yang dengannya cukup nyaman.

Pertanyaan saya adalah bagaimana melakukannya dengan cara lain? Ketika kursor saya berada pada definisi fungsi, bagaimana saya bisa pergi ke baris di mana fungsi dipanggil?

Ketika saya melihat file yang dihasilkan oleh ctags saya hanya melihat informasi yang terkait dengan lokasi definisi dan bukan dari panggilan, apakah itu berarti saya tidak bisa melakukan itu, bahwa Vim sebagai solusi cerdas atau bahwa saya perlu menggunakan sesuatu selain itu exuberant-ctags?

statox
sumber
Ack atau Ag juga akan bekerja dan Anda dapat menemukan pembungkus plugin untuk alat-alat baris perintah ini dengan cukup mudah. Misalnya github.com/mileszs/ack.vim dan github.com/rking/ag.vim
dash-tom-bang

Jawaban:

11

Anda tidak dapat melompat berfungsi dengan panggilan ctags. Untuk C / C ++ dan Java ada cscope, dan terintegrasi dengan baik dengan Vim (lihat :help cscope). Untuk bahasa lain Anda mungkin dapat menemukan alat yang menghasilkan / mengekspor cscope-kompatibel database (fi hscopeuntuk Haskell, dan starscopeuntuk Ruby, Go, dan JavaScript). Anda juga dapat menggunakan cscopedengan basis data global GNU , dengan menunjuk cscopeprgke gtags-cscope.

Di samping catatan: jika Anda tidak menunda dengan sesekali membingungkan penggunaan Engrish,; ) Anda mungkin juga ingin menggunakan universal-ctag bukan exuberant-ctags. Yang terakhir belum diperbarui dalam beberapa tahun. Yang pertama adalah garpu yang dipelihara secara aktif.

Sato Katsura
sumber
Apakah cscope mendukung bahasa lain selain C / C ++ dan Java?
edi9999
@ edi9999 cscopesendiri mendukung C / C ++, Lex, dan Yacc. Dukungan untuk Java sedikit berguna. Anda bisa mendapatkan dukungan untuk PHP (gaya lama) dan JavaScript dari GNU global, melalui gtags-cscopeutilitas. Dan, seperti yang saya katakan di atas, ada pengindeks lain yang dapat mengekspor cscopedatabase yang kompatibel.
Sato Katsura
8

Anda tidak dapat melakukannya dengan ctags.

Coba alternatif yang lebih keren seperti cscope (yang bahkan memiliki bagian bantuan sendiri:) :help cscopeatau global .

romainl
sumber
Apakah cscope mendukung bahasa lain selain C / C ++ dan Java?
edi9999
Ya, setidaknya PHP dan JavaScript.
romainl
1
@romainl Tidak, cscopeitu sendiri tidak mendukung PHP, atau JavaScript. Namun Anda dapat mengindeks file PHP dan JavaScript dengan GNU global, kemudian jalankan gtags-cscopeuntuk menggunakan gtagsfile yang dihasilkan dengan cscope.
Sato Katsura
@SatoKatsura, ya, cscope mendukung JavaScript (dan CSS, sepertinya).
romainl
2
@romainl Anda harus mempertimbangkan melihat cscope's sumber bukannya berspekulasi berdasarkan percobaan cepat. cscopememiliki parser C yang agak santai. Hanya itu yang dimilikinya, dan semua itu dilakukannya. Dengan parser itu "mendukung" banyak bahasa, untuk nilai "dukungan" yang sesuai. Konstruk dikenali asalkan lebih atau kurang mirip dengan C. Itulah mengapa kelas Java dan konstruk PHP baru tidak dikenali. Bandingkan fi dengan starscope , yang sebenarnya memungkinkan penambahan bahasa baru.
Sato Katsura
8

Anda bisa menggunakan perintah grim Vim untuk mencari semua file di proyek Anda:

:grep! "\<<cword>\>" . -r
:copen

Mari kita letakkan itu di keybind:

nnoremap <F4> :grep! "\<<cword>\>" . -r<CR>:copen<CR>

Saya menemukan pencarian satu proyek kunci ini sangat berharga ketika saya menjelajahi basis kode besar yang tidak dikenal.

\<dan \>merupakan urutan regexp yang menunjukkan awal dan akhir kata, sehingga Anda tidak akan mendapatkan kecocokan sebagian. ( -wOpsi untuk grep mungkin merupakan cara lain untuk mencapai ini.)

Namun, ini adalah pencarian yang tidak cerdas , sehingga dapat menghasilkan false-positive jika kata yang sama muncul dalam konteks yang tidak terkait.


Sejujurnya, saya menggunakan versi grep.vim plugin saya yang sudah dimodifikasi sendiri . Ini sedikit ramah untuk digunakan:

  • Ini memungkinkan Anda mengedit pola pencarian, dan juga grep commandline (sehingga Anda dapat menargetkan folder tertentu seperti src/ lib/bukan .) dan mengingat perubahan.
  • Saya menambahkan dukungan untuk csearch Google . Ini bisa jauh lebih cepat daripada grep karena ini membangun indeks kata daripada memindai setiap file setiap kali. Khususnya, csearch menggunakan standar regexp yang sedikit berbeda, jadi \bharus digunakan daripada \<dan \>.

Saya mengkonfigurasinya dan mengecualikan beberapa file standar seperti ini .

Untuk akses cepat, saya membuat dua keybinds . F3memungkinkan saya mengedit commandline, F4menggunakan commandline yang sebelumnya dikonfigurasi tanpa penekanan tombol tambahan. Mekanismenya sangat jelek, dan bisa menggunakan beberapa pembersihan, tetapi ini telah membantu saya dengan baik.

joeytwiddle
sumber