Vim dosyasında gezinme


91

Son birkaç yıldır TextMate'i kullandıktan sonra vim öğrenmek için gerçekten çok uğraşıyorum.

Dosya içi gezinmenin bir kısmını belleğe almaya başladım, ancak birden çok dosya arasında gezinmekle uğraşıyorum.

İş akışımda, bir avuç dosya arasında düzenli olarak gezinmem oldukça yaygındır (bölünmüş bölme pencerelerinin çok küçük olması için yeterli dosya).

Şu anda NERDTree kullanıyorum, ancak dizinleri incelemek zahmetli ve sürekli olarak CTRL+ W h/ CTRL+ kullanarak W lileri geri zıplama buluyorum .

Sekmelerle daha iyi yapacağımı düşünüyorum, kolayca arasında geçiş yapabiliyorum ama belki farklı bir iş akışı kullanmam gerekiyor.

Ayrıca TextMate'te CMD+ gibi bir "Dosyaya Git ..." kısayolu istiyorum T. Bulduğum fuzzy_file_finderama durum böyle ben üzerinde çalıştığım yerli yüklemeleri olmadığı Yakut bağlamaları ile inşa edilecek vim gerektirir.

Ben ise olabilir ben vim geçmek istediğiniz ana nedeni yeniden Bir editör ortamına sahip böylece biliyorum ki olacak herhangi bir platform üzerinde kolayca çalışır.

Dışarıdaki seçenekler çok büyük, herhangi bir fikir çok takdir ediliyor!


1
Hiçbir harici yardım kullanmayan, dosya ve tamponlarda gezinmenin gerçekten tatmin edici bir yolunu bulamadım. Yerleşik malzeme oldukça kötü (yani, numarasına göre bir tampona geçiş yapıyor? Geçici tampon numaralarını kim hatırlayarak dolaşıyor ...)
Svend

1
@svend: Arabelleklere hem ada hem de numaraya göre başvurabilirsiniz - aşağıdaki cevabıma bakın
Dave Kirby

Eğer eşlenen caps-lockiçin ctrl? Çoğu şeyi ctrlçok daha güzel hale getirir ... gnome-tweaksveya gibi bir şey kullanabilirsinizsetxkbmap -o ctrl:nocaps
Nathan Chappell

Yanıtlar:


93

:eSekme tamamlama için iyi bir konfigürasyon verildiğinde , alt dizinleri düz eski yoluyla incelemek o kadar hantal bulmuyorum .

'wildmenu'Vim'in komut satırının yukarısındaki modelinde tamamlamaların bir listesini (dosya adları) göstermesini sağlamak için seçeneğe bakın . 'wildmode'Vim'in yapacağı sekme tamamlama türünü daha fazla yapılandırma seçeneğini değiştirebilirsiniz .

Şahsen kullanıyorum :set wildmode=full.

İş akışım şöyle:

  1. :cd projemin üst düzey dizinine.
  2. Dosyayı açmak için foo/bar/baz:

    • En basit senaryo: yazın :e f<tab>b<tab>b<tab><enter>.

    • Bir dosya ile başlayan aşkın varsa bbu dizinlerin birinde bir yapmak gerekebilir <left>ya <right>ya da başka <tab>aralarında atlamak (veya belirsizliği giderecek birkaç harfini yazın) için klavyedeki.

    • En kötü durum senaryosu, bir adı paylaşan dosyalar ve dizinler vardır ve dizinde ayrıntıya inmeniz gerekir. Bu durumda sekme ile dizin adını tamamlayın ve ardından *<tab>detaya inmek için yazın.

  3. 2 veya 3 pencere açın ve gerektiğinde hepsinde dosya açın.
  4. Bir dosya arabellekte açıldığında, arabelleği öldürmeyin. Yeni dosyaları açtığınızda arka planda açık bırakın. :eAynı pencerede sadece yeni bir dosya.
  5. Ardından, :b <tab>arka planda zaten açık olan arabellekler arasında geçiş yapmak için kullanın. Eğer yazarsanız :b foo<tab>sadece şu anda açık dosyalar o maç karşı maç olacak foo.

Ayrıca bu eşlemeleri yeni pencereler açmayı kolaylaştırmak ve aralarında geçiş yapmak için kullanıyorum çünkü bu çok sık yaptığım bir şey.

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

