vim, vanilla Vim kullanarak dosyalar arasında hızla geçiş yapma (eklenti yok)


103

Kendimi vanilla Vim ile sınırlamanın (eklenti kullanmama) editörün gücünü sınırladığını anlıyorum, ancak farklı makineler arasında sık sık geçiş yaptığım için ortamımı her yere taşımak genellikle çok fazla sorun oluyor. Vanilla Vim'de kalmak istiyorum.

Beni geride tutan bir şey de dosyalar arasında hızlıca geçiş yapabilmem. Ben (en azından inanmak) iyi bir anlayışa sahip tamponların , pencereler , sekmelerin yanı sıra netrw ( Vex, Ex, vs).

Ancak Sublime Text gibi bir düzenleyicide , sadece yazabilirim ctrl- pve anında dosyanın başındayım.

Kabuğa düşebileceğimi biliyorum, ancak Vim'de dosya adından daha fazlasını temel alan dosyalar arasında hızla geçiş yapmanın başka "gizli" sırları olup olmadığını merak ediyorum.


2
Bu, sorunuzun yanıtını vermiyor, ancak eklentileri kullanmayı düşünmeniz için sizi ikna edebilir: dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood

Ayarlarımı kişisel olarak Dropbox ile senkronize ediyorum. Beceriksizdir ama aşağı yukarı üzerinde düşünmek zorunda kalmadan çalışır. Kullandığım ve istediğim şey için iyi çalıştığını bildiğim bir eklenti Command- T'dir ( github.com/wincent/Command-T ). Ctrl-P bir alternatif olabilir ( vim.org/scripts/script.php?script_id=3736 ).
FX

1
Danielmiessler.com/study/vim'i gördünüz ? Vimrc'sini + ihtiyaç duyduğu tüm fişleri Github'a yerleştirme konusunda çok akıllı bir pratiğe sahip ... gittiği her yerde onu klonlayabilir ve işte Vim tam da istediği gibi. Brilliant
bobox

6
@bobox, on binlerce insan bunu yapıyor; bunda olağanüstü hiçbir şey yok.
romainl

Yanıtlar:


236

ST2 Ctrl+ 'ya en yakın eşdeğer ("en yakın", "tam" değil) P, hazır ol… CtrlP adlı bir eklentidir . Command-T veya FuzzyFinder gibi başka benzer eklentiler de var .

CtrlP kullanıyorum ve seviyorum ama "eklentisiz" olma kararınızı tüm kalbimle destekliyorum. Gitmenin en kolay yolu değil ama uzun vadede karşılığını alacaktır.


Dosyaları açma

Dosya açmanın en basit yolu :e /path/to/filename. Neyse ki, sekme tamamlama ve joker karakterler elde edersiniz: klasik *ve özel **olan, "herhangi bir alt dizin" anlamına gelen.

Tüm bunları birleştirerek şunları yapabilirsiniz:

:e **/*foo<Tab>

fooçalışma dizininin altında adlarında bulunan tüm dosyalar arasından seçim yapmak için veya:

:e **/*foo/*bar<Tab>

çalışma dizininin herhangi bir yerinde, adında bulunan barherhangi bir alt dizin altında adlarında bulunan tüm dosyaları seçmek için foo.

Tabii ki, işler için bu :tabe[dit], :sp[lit]ve :vs[plit]de.

Yine de bu komutlar bir dosyayla sınırlıdır. :nextBirden çok dosyayı açmak için kullanın :

:next **/*.js

ve bir göz atın :help arglist.


Arabellekler arasında atlama

:b[uffer] temel tampon değiştirme komutudur:

:b4         " switch to buffer number 4
:bn         " switch to next buffer in the buffer list
:bp         " switch to previous buffer in the buffer list
:bf         " switch to first buffer in the buffer list
:bl         " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b#         " switch to the alternate file

Bu komutların birçoğunun ve akrabalarının bir sayımı kabul ettiğini unutmayın.

