VIM'de büyük projede nasıl gezinilir


87

Yalnızca VIM kullanarak büyük projeleri (yüzlerce dosya) nasıl yönetirsiniz?

Şahsen küçük projelerden daha büyük herhangi bir projede sorun yaşamaya başladım.

  • Tercihen ad tamamlama ile hızlı bir şekilde 'dosyaya gitmenin' bir yolu var mı?
  • başka bir dosyadayken 'sınıf tanımına git' için aynı

Tüm VIM temellerini biliyorum, bu yüzden onu komut dosyaları yazmak veya bazı kaynak kodlarını hızlı bir şekilde düzenlemek için kullanmakta sorun yaşamıyorum. Ancak dosyalar arasında gezinmek zorunda olduğumda benim için gerçekten dağınık oluyor.


Hangi dili kullanıyorsun
LB40

Dilden bağımsız çözümü tercih ederim, ancak C ++, PHP ve Rails için desteğe ihtiyacım var.
Jakub Arnold

Hangi cevabı kabul ettiniz? @JakubArnold

@xetrasu Kullanmayı bitirdimNERDTree
Jakub Arnold

Yanıtlar:


33

VIM, etiketler için mükemmel bir desteğe sahiptir . Projeniz için bir etiket dosyası oluşturduktan sonra, hepsi aynı düzenleme oturumunun içinde dosyalar arasında atlama dahil olmak üzere bir yöntemin, sınıfın vb.

Deneyin

:help tags

C / C ++ için bir etiket dosyası oluşturmak için, kabuk isteminize gidin (sisteminizin * nix / Cygwin olduğunu varsayıyorum) ve şunu yazın:

info ctags

veya

ctags --help

2
Vim ayrıca, belirli bir işlevi hangi işlevlerin çağırdığını bulmanızı sağlayacak cscope desteğine sahiptir - bilgi :help cscopeiçin bkz . Girişte güzel bir özellik listesi var ("Bu gibi sorulara cevap vermek için tasarlanmıştır" altında).
Cascabel

1
Ne yazık ki, cscope çok sınırlı bir C ++ anlayışına sahiptir.
Luc Hermitte

28

Basit çözümleri severim, şu anda gezinmenin en sevdiğim yolu:

a ekle ~/.vimrc.local

