Saat saya bekerja dengan VIM, saya selalu melihat beberapa jendela. Terkadang saya ingin memiliki cara yang mudah, untuk menukar jendela itu di beberapa tempat. Apakah ada Plugin, Makro, dll untuk mempermudah? BTW, saya menggunakan MiniBufExplorer.
Saat saya bekerja dengan VIM, saya selalu melihat beberapa jendela. Terkadang saya ingin memiliki cara yang mudah, untuk menukar jendela itu di beberapa tempat. Apakah ada Plugin, Makro, dll untuk mempermudah? BTW, saya menggunakan MiniBufExplorer.
Jawaban:
Ada beberapa perintah berguna bawaan yang memberi Anda sejumlah kontrol, tetapi tidak komprehensif. Yang utama adalah:
Ctrl- W, r(yaitu tahan CTRL, tekan W, lepaskan CTRL, tekan r) - yang memutar jendela (Jendela pertama menjadi yang kedua, yang kedua menjadi yang ketiga, dll.)
Ctrl- W, x- tukar jendela saat ini dengan yang berikutnya
Ctrl- W, Shift- H- pindahkan jendela ini ke paling kiri
Ctrl- W, Shift- K- pindahkan jendela ini ke atas
(dan juga untuk Ctrl- W, Shift- Jdan Ctrl- W, Shift- L). Lihat:
:help window-moving
untuk informasi lebih lanjut.
Saya menulis dan telah menggunakan potongan kode berikut di vimrc saya untuk menyalin-tempel jendela Vim saya.
Ini mendefinisikan misalnya pintasan berikut:
<c-w>y
: "Yanks the window", yaitu menyimpan jumlah buffer di jendela saat ini dalam variabel global.<c-w>pp
: "Menempatkan jendela di Tempat jendela saat ini", yaitu membaca nomor buffer yang disimpan sebelumnya dan membuka buffer itu di jendela saat ini. Ini juga menyimpan jumlah buffer yang dulu ada di jendela saat ini.Jika dengan "menukar jendela itu di tempat", yang Anda maksud adalah "membuka buffer di jendela A di jendela B, dan sebaliknya, tanpa mengubah posisi jendela", Anda dapat menggunakan urutan keyboard berikut untuk menukar jendela:
<c-w>y
(menarik nomor buffer)<c-w>pp
(tempel buffer)<c-w>pp
(tempelkan buffer lagi)Ini hanya bekerja di Vim> = 7.0.
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
Saya mengajukan pertanyaan serupa sekitar waktu yang sama: Saya menginginkan cara untuk menukar jendela secara khusus tanpa mengubah tata letak yang rumit secara sembarangan. Saya akhirnya membuat plugin vim dari salah satu solusi yang disarankan. Ini disebut WindowSwap.vim ; menginstalnya dengan pengelola plugin vim pilihan Anda dan memutarnya.
Dengan WindowSwap.vim, Anda cukup
<Leader>yw
untuk menarik jendela. <Leader>pw
untuk menempelkan jendela itu, menukarnya dengan posisi yang pertama.Kombinasi tombol tentu saja dapat dikonfigurasi dengan preferensi Anda.
Sebagai <c-w>r
atau <c-w>x
memiliki batasan bahwa Anda tidak dapat memutar atau menukar jendela Ketika pemisahan jendela vertikal dan horizontal dicampur. Dan <c-w>H
dapat membuat tata letak jendela berubah melebihi harapan Anda terutama bila Anda memiliki banyak jendela.
Jadi Anda dapat melakukan beberapa pekerjaan untuk memenuhi kebutuhan khusus Anda akan pengalihan jendela / buffer. Berikut adalah contoh untuk mengganti jendela saat ini dengan jendela kiri atas (biasanya saya membuatnya dimaksimalkan secara vertikal):
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>
Menurut pendapat saya, http://vimcasts.org/episodes/working-with-windows/ memiliki jawaban yang tepat untuk pertanyaan ini. Secara singkat:
ctrl-w w
siklus antara jendela yang terbukactrl-w h
fokuskan jendela ke kirictrl-w j
fokuskan jendela ke bawahctrl-w k
fokuskan jendela ke atasctrl-w l
fokuskan jendela ke kananctrl-w r
putar semua jendelactrl-w x
tukar jendela saat ini dengan tetangganyactrl-w H
pindahkan jendela saat ini ke paling kirictrl-w J
pindahkan jendela saat ini ke bawahctrl-w K
pindahkan jendela saat ini ke atasctrl-w L
pindahkan jendela saat ini ke paling kanan