:lsKomut gösterileri size yüklenen tamponların bir listesi. Yine de biraz "özel": tamponlar oluşturulduklarında bir numara atanırlar, böylece 1 2 5tamponları sildiğiniz gibi görünen bir listeye sahip olabilirsiniz . Bu biraz garip, evet ve bu, numarasına göre bir tampona geçişi biraz fazla zahmetli hale getiriyor. Kısmi adıyla geçiş tercih :b foo<Tab>ya da bisiklet :bn :bp.

Her neyse, işte tüm yüklü arabellekleri listeleyen ve sizin için istemi dolduran, arabellek numarasını yazmanızı ve tuşuna basmanızı bekleyen harika bir eşleme <enter>:

nnoremap gb :ls<CR>:b<Space>

Bu eşlemeyle, başka bir tampona geçmek şu kadar basittir:

gb
(quickly scanning the list)
3<CR>

veya:

gb
(quickly scanning the list)
foo<tab><CR>

Fikir , Bairui'nin Vim infografik koleksiyonundan alınan bu görüntüden geliyor :

Uçmak ve bisiklete binmek

Vim ayrıca <C-^>(veya <C-6>bazı klavyelerde) - normal mod eşdeğeri :b#- geçerli ara bellek ile bir önceki arasında atlamak için vardır. Sık sık iki tampon arasında geçiş yapıyorsanız kullanın.

Arabellekler hakkındaki her şeyi okuyun :help buffers.


Beyana git

Bir dosya içinde gdveya kullanabilirsiniz gD.

Bir proje içinde, Vim'in "etiketler" özelliği arkadaşınızdır ancak ctags veya cscope gibi harici bir kod indeksleyiciye ihtiyacınız olacaktır. En temel komutlar :tag foove <C-]>imleç bir yöntem adı üzerindedir. Her iki araç da iyi Vim entegre edilmiştir: bakınız :help tags, :help ctagsve :help cscope.

