Birden çok C ++ kaynak dosyaları projesinde bir işlev bildirimine veya tanımına atlayabilir miyim?


15

Birden çok C ++ kaynak dosyaları projesinde bir işlev bildirimine veya tanımına atlayabilir miyim?

Bir başlık dosyam olduğunu varsayalım foo.hpp:

int bar();

ve bir kaynak dosya foo.cpp:

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

ve bir ana dosya main.cpp:

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

Vim tanımı ve fonksiyon beyanı hem bulabilir bar()gelen mainfonksiyonu?

Yanıtlar:


16

Coşkulu ctags bunu başarmanın en basit yoludur. GNU / Linux (örneğin, Ubuntu veya Debian) altında

sudo apt-get install exuberant-ctags

(OSX için "$ brew install ctags" yeterli olmalıdır; Windows için http://ctags.sourceforge.net/ adresini ziyaret etmek ve bağımsız yürütülebilir dosyayı indirmek isteyebilirsiniz )

Ardından projenizin kök klasörüne gidin ve çalıştırın

ctags -R --exclude=.git .

Bu, tüm projenizi tarar ve bir tuşa basarak işlevlere atlayabilmenizi sağlamak için vim'in otomatik olarak kullanacağı bir ./tags dosyası oluşturur. Yani:

Ctrl + ]

imleciniz uygulamayı görmek istediğiniz işleve yerleştirilir. Kodunuzda ctags ile gezinmenizi sağlayan diğer kombinasyonlar ve birçok komut modu işlevi vardır (örneğin , eski etiket yığını girişine atlamak için Ctrl+ t). Genel :help 29.1bir bakış için bakınız .

Not kodda her önemli değişiklik için yeniden çalıştırmak ctags zorunda ve yeniden endeksi projenizi izin söyledi. Bunu el ile yapabilir veya vim'ye kısayol tuşu veya yazma sırasında yapmasını öğretebilirsiniz.

İpucu: ctags'ı kapsamlı bir şekilde kullanırsanız, vim-taglist ( http://vim-taglist.sourceforge.net ) eklentisi de bir göz atmaya değer. Bu sınıf / dosya için tüm işlevlerin bir listesini içeren bir IDE tarzı anahat verir.


Bilmeye değer iki şey: evrensel ctags birçok yönden coşkulu ctags'i geride bıraktı. Ayrıca, git etiketlerinizi senkronize etme izni nasıl verilir
D. Ben Knoble

4

Şimdiye kadar bir fonksiyonun tanımını veya tanımını bulma problemine iki çözüm söyleyebilirim. Etiket tabanlı başka bir iyi çözüm olduğunu biliyorum, ama kullanmadığımda, başkalarının size vermesine izin vereceğim.

Önce en moda olanı: YouCompleteMe'nin bir :GoToDefinitionve bir :GoToDeclarationçift ​​komutu var.

Kullandığım (10 yıllık uzun alışkanlıkları değiştirmek zor). Benim lh-tags eklentisi bir ctags veritabanı oluşturmak ve artımlı olarak güncellemek için bir yolu vardır. Ve ayrıca CTRL+W Meta+Downimlecin altında bulunanlarla (/ seçilenin) eşleşen tüm bildirimleri ve tanımları sunmanın bir yolunu ( ) sunar . Bu çözüm ctags'a dayandığından, imlecin altındaki tanımlayıcının hangi aşırı yükün gerçekten ilişkili olduğunu bilemeyecektir. Diğer ctags tabanlı çözümler bu konuda kötü (/ iyi) olmalıdır. Ancak burada YCM çok daha iyi olmalı.

Discl: lh-tags'leri daha ergonomik bir alternatif olarak uyguladım :tselect.

(Aslında üçüncü bir çözümü hatırlıyorum: Bir clang-indexer çatalı ve onu içine alan ilgili vim eklentisi başlatmıştım. Ama YCM ile bu çözümü unutacağım)

EDIT: 2019 itibarıyla en verimli çözüm LSP sunucularına dayanıyor . İndekslemek, atlamak ve daha pek çok şey yapmak için COC + ccls kullanıyorum . Fazla zaman harcamayacağım veya clang ve ccls'ın son sürümlerini yükleyemediğim bir proje için COC'yi yapılandırmak için çok tembel olduğumda etiket tabanlı çözümlere geri dönüyorum.


1
Giriş için teşekkür ederim, her çözümü test edecek. YouCompleteMe'yi test ettim ve sadece GoToDeclarationbirden çok kaynak dosyayla çalışıyor. İşte hakkında dokümanlar bir alıntı GoToDefinition: For C-family languages this only works ... when the definition of the symbol is in the current translation unit.. Ayrıca, komutlar :YcmCompleter GoTo*.
Allan Hasegawa

Bu çizgiyi kaçırdım. Yani clang_indexer hala faydalı olabilir. Diğer çözümlerin kurulumu biraz zor olabilir. Gerekirse bana bir e-posta göndermekten çekinmeyin.
Luc Hermitte

3

Birkaç alternatif var. İlki ctags. Daha gelişmiş bir dizinleyiciye ihtiyacınız varsa daha cscopeiyi bir alternatiftir. Örneğin , belirli bir işlevin tüm arayanlarını listelemenize izin verir . Bu araçlar, kodunuzu gerçekten doğru bir şekilde anlamadan dizine ekleyecektir (sembolün ne anlama geldiğini bilmek için basit bir dilbilgisi tanımına sahiptirler). Bu dilbilgisini genişletmek de nispeten kolaydır. taglistEklenti bir bunlar için sahip olması gereken ve taglist şov sonuçlarına dizinleyici dilbilgisi uzatmak mümkündür.

Eğer indeksleyiciden başka bir şeye ihtiyacınız varsa, sözdizimi kontrolü gibi sonra YouCompleteMemuhtemelen yoludur. Üstüne inşa edilmiştir llvmve bu nedenle uygun ayrıştırıcıya sahiptir. Bu, kod sözdiziminin ve anlambiliminin kontrol edilmesini sağlar .

Etki alanına özgü dili veya gömülü kodu olan bir kodla çalışırsanız, genellikle dosyaları açığa çıkarırsınız. Alternatif, Ackbu göreve yardım etmeye çalışan perl betiğidir.


0

Sanırım ihtiyacın olan şey bu. Vim yerel olarak ctags ile entegre edilmiştir ve işlev tanımlarına ve bildirimlerine kolayca atlayabilir.

Bu makaleye bir göz atın http://andrew.stwrt.ca/posts/vim-ctags


Lütfen bağlantılı yayının bir özetini ekleyin. Bağlantı sona erdiğinde yalnızca bağlantı yanıtları işe yaramaz hale gelir.
muru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.