set path=$PWD/**

Ardından dosyayı mevcut çalışma dizininin (pwd) herhangi bir yerinde bulmak için düzenleyiciye yazın.

:find user_spec.rb

Birden çok seçenek bulmak için dosya adlarında sekme tamamlamayı kullanabilirsiniz, bu da TextMate'in dönüştürülmesini çok mutlu eder.


1
Bu çözüm şundan çok daha basittir: FC ve eklentiler çünkü önbelleğe alma gerekmez ve ... günümü avokadınız! Teşekkürler!
Srikumar

1
Vim, wd'yi varsayılan dizin olarak okumuyor. Kabuğu yeniden başlattım ve hala çalışmıyor. Ayrıca vim .komutu çalıştırmadan önce denendi : /
Adam Grant

13

Büyük projelerle başa çıkmama yardımcı olması için NERDTree (dizin kenar çubuğu), FuzzyFinder Textmate (TextMate'in CMD + T gibi dosyaya git) ve Sessions (: h sessions) kombinasyonunu kullanıyorum .

Bazı oturumlar yardımcı eklentisi kullanmanızı öneririm. Ne kullandığımı söylerdim ama henüz tatmin olmadım. Yalnızca Google "vim seansları".

FuzzyFinder Textmate'i çalıştırırken dikkat edilmesi gereken bir nokta, FuzzyFinder eklentisinin eski bir sürümüne, özellikle v2.16'ya bağlı olmasıdır. Daha yüksek bir şey ve hatalar alırsınız. Ama kesinlikle zahmete değer. Ad tamamlaması olmasa da, araması akıllıdır, bu yüzden ararsam fro/time/actionsphpdosyayı açacaktır apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(parantez, neyle eşleştiğini gösterir). Yalnızca klasör adlarına göre benzersiz olan dosyaları seçmeyi çok kolaylaştırır.


2
Daha çok sevdiğim ve kurulumu daha kolay (en azından benim durumumda) yeni bir eklenti buldum: CommandT . Çok daha hızlı.
donut

6
Daha yeni, daha güçlü bir araç, vim betiğinde yazar, bu nedenle janus projesi tarafından hiçbir harici bağımlılık ctrlp kullanılmaz
alexandru.topliceanu

7

Ayrıca paha biçilmez ctag'ler ve çeşitli ilişkili komutlar. Ayrıca proje eklentisi olmadan yaşayamazdım , bu da bir projeyle ilgili ilgilendiğiniz dosyaların ayrı bir bölmede olmasını sağlar. Kurulumumun ne kadarının özelleştirildiğini hatırlayamıyorum, ancak Debug.c adlı bir kaynak dosyayı açmak istersem şuna basarım:

<F12>     " Opens the project pane
/De       " Searches for "De", which is likely to be enough to find Debug.c or possibly Debug.h
<ENTER>   " Opens the selected file and closes the project pane

Daha sonra sık sık yapıyorum:

:vsp      " Vertically split the window
<F12>     " Reopen project pane
#         " Search back to find previous entry with the same name (to find
            Debug.h if I was on Debug.c: my headers are in Headers/ and
            my source is in Source/, so the headers come earlier in the list
            than the source).  I use * to go the other way, obviously.
<ENTER>   " Open the header file in the other window and close the project window.

Bu nispeten kısa sekansla, herhangi bir dosyayı ve başlığını dikey bir bölmede açabilirim. Proje eklenti penceresi sadece bir metin dosyası olduğu için, Vim'in arama özelliği kullanılarak tamamlanır.


4

Vim 7.3'ten başlayarak, :findkomut dosya adlarının sekme tamamlamasına sahiptir.

Eğer set Yani eğer 'path'tüm projeyi içeriyor seçeneği (muhtemelen kullanarak **o zaman kullanabilirsiniz, yinelemeli arama alt dizinleri izin vermek için joker) :find, :sfind, :tabfindprojenizde herhangi bir dosyaya ulaşmak için tamamlanması vb komutlar. Bu ayrıca gf, dosya adı metninizdeyse, örneğin bir include yönergesinde, dosyalara doğrudan ve arkadaşlarınızla atlamaya izin verir .

Bu yöntemle, belirli dosyalara gitmek için hiçbir harici araç veya eklentiye gerek yoktur. Yine de kuşkusuz o kadar hızlı veya kullanımı kolay olmayabilir ve tanımlara atlama ihtiyacını karşılamıyor. Tanımlar için, diğer cevapların önerdiği gibi ctag'leri kullanıyorum.


3

Diğer posterlerin önerdiği gibi ctag kullanıyorsanız, taglist eklentisine baktığınızdan emin olun .

Belgeleri okumak ve temel bağlamları öğrenmek için zaman ayırdığınızdan emin olun. İşte başlamanız için birkaç tane (TList penceresinden):

  • o - dosyayı yeni pencerede aç
  • t - dosyayı yeni sekmede aç
  • [[veya geri al - listedeki önceki dosya
  • ]] veya sekme - listede sonraki dosya

3

Coşkulu ctag'ler.

İmlecin altındaki etikete atlamak için Ctrl-] tuşunu kullanın.


2

Kullandığım FindFile . Projenizin kök dizininde vim'i açıp çalıştırırsanız :FC ., eklenti cwd'nizin altındaki tüm dosya adlarını önbelleğe alacaktır. Daha sonra :FFbir tamamlama menüsü açıp istediğiniz dosyanın adını (veya daha doğrusu ilk birkaç harfini) yazabilirsiniz.


vay bu, kullanımı en kolay eklenti gibi. Sıfır kurulum dahil .. sadece FC .kök dizininizde, ardından :FFgirin, istediğiniz dosya adını yazmaya başlayın ve bitirdiniz. Yine de yeni sekmelerde nasıl başlatılacağını bulmaya çalışıyorum ..
tester

Ayrıca, bunu kullanırsanız, vim'i her başlattığınızda, :FC .o dizindeki dosyaları önbelleğe almak için yeniden yapmanız gerekeceğini belirtmek gerekir .
test kullanıcısı

İşte FindFile.vim'in :FTveya :FindTabNew gist.github.com/1104884
test

2

vimKaynak dosyanızın kökünden açılması ve içindeki pathtüm alt dizinleri içerecek şekilde genişletme seçeneği.
Örneğin set path+=/usr/include/c++/**C ++ üstbilgileri ve set path+=**kaynak dizininiz için.

Bu, o halde, aşağıdaki olasılıkları bolca açar.

1) Dosyayı ada veya parçalarına göre açmak

:find file_name

Otomatik tamamlama ve joker karakter genişletmeyi :findgüvenilir bir şekilde kullanabilirsiniz. Adı yazarsınız, o adı bulur. Bu dil agnostik olarak çalışır, bundan hoşlanacağına eminim.

2) cusror altındaki dosyalara gitme:
gibi bir dosya yoluna gitmek isterseniz #include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl- 6- gfveya sonraki son imleç konumuna geri dönmek içingF

3) API araması ve API konumuna gitme

[iveya [Içalışma alanınızdan ayrılmadan imleç altındaki sözcük için işlev imzanıza bakmak için kullanılabilir. [<Tab>aslında beyana gitmek için. Son konuma geri dönmek için Ctrl- kullanın 6.


Genişletmeden path, :Exkomutla dosyalarda gezinmeye başlayabilir ve dosyanızı gezip açabilirsiniz. NerdTreeYine de bunu tercih ederim .


1

Birisinin daha iyi bir çözümü göstermesini umuyor olsam da, bir şeyler öğrenebilirim, NERDTree, ağacı genişlettiğim sürece ad tamamlama ile belirli dosyalara ulaşmak için bana iyi geldi. Bir dosyaya ulaşmam gerektiğinde komut şuna benzer:

, d / foo.pyo (burada foo.py bir dosya adıdır)

, d ağacı açmak için, / arama moduna girmek için, dosyanın adını (veya kısmi adı veya regex veya her neyse) ve sonra açmak için o.

Elbette, dosya adını yeterince yazmadıysanız veya yinelenen dosyalar varsa, birkaç kez 'n' tuşuna basmanız gerekebilir.

NERDTree'yi bu şekilde kullanmanın bir hack gibi hissettirdiğini itiraf ediyorum, ancak şimdiye kadar kas hafızamın içine girmiş ve bunu düşünmüyorum bile.

Tabii ki ctag'leri de kullanıyorum, ancak bunlar yalnızca imlecin yakınında bir işleviniz olduğunda ve başka bir dosyada veya başka bir şeyde onun tanımına gitmeniz gerektiğinde kullanışlıdır. Çoğu zaman "Tamam, şimdi x özelliği üzerinde çalışmam gerekiyor" diyorum ve yakınlarda ctag'lerin gerçekten yardımcı olacağı herhangi bir referans olmadan başka bir dosyaya gitmem gerekiyor.


3
Biraz daha inceledim, fuzzyfinder proje araması için harika bir fikir gibi görünüyor.
yerçekimi

1

İki eklentim kullanıyorum:

  • komut satırında dosya adlarını tamamlayan searchInRuntime . Bir şekilde fuzzyfinder ve arama dosyasına benzer,
  • lh-etiketleri tamamen deneysel ve belgelenmemiş. İki özellik sunar: dosya kaydederken etiket dosyasının otomatik ve hızlı güncellenmesi (ing?) Ve <c-w><m-down>varsayılan olarak takılı bir etiket seçici . Bunun yerine ünlü etiket listesi eklentisini kontrol etmek isteyebilirsiniz.

Her ikisi de benim viml kütüphanemi lh-vim-lib gerektirir.


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.