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.
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.
Yanıtlar:
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.
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:
<c-w>y
(tampon numarasını çekerek)<c-w>pp
(tamponu yapıştırarak)<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
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,
<Leader>yw
bir pencere çekmek için. <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.
Pencereleri döndüremeyeceğiniz veya değiştiremeyeceğiniz bir kısıtlama gibi <c-w>r
veya <c-w>x
kı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>
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ş yapctrl-w h
pencereyi sola odaklactrl-w j
pencereyi aşağıya odaklactrl-w k
pencereyi yukarı odaklactrl-w l
pencereyi sağa odaklactrl-w r
tüm pencereleri döndürctrl-w x
mevcut pencereyi komşusuyla değiştirctrl-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şı