VIM'de pencereler arasında dosya değişimi nasıl yapılır?


123

VIM ile çalışırken, her zaman birden çok pencerem görünür. Bazen bu pencereleri yer yer değiştirmenin kolay bir yolunu isterim. Bunu daha kolay hale getirmek için herhangi bir Eklenti, Makro vb. Var mı? BTW, MiniBufExplorer kullanıyorum.


2
"Bu pencereleri yerlerinde değiştirerek", "pencerelerin konumunu değiştirmeden, pencerede A penceresindeki arabelleği açmak ve tersi" demek mi istiyorsunuz?
hcs42

1
Evet, tam olarak istediğim şey bu.
mdrozdziel

Yanıtlar:


304

Size belirli bir miktar kontrol sağlayan yerleşik birkaç yararlı komut vardır, ancak kapsamlı değildir. Başlıca olanlar:

  • Ctrl- W, r(yani basılı tutun CTRL, basın W, bırakın CTRL, basın r) - pencereleri döndürür (İlk pencere ikinci pencere, ikincisi üçüncü pencere vb.)

  • Ctrl- W, x- mevcut pencereyi bir sonrakiyle değiştir

  • Ctrl- W, Shift- H- bu pencereyi en sola kaydırın

  • Ctrl- W, Shift- K- bu pencereyi en üste taşı

(ve benzer şekilde Ctrl- W, Shift- Jve Ctrl- W, Shift- için L). Görmek:

:help window-moving

daha fazla bilgi için.


16
Bu, "en iyi yanıt" olmalıdır - yerel işlevsellik, özel bir Vimscript değil.
David Rivers

1
Tamamen değil, hayır. Pencereleri yok etmeden ve yeniden oluşturmadan yerleşik pencere yönetimi kullanılarak yapılamayan birçok kullanım durumu vardır. Takas tamponları komut dosyası bu kullanım durumlarına izin verir.
bobpaul

ctl-w'nin de çalıştığını unutmayın. ctl-W, bazı uçbirim öykünücülerindeki pencereleri kapatır.
datakid

7

Vim pencerelerimi kopyalayıp yapıştırmak için vimrc'de aşağıdaki kod parçacığını yazdım ve kullanıyorum.

Bu, örneğin aşağıdaki kısayolları tanımlar:

  • <c-w>y: "Pencereyi değiştirir", yani geçerli penceredeki tampon numarasını global bir değişkende saklar.
  • <c-w>pp: "Pencereyi geçerli pencerenin yerine koyar", yani önceden kaydedilmiş arabellek numarasını okur ve bu arabelleği geçerli pencerede açar. Ayrıca, geçerli pencerede bulunan arabellek numarasını da depolar.

"Bu pencereleri yerlerinde değiştirerek", "pencerelerin konumunu değiştirmeden pencerede A penceresindeki arabelleği açmayı ve bunun tersini" kastediyorsanız, pencereleri değiştirmek için aşağıdaki klavye sırasını kullanabilirsiniz:

  1. A penceresini seçin (fareyle veya klavye komutlarıyla)
  2. Basın <c-w>y(tampon numarasını çekerek)
  3. B penceresini seçin
  4. Basın <c-w>pp(tamponu yapıştırarak)
  5. A penceresini seçin
  6. Basın <c-w>pp(tamponu tekrar yapıştırarak)

Yalnızca Vim> = 7.0'da çalışır.

if version >= 700
function! HOpen(dir,what_to_open)

    let [type,name] = a:what_to_open

    if a:dir=='left' || a:dir=='right'
        vsplit
    elseif a:dir=='up' || a:dir=='down'
        split
    end

    if a:dir=='down' || a:dir=='right'
        exec "normal! \<c-w>\<c-w>"
    end

    if type=='buffer'
        exec 'buffer '.name
    else
        exec 'edit '.name
    end
endfunction

function! HYankWindow()
    let g:window = winnr()
    let g:buffer = bufnr('%')
    let g:bufhidden = &bufhidden
endfunction

function! HDeleteWindow()
    call HYankWindow()
    set bufhidden=hide
    close
