Vim'deki fonksiyon tanımına atla


241

Vim kullanarak bir işlev tanımına nasıl atlayabilirim? Örneğin Visual Assist ile bir fonksiyonun altına Alt+ yazabilirim gve tanımları olan dosyaları listeleyen bir bağlam menüsü açar.

Vim'de böyle bir şeyi nasıl yapabilirim?


2
gnu global ctags'den daha iyidir.
Jichao

6
@Jichao, bize deneyiminiz hakkında biraz daha bilgi verebilir misiniz? GNU Global sizin için hangi dillerde daha iyi çalıştı? Tercih ettiğim bağlamla ilgili olarak benim önemli olmam için başka bir şey var mı? Ya da belki birçok farklı senaryoda kullandınız ve çoğunlukla / her zaman tercih ediyor musunuz? Bu konuda daha çok neyi seviyorsun? Teşekkürler.
still_dreaming_1

@Jichao Yorumunuzu bir topluluk wiki yanıtına çevirdim. Bu cevap için değişikliklerinizi ve girişlerinizi memnuniyetle karşılarım.
still_dreaming_1

Yanıtlar:


213

Ctags kullanın. Bir etiketler dosyası oluşturun ve vim'e: tags komutunu nerede kullandığını söyleyin. Daha sonra Ctrl- tuşlarını kullanarak fonksiyon tanımına atlayabilirsiniz.]

Bu soruda daha fazla etiket hilesi ve ipucu var .


2
php "Coşkulu ctags" onunla çalışması gerektiği kadar C gibidir. Python modu olup olmadığını bilmiyorum.
Paul Tomblin

5
Cscope ile deneyim yok. Nedir?
Paul Tomblin

10
C ile benzerlik CTags PHP desteği ile ilgisi yoktur. PHP'nin yanı sıra Python'u da destekler. Göz at ctags.sourceforge.net/languages.html tam destek görmek.
veri

1
ctags'ı nasıl oluştururum?
dwaynemac

4
bu ctag'ları nasıl kullanacağınızı öğrenmenin en iyi olduğu yere referans almak harika olurdu.
Fzs2

137

Her şey tek bir dosyada bulunuyorsa, gdsizi imlecin altındaki sözcüğün dosyasındaki ilk oluşumuna götürecek (genellikle tanım olan komut ) vardır.


1
imlecin altındaki kelimeyi bilmiyorsam (yazmayı tercih ederim)?
Fuad Saud

@FuadSaud sadece bunu kullanarak arayın/
LucasB

6
/neredeyse her zaman kesin değildir, çünkü tüm tekrarları eşleştirecektir. Aslında :tag <function_name>tanımlara ctags aracılığıyla atlamak için yapabileceğinizi öğrendim .
Fuad Saud

