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?
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?
Yanıtlar:
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 .
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.
/
/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 .
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.
*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.
*varsa, tanımı bulmadan önce sizi ortalama 50 vuruşa götürür.
İmleci programınızdaki herhangi bir değişkenin üzerine yerleştirirken gdveya tuşlarını kullanın gD.
gd sizi yerel deklarasyona götürecektir.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 .
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
Detailed descriptionbölümünde verdiğiniz bağlantı #2507koptu. Başka bir tane verebilir misiniz lütfen?
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.
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ıç:
~/.vimrc:
call plug#begin()
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'puremourning/vimspector'
call plug#end()
:source $MYVIMRC | PlugInstallVIM eklentilerini indirmek için arayınvimve arayın:CocInstall coc-marketplace:CocList marketplacedil sunucularını arayın ve arayın, örneğin:
pythonbulmak için coc-jedi,phpbulmak coc-phplsvbinstall_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:
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.
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 )
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;/
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.