Bagaimana cara menukar file antar windows di VIM?

123

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.

mdrozdziel.dll
sumber
2
Yang Anda maksud dengan "menukar jendela itu di tempat" adalah "membuka buffer yang ada di jendela A di jendela B, dan sebaliknya, tanpa mengubah posisi jendela"?
hcs42
1
Ya, inilah yang saya inginkan.
mdrozdziel

Jawaban:

304

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.

DrAl
sumber
16
Ini harus menjadi "jawaban terbaik" - fungsionalitas asli, bukan Vimscript kustom.
David Rivers
1
Tidak sepenuhnya, tidak. Ada banyak kasus penggunaan yang tidak dapat dilakukan dengan menggunakan manajemen jendela bawaan tanpa merusak dan membuat ulang jendela. Skrip buffer swap memungkinkan kasus penggunaan ini.
bobpaul
perhatikan bahwa ctl-w juga berfungsi. ctl-W akan menutup jendela di beberapa emulator terminal.
tanggal
7

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:

  1. Pilih jendela A (baik dengan mouse atau dengan perintah keyboard)
  2. Tekan <c-w>y(menarik nomor buffer)
  3. Pilih jendela B
  4. Tekan <c-w>pp(tempel buffer)
  5. Pilih jendela A
  6. Tekan <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
hcs42
sumber
4

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

  1. <Leader>yw untuk menarik jendela.
  2. Pindahkan kursor Anda ke jendela lain.
  3. <Leader>pw untuk menempelkan jendela itu, menukarnya dengan posisi yang pertama.

Kombinasi tombol tentu saja dapat dikonfigurasi dengan preferensi Anda.

wes
sumber
1

Sebagai <c-w>ratau <c-w>xmemiliki batasan bahwa Anda tidak dapat memutar atau menukar jendela Ketika pemisahan jendela vertikal dan horizontal dicampur. Dan <c-w>Hdapat 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>
Bohr
sumber
1

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 terbuka
  • ctrl-w h fokuskan jendela ke kiri
  • ctrl-w j fokuskan jendela ke bawah
  • ctrl-w k fokuskan jendela ke atas
  • ctrl-w l fokuskan jendela ke kanan
  • ctrl-w r putar semua jendela
  • ctrl-w x tukar jendela saat ini dengan tetangganya
  • ctrl-w H pindahkan jendela saat ini ke paling kiri
  • ctrl-w J pindahkan jendela saat ini ke bawah
  • ctrl-w K pindahkan jendela saat ini ke atas
  • ctrl-w L pindahkan jendela saat ini ke paling kanan
Aman Dogra
sumber
3
Apa alasan menambahkan jawaban yang tidak memberikan informasi berguna baru ke postingan? Ini dijawab dengan sempurna 6 tahun yang lalu. Apakah Anda melakukan kampanye iklan untuk siaran langsung?
mdrozdziel
@mdrozdziel Saya menghargai jawaban ini 9 tahun setelah OP. Jawaban paling ringkas hanya dengan info yang saya inginkan.
roro