Bisakah saya beralih ke deklarasi fungsi atau definisi dalam beberapa proyek file sumber C ++?


15

Bisakah saya beralih ke deklarasi fungsi atau definisi dalam beberapa proyek file sumber C ++?

Katakanlah saya memiliki file header foo.hpp:

int bar();

dan file sumber foo.cpp:

#include "foo.hpp"
int bar() { return 42; }

dan file utama main.cpp:

#include "foo.hpp"
int main() { bar(); return 0; }

Bisakah vim menemukan definisi dan deklarasi fungsi bar()dari mainfungsi?

Jawaban:


15

Ctag riang adalah cara paling sederhana untuk mencapai ini. Di bawah GNU / Linux (misalnya Ubuntu atau Debian) Anda seharusnya bisa melakukannya

sudo apt-get install exuberant-ctags

(Untuk OSX "$ brew install ctags" sudah cukup; untuk Windows Anda mungkin ingin mengunjungi http://ctags.sourceforge.net/ dan mengunduh standalone yang dapat dieksekusi)

Kemudian arahkan ke folder root proyek Anda dan jalankan

ctags -R --exclude=.git .

Ini akan memindai seluruh proyek Anda dan membuat file ./tags yang vim akan secara otomatis gunakan untuk memberi Anda kemampuan untuk melompat ke fungsi dengan menekan tombol. Yaitu:

Ctrl + ]

dengan kursor Anda ditempatkan pada fungsi yang Anda ingin lihat implementasinya. Ada kombinasi lain dan banyak fungsi mode perintah yang memungkinkan Anda menavigasi kode Anda dengan ctag juga (misalnya Ctrl+ tuntuk melompat ke entri tumpukan tag yang lebih lama). Lihat :help 29.1ikhtisar.

Perhatikan bahwa Anda harus menjalankan ulang ctag untuk setiap perubahan signifikan dalam kode dan membiarkannya mengindeks ulang proyek Anda. Anda dapat melakukannya secara manual, atau mengajarkan vim untuk melakukannya dengan hotkey atau menulis.

Petunjuk: jika Anda menggunakan ctag secara ekstensif, mungkin plugin vim-taglist ( http://vim-taglist.sourceforge.net ) juga layak untuk dilihat. Ini memberi Anda garis besar gaya IDE dengan daftar semua fungsi untuk kelas / file itu.


Dua hal yang perlu diketahui: ctag universal dalam banyak hal menggantikan ctag yang gembira. Juga, cara membiarkan git
menyinkronkan

4

Sejauh ini saya dapat menyebutkan dua solusi untuk masalah menemukan baik deklarasi atau definisi fungsi. Saya tahu ada solusi berbasis tag yang sudah diketahui, tetapi karena saya tidak menggunakannya, saya akan membiarkan orang lain memberikannya kepada Anda.

Yang lebih trendi pertama: YouCompleteMe memiliki :GoToDefinitiondan :GoToDeclarationsepasang perintah.

Yang saya gunakan (sulit untuk mengubah 10 tahun kebiasaan lama). Saya lh-tag Plugin memiliki cara untuk menghasilkan database ctags dan memperbaruinya secara bertahap. Dan itu juga menawarkan cara ( CTRL+W Meta+Down) untuk menyajikan semua deklarasi dan definisi yang cocok dengan apa yang ada di bawah kursor (/ apa yang dipilih). Karena solusi ini bergantung pada ctag, itu tidak akan dapat mengetahui yang mana pengenal yang berlebihan di bawah kursor benar-benar terkait juga. Solusi berbasis ctag lainnya harus sama buruknya (/ sebagus) dengan topik ini. Namun YCM harusnya jauh lebih baik di sini.

Discl .: Saya menerapkan lh-tag sebagai alternatif yang lebih ergonomis :tselect.

(Sebenarnya saya ingat solusi ketiga: Saya sudah memulai garpu clang-indexer dan plugin vim terkait yang akan merangkumnya. Tetapi dengan YCM sekitar, saya akan melupakan solusi ini)

EDIT: Pada 2019, solusi paling efisien bergantung pada server LSP . Saya menggunakan COC + ccls untuk mengindeks, melompat dan melakukan banyak hal lagi. Saya kembali ke solusi berbasis tag ketika saya terlalu malas untuk mengkonfigurasi COC untuk proyek di mana saya tidak akan menghabiskan banyak waktu atau di mana saya tidak dapat menginstal clang dan ccl versi terbaru.


1
Terima kasih atas masukannya, akan menguji setiap solusi. Saya menguji YouCompleteMe dan hanya GoToDeclarationberfungsi dengan beberapa file sumber. Berikut adalah kutipan dari dokumentasi tentang GoToDefinition: For C-family languages this only works ... when the definition of the symbol is in the current translation unit.. Juga, perintahnya adalah :YcmCompleter GoTo*.
Allan Hasegawa

Saya melewatkan baris ini. Itu berarti bahwa clang_indexer mungkin masih berguna. Solusi lain mungkin agak sulit untuk dipasang. Jangan ragu untuk mengirim saya email jika perlu.
Luc Hermitte

3

Ada beberapa alternatif. Yang pertama adalah ctags. Jika Anda memerlukan pengindeks yang lebih maju maka cscopemerupakan alternatif yang lebih baik. Misalnya itu akan memungkinkan Anda untuk membuat daftar semua penelepon dari fungsi yang diberikan. Alat-alat ini akan mengindeks kode Anda tanpa benar-benar memahaminya dengan benar (mereka memiliki definisi tata bahasa sederhana untuk mengetahui apa arti simbol yang diberikan). Ini juga relatif mudah untuk memperluas tata bahasa itu. The taglistPlugin adalah harus memiliki untuk ini dan itu mungkin untuk memperpanjang pengindeks tata bahasa untuk menunjukkan hasil di taglist.

Jika Anda membutuhkan sesuatu yang lebih dari pengindeks kemudian seperti memeriksa sintaks maka YouCompleteMemungkin cara untuk pergi. Itu dibangun di atas llvmdan dengan demikian memiliki parser yang tepat. Ini memungkinkan untuk memeriksa sintaks dan semantik kode .

Kemudian jika Anda bekerja dengan kode yang memiliki bahasa khusus domain atau kode yang disematkan maka Anda sering berakhir hanya dengan melihat-lihat file. Alternatif adalah Ackskrip perl yang mencoba membantu dengan tugas ini.


0

Saya pikir ctag itulah yang Anda butuhkan. Vim terintegrasi dengan ctag secara asli, dan dapat dengan mudah melompat ke definisi dan deklarasi fungsi.

Lihatlah artikel ini http://andrew.stwrt.ca/posts/vim-ctags


Silakan tambahkan ringkasan dari posting terkait. Jawaban khusus tautan menjadi tidak berguna saat tautan mati.
muru
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.