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, gd
sizi 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. ( g
Vi'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\b
iken, normal regex) g*
arar keyword
sö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 gd
veya 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 description
bölümünde verdiğiniz bağlantı #2507
koptu. 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 /^main
dosyanın içinde veya :grep -r '^main' *.c
bir 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 | PlugInstall
VIM eklentilerini indirmek için arayınvim
ve arayın:CocInstall coc-marketplace
:CocList marketplace
dil sunucularını arayın ve arayın, örneğin:
python
bulmak için coc-jedi
,php
bulmak coc-phpls
vbinstall_gadget.py --help
kullanı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 nvim
ve 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 ctags
ama 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.