endfunction

function! HPasteWindow(direction)
    let old_buffer = bufnr('%')
    call HOpen(a:direction,['buffer',g:buffer])
    let g:buffer = old_buffer
    let &bufhidden = g:bufhidden
endfunction

noremap <c-w>d :call HDeleteWindow()<cr>
noremap <c-w>y :call HYankWindow()<cr>
noremap <c-w>p<up> :call HPasteWindow('up')<cr>
noremap <c-w>p<down> :call HPasteWindow('down')<cr>
noremap <c-w>p<left> :call HPasteWindow('left')<cr>
noremap <c-w>p<right> :call HPasteWindow('right')<cr>
noremap <c-w>pk :call HPasteWindow('up')<cr>
noremap <c-w>pj :call HPasteWindow('down')<cr>
noremap <c-w>ph :call HPasteWindow('left')<cr>
noremap <c-w>pl :call HPasteWindow('right')<cr>
noremap <c-w>pp :call HPasteWindow('here')<cr>
noremap <c-w>P :call HPasteWindow('here')<cr>

endif

4

Aynı zamanda benzer bir soru sordum : Özellikle keyfi olarak karmaşık bir düzeni değiştirmeden pencereleri değiştirmenin bir yolunu istedim. Önerilen çözümlerden birinden bir vim eklentisi oluşturdum. Adı WindowSwap.vim'dir ; bunu tercih ettiğiniz vim eklenti yöneticisi ile kurun ve bir koşuşturma yaşayın.

WindowSwap.vim ile,

  1. <Leader>yw bir pencere çekmek için.
  2. İmlecinizi başka bir pencereye taşıyın.
  3. <Leader>pw o pencereyi yapıştırmak için, onu ilk pencerenin konumu ile değiştirin.

Tuş kombinasyonları elbette tercihlerinize göre yapılandırılabilir.


1

Pencereleri döndüremeyeceğiniz veya değiştiremeyeceğiniz bir kısıtlama gibi <c-w>rveya <c-w>xkısıtlama var Dikey ve yatay pencere bölmeleri karıştığında. Ve <c-w>Hözellikle çok sayıda pencereniz olduğunda pencere düzenini beklentilerinizin ötesinde değiştirebilir.

Bu nedenle, pencere / arabellek değiştirme gereksinimlerinizi karşılamak için bazı işler yapabilirsiniz. İşte mevcut pencereyi sol üst pencereyle değiştirmeye bir örnek (tipik olarak onu dikey olarak büyütürüm):

function! SwitchMainWindow()
  let l:current_buf = winbufnr(0)
  exe "buffer" . winbufnr(1)
  1wincmd w
  exe "buffer" . l:current_buf
endfunction
nnoremap <c-w><c-e> :call SwitchMainWindow()<cr>

1

Bana göre http://vimcasts.org/episodes/working-with-windows/ bu soru için mükemmel bir cevaba sahip. Kısaca:

  • ctrl-w w açık pencereler arasında geçiş yap
  • ctrl-w h pencereyi sola odakla
  • ctrl-w j pencereyi aşağıya odakla
  • ctrl-w k pencereyi yukarı odakla
  • ctrl-w l pencereyi sağa odakla
  • ctrl-w r tüm pencereleri döndür
  • ctrl-w x mevcut pencereyi komşusuyla değiştir
  • ctrl-w H mevcut pencereyi en sola taşı
  • ctrl-w J mevcut pencereyi alta taşı
  • ctrl-w K geçerli pencereyi en üste taşı
  • ctrl-w L mevcut pencereyi en sağa taşı

3
Gönderiye yeni yararlı bilgiler getirmeyen bir yanıt eklemenin nedeni nedir? Bu 6 yıl önce mükemmel bir şekilde cevaplandı. Vimcast'ler için reklam kampanyası mı yapıyorsunuz?
mdrozdziel

@mdrozdziel Bu cevabı OP'den 9 yıl sonra takdir ediyorum. Sadece istediğim bilgiyle en kısa cevap.
roro
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.