Değeri ne olursa olsun, bir proje içinde hareket etmek için kapsamlı bir şekilde etiket gezintisi kullanıyorum ( çoğunlukla CtrlP'leri :CtrlPTagve :CtrlPBufTagkomutları kullanarak , ancak buit-in olanları da kullanarak) ve en sevdiğim "genel" arabellek değiştirme yöntemi isme göre.


Yapılandırmanızı dağıtma

Bir çok Vim kullanıcısı konfigürasyonlarını versiyon kontrolü altına alır, bu da kendi konfigürasyonunuzu yeni bir makineye kurmayı çok hızlı ve kolay hale getirir . Bunu düşün.


DÜZENLE

Birkaç ay önce, eski bir Vim'e sahip uzak bir makinede çalışmak zorunda kaldım. Uygun bir Vim kurabilir ve kendi çok sevdiğim yapılandırmamı klonlayabilirdim ama bu sefer "testereyi keskinleştirmek" için hafif yolculuk yapmaya karar verdim. Hızla bir minimalist oluşturdum .vimrcve yarı unutulmuş birkaç yerel özelliği yeniden ziyaret ettim . Bu işten sonra, CtrlP'nin o kadar da gerekli olmadığına karar verdim ve ondan kurtuldum: yerel özellikler ve özel haritalamalar o kadar seksi değil ama işi fazla bağımlılık olmadan hallediyorlar.


Dosyalarla hokkabazlık

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *

:findset pathdoğru yaptığınız anda gerçekten harika bir komuttur . Ayarlarımla, geçerli dizinin altındaki ,ffoo<Tab>tüm dosyaları fooyinelemeli olarak bulacağım . Hızlı, sezgisel ve hafiftir. Tabii ki, :editarkadaşlarla ve arkadaşlarla aynı tamamlamadan ve joker karakterlerden yararlanıyorum .

Süreci daha da hızlı hale getirmek için, aşağıdaki eşlemeler projenin tüm bölümlerini atlamama ve dosyaları geçerli dosyanın dizini altında yinelemeli olarak bulmama izin veriyor:

nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>

UYARI! pathSeçenektir son derece güçlü. Yukarıdaki değer - - benim için işe .,**yarıyor , ancak kullandığım dillerin standart bir kitaplığı yok. Doğru değeri tamamen bağlıdır senin ihtiyaçlarına.


Tamponlarla hokkabazlık

set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

Yukarıdaki eşleştirmeler, "wildmenu" içindeki mevcut arabellekleri boş bir komut istemiyle listeleyerek, ya menüde gezinmeme ya <Tab>da birkaç harf yazmama <Tab>ve listeyi daraltmama izin veriyor . Yukarıdaki dosya eşleştirmelerinde olduğu gibi, süreç hızlıdır ve neredeyse sorunsuzdur.

nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>

Bu eşlemeler kendileri için konuşuyor.


Etiketlerle hokkabazlık

nnoremap <leader>j :tjump /

Bu eşleme, tüm kelime araması yerine normal ifade aramasını kullanır, böylece ,jba<Tab>etiketi bulmak için yapabilirim foobarbaz().

Evet, bulanık eşleştirme bağımlılık yapar, ancak onsuz da üretken olabilirsiniz. Ve maliyetin bir kısmı için.


DAHA FAZLA DÜZENLEME

Birkaç ek ipucu / püf noktası…


Wildmenu seçenekleri

İle etkinleştirilen "wildmenu" set wildmenudosya / arabellek gezinmesini kolaylaştırır. Davranışı, araştırmaya değer bir dizi seçenek tarafından yönetilir:

wildmode Vim'e "wildmenu" nun nasıl davranmasını istediğinizi söyler:

set wildmode=list:full

wildignore tüm kusurları filtreler:

set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*

wildignorecasearamanızı foove bulmanızı sağlar Foo:

set wildignorecase

Dosya işaretleri

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

Geçenlerde bu mücevheri başka birinin içinde buldum ~/.vimrc. Bir arabellekten ayrıldığınızda imlecin tam konumunda bir dosya işareti oluşturur, böylece nerede olursanız 'Jolun düzenlediğiniz en son JavaScript arabelleğine atlar. Harika.


2
+1. "Herhangi bir alt dizin" ile kombinasyon halinde hiçbir fikrim yoktu, :eancak bundan sonra onu çok kullanacağım . Ctrl-P'ye giren ve ondan çok şey öğrenebilen işe hayret ediyorum ama benim için işe yaramadı. Bunun biraz sümüklü olduğunu ve bu nedenle çalışırken düşünce trenimi kesintiye uğrattığını gördüm (sistemim, ayarlarım, kendim olabilir ama araştırmadım)
Lieven Keersmaekers

2
**gerçekten harika.
romainl

1
gbHarita için tekrar oy vermeyi çok isterim . Çok kullanacağım bir tane daha. Denediğim tüm tampon eklentileri (CtrlP, bufExplorer, ...) bu kadar hızlı değil (verildi, daha fazla işlevsellik sunuyorlar, ancak benim onları kullanmaya devam etmem için yeterli değil) .
Lieven Keersmaekers

2
@LievenKeersmaekers, bu ben nereden bulduğunu ve bu saçma resim nereden geldiğini olduğunu. Teşekkürler Bairui!
romainl

4
Bu şimdiye kadarki en büyük cevap olabilir.
craigp

5

Cevap büyük ölçüde tercihlerinize ve koşullarınıza bağlıdır. Bazı örnekler:

  • Çoğunlukla iki dosyaysa (örneğin, bir C başlığı ve uygulama dosyası), <C-^>çok kullanışlıdır. Genel olarak, alternatif dosya önemli bir kavramdır.
  • Büyük bir düzenleyici penceresi kullanırsanız, pencere, pencereyi :splitbulmaktan bir arabelleği bulma sorununu tersine çevirir (tüm arabellekleri açtıktan sonra). Sen kullanabilirsiniz [N]<C-w><C-w>hızlı bir şekilde geçiş yapmak için.
  • Eğer (birkaç) tampon numarasını ezberleyebiliyorsanız, :[N]b[uffer]ve :[N]sb[uffer]komutları oldukça kullanışlıdır; :lssize sayıları söyler.

Eklentiler (veya en azından özel eşlemeler) işleri çok geliştirebilir ve bu konuda vim.org'da çok çeşitli var . Yapılandırmanızı dağıtmak için çeşitli mekanizmalar vardır (Pathogen + GitHub, Dropbox, ...) veya Vim ile birlikte gelen netrw eklentisi aracılığıyla sunucu dosyalarını uzaktan düzenleyebilirsiniz .


4
Muhtemelen ctags, cscope, gtags, id ve arkadaşlardan bahsetmeye değer. Büyük harf işaretleri kullanmayı çok yardımcı buluyorum. mAİşareti Ave geri dönmek için "" A "'yı saklamak için kullanın . Explorer'a hangi döndüğünü öğrendikten sonra netrw'yi çok daha faydalı buluyorum :Rex. :b, :e, Ve diğerleri gibi joker alabilir *ve **. :bKomut kısmi dosya adı alabilir. Bunu <c-d>oldukça uzağa gidebileceğiniz vahşi menü ile birleştirin . Eklentilere gelince, raylara özel gezinme komutları veya CtrlP gibi daha genel bir şey sağlayan rail.vim gibi belirli bir etki alanına özgü bir şey kullanabilirsiniz.
Peter Rincker

@PeterRincker: Markalardan bahsettiğiniz için +1. İşaretli bir cevap oluşturmanızı öneririm.
Helbreder

<C - ^> ve [N] <Cw> <Cw> ne anlama geliyor?
Josh Desmond

5

Bazen bir dosya listesinde sırayla ilerlemek de kullanışlıdır (örneğin, vim *.phpaynı anda birkaç dosyayı açmak gibi bir şey yaptıysanız ). Sonra kullanabilirsiniz :n[ext](yanı sıra :prev[ious], :fir[st]ve :la[st]) (diğer yanıtlar önerilen ne ek olarak) navigasyon için.


4

Herhangi bir eklenti olmadan komut satırında joker sekme tamamlama yapabilirsiniz. Örneğin

:e src/**/foo*<tab>

./src altındaki dizin ağacında 'foo' ile başlayan tüm dosyalar arasında dolaşmanıza ve düzenlemek istediğinizi seçmenize izin verir.

Dosyayı zaten düzenlediyseniz ve hala bir arabellekteyse, o zaman ona geçiş yapabilirsiniz:

:b foo<tab>

Bu, yolda 'foo' ile tüm arabellekler arasında dönecektir. İstediğiniz davranışı elde etmek için wildmode ve wildmenu seçeneklerini ayarlamanız gerekebilir. Sahibim

wildmode=longest:full
wildmenu

.vimrc dosyamda.


2

Bir dosya adındaysanız ve o dosyaya atlamak istiyorsanız, gfbunu sizin için yapacaktır. Eklenti olmayan ctag'leri de kullanmayı seviyorum ; sadece etiketleri oluşturursunuz ve kod tabanınızda kolayca atlayabilirsiniz.


1

Vim düzenleyicide dosyalar arasında geçiş yapmak istiyorsanız, lütfen aşağıdaki cevaba bakın

EscDüzenleme modundan çıkmak için önce tuşuna basın .

Ardından :emevcut dosya yolunu kontrol etmek için yazın .

başka bir dosyaya gitmek istiyorsanız, bunu :e /path-of-file.txt/kullanarak yazabilirsiniz .

Önceki dosyaya gitmek istiyorsanız :e#, önceki dosya yoluna geçişi yazmanız yeterlidir .


0

Vim ile aynı sorunu yaşadım.

İstediğim son şey, dosya değiştirme kadar sıradan bir görev için eklentilere güvenmek.

Aşağıdaki satırları ekledim .vimrc

set path+=**
set wildmenu

Ve BAM! Artık :find any/filename/in/any/folder/vim projenin kök dizininde olduğu sürece yapabilirim . Sekme tamamlama çalışır. Joker karakterler işe yarıyor!

Dosyalar zaten açıldığında ve arka planda bir ton arabellek olduğunda ( :lstüm arabellekleri görmek için kullanabilirsiniz ), çalıştırma :b any/file <TAB>tüm arabellekleri bulamaz ve gerekli dosyaya atlar. Benzersiz olmaması durumunda , sekme kullanılarak seçilebilen bir sekme menüsü (dolayısıyla .vimrc'deki 2. satır) olacaktır.

Cevabım bu harika videodan geliyor:
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
Daha fazla numara var ve izlemenizi tavsiye ederim.

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.