Vim'i açmam, bazı pencereler kurmam ve içlerinde birkaç dosya açmam birkaç saniye sürüyor. Kişisel olarak, üçüncü taraf dosya tarama komut dosyalarının hiçbirinin çok yararlı olduğunu bulamadım.


4
Müthiş açıklama için şapkanın ucu. Skillz ++ için parmak sallama, açıklamayı anlamanız gerekir.
Bay Baudin

261

Dosya sistemine göz atmanın kolay bir yolu şu komuttur:

:Sex

Bunu uydurmuyorum :)


15
ve yardımdan şunu anlıyorum: Vex de harika.
jrwren

18
Ve bunun 69 olumlu oyu var. Bunu değiştirecek yüreğim olduğunu sanmıyorum.
AlbeyAmakiir

3
Ve :Vexekranı yatay yerine dikey olarak bölmek istiyorsanız
sreenivas

1
Vay canına, bunların hiçbirini bilmiyordum. :VexDaha pratik buluyorum ama :Sexsadece günümü yaptım.
William Robertson

2
kayıt için de :Seçalışır ( Ve, Tevaryantlar için aynı ). Tuhaf yapmaya gerek yok :)
towc

47

:Sex, :Vex, :TexVe :Exsen den farklı bir şey kullanmak istiyorsanız sisteminizde dosyaları (ploring) ex tüm yararlı komutlar:e

( S/V/TBölünmüş / Dikey / Sekmenin kısaltması nerede )


7

Henüz bulamadıysanız, kontrol etmek isteyebilirsiniz:

  • orijinal bulanık bulucu eklentisi - IIRC'de Ruby bağlama sorunları yoktur
  • Proje eklentisi - NERDTree'ye benzer
  • tampon gezgini eklentisi - açık tamponların bir listesini gösterir

Ayrıca, .vimrc dosyanızda anahtar kısayolları yeniden eşleyerek daha az külfetli hale getirebileceğinizi unutmayın. Bölünmüş pencereleri çok kullanırım; Aşağıdakilerin onlarla başa çıkmayı çok daha kolaylaştırdığını buldum:

" set your own personal modifier key to something handy
let mapleader = "," 

" use ,v to make a new vertical split, ,s for horiz, ,x to close a split
noremap <leader>v <c-w>v<c-w>l
noremap <leader>s <c-w>s<c-w>j
noremap <leader>x <c-w>c

" use ctrl-h/j/k/l to switch between splits
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h

5

Kolayca geçiş yapabileceğim sekmelerle daha iyi yapacağımı düşünüyorum, ancak belki farklı bir iş akışı kullanmam gerekiyor.

Vim'in sekmelerinden haberdar mısınız? Vim'in oradaki kendi sekmelerine mi atıfta bulunduğunuzdan veya TextMate'in sekmelerinden mi bahsettiğinizden emin değilim. Hangi Vim sürümünü kullandığınız belli değil ama en az 7.0'dan beri sekmeleri var (son zamanlarda baktığım her yere kurulu görünüyor) ve harikalar.

:tabeyeni bir tane açar ("sekme düzenleme" nin kısaltması, yani :tabeboş veya :tabe path/to/fileyeni bir sekmede bir dosya açmak için) gt/ ile bitişik sekmeler arasında hareket edebilirsiniz gTve sekme ile ilgili bir dizi nav komutu da vardır. Vim'den bekleyebilirsiniz ( :help tabs)

Büyük projeler için iş akışım, ihtiyaç duyduğum içeriğe bağlı olarak her biri 1 ile 3 arasında pencere içeren bir grup sekme içeriyor. Dikey olarak bölünebildiğim için çift genişlikte bir terminal pencerem varsa bu daha da iyi çalışıyor :vs, böylece tek bir sekme bana 4 dosyayı aynı anda ve her biri için bolca yer ile kolayca gösterebilir.

Son ipucu: Bazen :sb <partial_buf_name>TM'nin bulanık bulgusuna benzeyen "tampon anahtarı" komutunu ( ) kullanıyorum, çünkü oldukça iyi çalışıyor ancak yalnızca zaten açık olan tamponlar için. Aynı anda bir düzine veya daha fazla dosyam açıkken hala harika. (Not: Bunun :set switchbuf=usetabsekmeler arasında çalışması için vimrc'imde olması gerekiyordu , ancak bu ayarlandıktan sonra harika.)