@Faud To To Definition özelliği, tanımlayıcıyı imleçle (her IDE'de) işaret etmeye dayanır. Yazma / arama başka bir özelliktir, onları karıştırıyorsunuz.
kanlı

101

g* ctags kurulmadan iyi bir iş çıkarıyor.

Olduğunu, tip g, *(ya da sadece *- (bu durumda, işlev adı olarak) imlecin altındaki kelimeyi aramak için aşağıya bakınız). Ardından n, bir sonraki (veya Shift- nönceki) olayına gitmek için tuşuna basın .

Bu komutun yalnızca imlecin altındaki kelimeyi aradığı göz önüne alındığında doğrudan tanıma atlamaz, ancak şu anda ctags ayarlamakla uğraşmak istemiyorsanız, en azından kendinizi yeniden yapmaktan kurtarabilirsiniz. tanımını aramak için işlev adını yazın.

--Düzenle-- Uzun zamandır g * kullanmamıza rağmen, kısa bir süre önce bu kısayollar için iki kısayol keşfettim!

(a) *imlecin altındaki kelimenin bir sonraki tekrarına atlar. ( gVi'ye 'goto' komutunu yazmanıza gerek yoktur ).

(b) #benzer şekilde önceki olaylara gider.

N ve n hala çalışır, ancak '#' genellikle imlecin altındaki bir değişkenin bildirimini ararken aramayı başlangıçta ters yönde başlatmak için çok yararlıdır.


10
Aramadaki *ve g*kelime sınırları arasındaki fark . *Bir does \<keyword\>arama (aynı \bkeyword\biken, normal regex) g*arar keywordsözcük sınırları olmadan.
Nicolai S

bir dosyada yüzlerce fonksiyonunuz *varsa, tanımı bulmadan önce sizi ortalama 50 vuruşa götürür.
naught101

49

İmleci programınızdaki herhangi bir değişkenin üzerine yerleştirirken gdveya tuşlarını kullanın gD.

  1. gd sizi yerel deklarasyona götürecektir.
  2. gD sizi küresel deklarasyona götürecek.

daha fazla navigasyon seçeneği burada bulunabilir .

Linux çekirdeği gibi büyük projelere çapraz referans için cscope kullanın .


14

Paul Tomblin'in de belirttiği gibi ctags kullanmanız gerekiyor . Ayrıca uygun olanı seçmek veya imleç altındaki işlevin tanımını önizlemek için eklentileri kullanmayı düşünebilirsiniz . Eklentiler olmadan, yerleşik ctags desteği gibi yüzlerce aşırı yüklenmiş 'doAction' yönteminden birini seçmeye çalışan bir baş ağrınız olacaktır, bağlamı dikkate almaz - sadece bir ad.

Ayrıca cscope'u ve 'global sembolü bul' fonksiyonunu kullanabilirsiniz. Ancak vim'iniz, varsayılan bir inşa seçeneği olmayan + cscope desteği ile derlenmelidir.

İşlevin geçerli dosyada tanımlandığını biliyorsanız, imlecin altındaki sembol tanımına atlamak için normal modda 'gD' tuş vuruşlarını kullanabilirsiniz.

İşte en çok indirilen gezinme eklentisi
http://www.vim.org/scripts/script.php?script_id=273

İşte http://www.vim.org/scripts/script.php?script_id=2507 etiketine atlarken bağlam seçmek için yazdığım bir tane


Merhaba @ mykola-golubyev, script Detailed descriptionbölümünde verdiğiniz bağlantı #2507koptu. Başka bir tane verebilir misiniz lütfen?
FelikZ

12

Diğer bir yaygın teknik, işlev adını ilk sütuna yerleştirmektir. Bu, tanımın basit bir arama ile bulunmasını sağlar.

int
main(int argc, char *argv[])
{
    ...
}

Yukarıdaki işlev daha sonra /^maindosyanın içinde veya :grep -r '^main' *.cbir dizinde bulunabilir. Kod düzgün girintili olduğu sürece, tanımlayıcının bir satırın başlangıcında gerçekleşeceği tek zaman işlev tanımındadır.

Tabii ki, eğer bu noktadan sonra ctags kullanmıyorsanız kendinizden utanmalısınız! Ancak, bu kodlama standardını da yararlı bir ek olarak buluyorum.


13
Her zaman bazı kodlayıcıların imzalarını neden bu şekilde yazdıklarını merak ettim!
Tarrasch

Ayrıca, ilk sütunda '{' dahil olmak üzere işlev imzalarınızı yazdığınızda, dosyada ileri gitmek için [] ve geri gitmek için [] tuşlarına basarak her işleve hızlı bir şekilde hareket edebilirsiniz.
BentChainRing

12

TL; DR:

Modern bir şekilde kullanmak için COC için IntelliSense gibi tamamlanması ve bir veya daha fazla dil sunucular için tanımlı atlama için (LS) (ve yol şekilde daha fazla). Daha fazla işlevsellik için (ancak tanımlamaya atlamak için gerekli değildir) bir veya daha fazla hata ayıklayıcı yükleyebilir ve tam bir IDE deneyimi yaşayabilirsiniz. Hızlı başlangıç:

  1. VIM eklentilerinizi yönetmek için vim-plug'i kurun
  2. eklemek COC ve (isteğe bağlı olarak) Vimspector üstündeki ~/.vimrc:
    call plug#begin()
    Plug 'neoclide/coc.nvim', {'branch': 'release'}
    Plug 'puremourning/vimspector'
    call plug#end()
    
  3. :source $MYVIMRC | PlugInstallVIM eklentilerini indirmek için arayın
  4. COC uzantılarına kolay erişmek için yeniden başlatın vimve arayın:CocInstall coc-marketplace
  5. :CocList marketplacedil sunucularını arayın ve arayın, örneğin:
    • tip pythonbulmak için coc-jedi,
    • tip phpbulmak coc-phplsvb
  6. (isteğe bağlı olarak) install_gadget.py --helpkullanılabilir hata ayıklayıcılara bakın, örneğin:
    • ./install_gadget.py --enable-python,
    • ./install_gadget.py --force-enable-php, vb.

Tam cevap:

Dil sunucusu (LS), arka planda çalışan ayrı bir bağımsız uygulamadır (her programlama dili için bir tane) ve tüm projenizi gerçek zamanlı olarak editörünüze (sadece herhangi bir editör değil vim) ekstra yetenekler göstererek analiz eder . Şöyle şeyler alırsınız:

  • ad alanı farkında etiket tamamlama
  • tanımlamaya atla
  • sonraki / önceki hataya atla
  • bir nesneye ilişkin tüm referansları bul
  • tüm arayüz uygulamalarını bul
  • tüm projede yeniden adlandır
  • fareyle üzerine gelindiğinde dokümantasyon
  • snippet'ler, kod işlemleri, biçimlendirme, linting ve daha fazlası ...

Dil sunucularıyla iletişim, Dil Sunucusu Protokolü (LSP) aracılığıyla gerçekleştirilir . Hem nvimve vim8(veya daha yüksek) eklentiler aracılığıyla LSP'yi destekler, en popüler olanı Tamamlama Conquerion (COC).

Aktif olarak geliştirilen dil sunucularının ve yeteneklerinin listesi Lang Server web sitesinde bulunabilir. Bunların hepsi COC uzantıları tarafından sağlanmaz. Bunlardan birini kullanmak istiyorsanız, kendiniz bir COC uzantısı yazabilir veya LS'yi manuel olarak yükleyebilir ve COC'ye alternatif olarak aşağıdaki VIM eklentilerinin kombinasyonunu kullanabilirsiniz:

Hata ayıklayıcılarla iletişim, Hata Ayıklama Bağdaştırıcı Protokolü (DAP) aracılığıyla gerçekleştirilir . VIM için en popüler DAP eklentisi Vimspector'dur .

Dil Sunucusu Protokolü (LSP), Microsoft tarafından Visual Studio Code için oluşturulmuş ve izin verilen bir MIT lisansıyla (Red Hat ve Codenvy ile işbirliği ile standartlaştırılmış) açık kaynaklı bir proje olarak yayımlanmıştır . Daha sonra Microsoft da Hata Ayıklama Bağdaştırıcı Protokolü'nü (DAP) yayımladı . VSCode tarafından desteklenen herhangi bir dil VIM'de desteklenir.

Kişisel olarak ekstra astar için COC uzantıları + ALE tarafından sağlanan COC + dil sunucularını kullanmanızı öneririz (ancak COC ile çakışmaları önlemek için LSP desteği devre dışı bırakılmışsa) + Vimspector tarafından sağlanan Vimspector + hata ayıklayıcıları ("gadget" olarak adlandırılır) + VIM eklentilerini takiben:

call plug#begin()
Plug 'neoclide/coc.nvim'
Plug 'dense-analysis/ale'
Plug 'puremourning/vimspector'
Plug 'scrooloose/nerdtree'
Plug 'scrooloose/nerdcommenter'
Plug 'sheerun/vim-polyglot'
Plug 'yggdroot/indentline'
Plug 'tpope/vim-surround'
Plug 'kana/vim-textobj-user'
  \| Plug 'glts/vim-textobj-comment'
Plug 'janko/vim-test'
Plug 'vim-scripts/vcscommand.vim'
Plug 'mhinz/vim-signify'
call plug#end()

Ne yaptığını görmek için her birini google'da yapabilirsiniz.


11

1- coşkulu ctags yükleyin. Osx kullanıyorsanız, bu makale küçük bir hile gösterir: http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html

2- Yalnızca dizininizdeki dosyalar için ctags eklemek istiyorsanız dizininizde şu komutu çalıştırın:

ctags -R

Bu sizin için bir "etiketler" dosyası oluşturur.

3- Ruby kullanıyorsanız ve mücevherleriniz için ctags eklemek istiyorsanız (bu benim için geliştirdiğim RubyMotion ve yerel taşlar için gerçekten yararlı oldu), aşağıdakileri yapın:

ctags --exclude=.git --exclude='*.log' -R * `bundle show --paths`

credit: https://coderwall.com/p/lv1qww (vim yerine emacs için etiketler üreten -e seçeneğini atladığımı unutmayın)

4- ~ / .vimrc'nize aşağıdaki satırı ekleyin

set autochdir 
set tags+=./tags;

(Neden yarı kolon: http://vim.wikia.com/wiki/Single_tags_file_for_a_source_tree )

5- Takip etmek ve vurmak istediğiniz kelimeye gidin ctrl + ]; geri dönmek istiyorsanız şunu kullanın ctrl+o(kaynak: https://stackoverflow.com/a/53929/226255 )


Bahsedilen Mac makalesine bağlantı kesildi. Güncellenmiş bağlantı: runtime-era.blogspot.com/2012/05/… En iyi
seçiminiz

6

Paul'ün ikinci cevabına: evet, ctags (özellikle coşkulu ctags ( http://ctags.sourceforge.net/ )) harika. Ben de bu benim vimrc ekledim, böylece tüm bir proje için bir tag dosyası kullanabilirsiniz:

set tags=tags;/

2

Yükleyin cscope. Çok benzer ctagsama daha güçlü çalışıyor. Yerine, tanımı gitmek için Ctrl+ ]yapmak Ctrl+ \+ g. Tabii ki her ikisini aynı anda kullanabilirsiniz. Ancak büyük bir projeyle (diyelim ki Linux çekirdeği), cscope kilometrelerce öndedir.


1

Ctags oluşturduktan sonra, vim'de aşağıdakileri de kullanabilirsiniz:

:tag <f_name>

Yukarıdaki fonksiyon tanımına götürecektir.

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.