1
Sekmelerden anladığım kadarıyla, bu daha çok bir düzen koruyucusu, her sekmede bir arabellek açık tutma yöntemi değil (Bram Molenaars'ın "etkili metin düzenlemenin 7 alışkanlığı" videosundaki sekmelerdeki kendi görünümlerine bakın.
Svend,

Bunun gibi sizin için çalışan komutları bir kez bulduğunuzda, onları bir anahtara bağlayabilirsiniz. Açık arabellekler arasında kontrol sekmesi çevirme var (a la firefox), ancak bunun yerine sekmeleri değiştirebilirsiniz.
Jonathan Hartley

vim-titlecasegt / gT eşlemeler ile vida, ancak orada çalışma çevresinde .
naught101

5

LustyExplorer'ı şimdiye kadarki en iyi buluyorum .

Adının yalnızca bir kısmını yazarak bir dosyayı açabilirsiniz.

Geçerli dosyanın dizininden veya geçerli dosyadan veya pwdarabellek listesinden bir dosya açabilirsiniz .

Arabellek listesinden bir dosya açarsanız, dizin ağacında gezinmeniz gerekmez, ancak maalesef diğer iki mod için ağaçta gezinmeniz gerekir. İyi olan şey, ilk karakterden başlamak zorunda olmaman.

Eğer varsa:

dir_a/
    ...
dir_b/
    file.js
    file.html

ve açmak dir_b/file.htmlistiyorsanız, genellikle yazarak bulabilirsinizb<Tab>h


Bu harika eklentiye bazı uzantılar yaptım. svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff Temel olarak, önceden yüklenmiş olsun ya da olmasın, sadece son kullanılan bir dosyanın adını girmeme izin veriyor. Bu, yalnızca bir dosyayı ilk kez açtığınızda FS'ye göz atmanız gerektiği anlamına gelir.
Svend

4

:findCevapların hiçbirinde bu komuttan bahsedilmemesi şaşırtıcı . Genellikle dizin hiyerarşisinin derinliklerine inmem gereken raylı projeler üzerinde çalışırım. Yani bir dosya için application.css, yazmam app/assets/stylesheets/gereken tek şey bulunur :find applicave ardından otomatik tamamlamak için sekme tuşuna basın ve açmak için enter tuşuna basın .


3

Command-T eklentisine alternatif olarak ctrlp eklentisine göz atın . Bundan daha iyidir, çünkü 'yerel' bir Vim betiğidir ve çok hızlı ve göze batmadan çalışırken Vim'in ruby ​​(veya başka bir destek) ile derlenmesine ihtiyaç duymaz.


2

İstediğiniz dosya zaten bir arabelleğe yüklenmişse (muhtemelen bir avuç dosya arasında düzenli olarak geziniyorsanız), :b[uffer]komutla arabelleğe hızlıca geçebilirsiniz .

:bparametre olarak bir arabellek numarası veya (daha kullanışlı bir şekilde) yol / dosya adının bir kısmıyla eşleşen bir dizge alabilir . Birden fazla eşleşme varsa, aralarında geçiş yapmak için sekmeyi kullanabilirsiniz.

Pencereyi bölmek ve tamponu yeni pencerede açmak istiyorsanız, ardından şunu kullanın: :sb name

Arabelleği yeni bir sekmede açmak istiyorsanız şunu kullanın: :tab b name

Şu :lsanda yüklü olan arabelleklerin bir listesini görmek için komutu da kullanabilirsiniz .


1

Bu işlevi alt dizinlerde dosya bulmak için kullanıyorum, yine de yazmadım. Bu geliyor vim wiki :

işlev! Bul (isim)
    let l: list = system ("bul. -adı '" .a: ad. "' | grep -v \". svn / \ "| perl -ne 'baskı \" $. \\ t $ _ \ "' ") 
    let l: num = strlen (ikame (l: list, "[^ \ n]", "", "g")) 
    eğer l: num 0 
            echo "Sayı değil" 
            dönüş 
        endif 
        eğer l: inputl: num 
            echo "Menzil dışında" 
            dönüş 
        endif 
        let l: line = matchstr ("\ n" .l: list, "\ n" .l: girdi. "\ t [^ \ n] *") 
    Başka 
      let l: line = l: list 
    endif 
    let l: satır = ikame (l: satır, "^ [^ \ t] * \ t. /", "", "") 
    ": e" .l: satırını çalıştırın 
son işlev 

komut! -nargs = 1 Bul: Find ("") ara

Sevdiğim bir şey de joker karakterleri (*) destekliyor olması. Aynı zamanda birden fazla maç için iyi davrandı.


1

wildmenuCevaplara ek olarak, BufExplorer eklentisini ve aşağıdaki eşlemeleri tamponları hızlıca atlamak için kullanıyorum:

nmap <A-1> :b 1<CR>
nmap <A-2> :b 2<CR>
nmap <A-3> :b 3<CR>
...
nmap <A-0> :b 10<CR>
nmap <A-=> \bs

Veya tampon gezgini :ls, temelde aynı şeyi gösteren komutla değiştirebilirsiniz .

Sonuncusu Alt-=, arabellek gezginini göstermek için eşler .

Genelde yalnızca bir veya iki pencerem olduğu için Windows'u çok fazla kullanmıyorum.

Ayrıca statusline, arabellek numarasını içerecek şekilde değiştirdim %2n, böylece hangi arabelleğin düzenlendiğini her zaman bilirim. Görmek:h statusline




0

İşte benim yaptığım oldukça önemsiz bir şey .vimrc. Herhangi bir alt dizinden bir dosya yükleyecektir.

" load from an unspecified subdirectory 
function! LoadFromSubdirectory(filespec) 
  let filename = glob("`find . -name '" . a:filespec . "' -print`") 
  exe ':e '.filename 
endfunction 
:command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 

Bu yüzden şunu söyleyebilirim:

: Er Main.java

ve alt dizinleri arayacak, bulacak Main.javave yükleyecektir. Aynı adı taşıyan birden çok dosya için iyi davranmaz, ancak hızlı ve basittir.

Kullandığım diğer araç , ağaç tabanlı bir dosya / dizin penceresi sağlayan ve VIM'den herhangi bir özel yapı seçeneği gerektirmeyen (yani bir vanilya eklentisi) VTreeExplorer.


Bir alt dizinden yükleyebilmek isterdim, ancak birden çok dosya sorunu benim için bir anlaşma kırıcı olacaktır. Genellikle alt dizinleri bir grup var bu yüzden bütün bir olduğunu, bir Django geliştiricisiyim models.py, views.pyvb
Pete

0

Dosyaları bulmak için iş akışım wildmenu, autocwd ve :e.

İlgili bölümler .vimrc:

set wildmenu
set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
set wildmode=list:full
set autochdir
let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'

Ve nasıl kullanılacağı:

:e myf^D

Bu, geçerli dizindeki myf ile başlayan tüm dosyaları verir. Onlar <Tab>aracılığıyla da yapabilirsiniz . Açmak için dönüşü kullanın :)

^Dher zaman size tüm maçları verecektir. Autocmd her zaman mevcut dosyanın klasörüne gittiği için çalışmak kolaydır. Eğer içindeysen ve sana foo/bar.pygitmek foo/baz.pyistiyorsan sadece yap :e baz.pyve oradasın. Bu aynı zamanda tamponlarla da çalışır ( :b foo^Dfoo ile başlayan tüm tamponları listeler)


Diğer dizinlere gitmeye ne dersiniz? Örneğin, hepsi farklı alt dizinlerde bulunan Python görünümüm, HTML şablonum ve JavaScript dosyalarım arasında sık sık çalışıyor olacağım? TextMate'te dosyanın adını yazmaya başladım ve "projemdeki" (aka cwd) tüm eşleşmeler ortaya çıkıyor.
Pete

Alt klasörlere tekrarlanmaz, hayır. Ama iş akışımı buna uyarladım. Ayrıca açtığım dosya bir kez, sadece tamponun adını söyleyebilirim ve iyiyim. Vim'e açık arabellekleri hatırlamasını söyleyebilirsiniz, bu durumda genellikle bu özelliğe ihtiyacınız olmaz.
Armin Ronacher
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.