Semua jawaban di atas sangat bagus, sayangnya solusi ini tidak bekerja dengan baik jika dikombinasikan dengan QuickFix atau LocationList windows (saya mengalami masalah saat mencoba mendapatkan buffer pesan kesalahan Ale untuk bekerja dengan ini).
Larutan
Karena itu saya menambahkan baris kode tambahan untuk menutup semua jendela ini sebelum melakukan swap.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Kode total terlihat seperti;
" Making swapping windows easy
function! SwapWindowBuffers()
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
if !exists("g:markedWinNum")
" set window marked for swap
let g:markedWinNum = winnr()
:echo "window marked for swap"
else
" mark destination
let curNum = winnr()
let curBuf = bufnr( "%" )
if g:markedWinNum == curNum
:echo "window unmarked for swap"
else
exe g:markedWinNum . "wincmd w"
" switch to source and shuffle dest->source
let markedBuf = bufnr( "%" )
" hide and open so that we aren't prompted and keep history
exe 'hide buf' curBuf
" switch to dest and shuffle source->dest
exe curNum . "wincmd w"
" hide and open so that we aren't prompted and keep history
exe 'hide buf' markedBuf
:echo "windows swapped"
endif
" unset window marked for swap
unlet g:markedWinNum
endif
endfunction
nmap <silent> <leader>mw :call SwapWindowBuffers()<CR>
Kredit untuk fungsi swap Brandon Orther
Mengapa itu dibutuhkan?
Alasan fungsi swap tidak berfungsi dengan baik tanpa menghapus semua jendela QuickFix (QF) dan LocationList (LL) terlebih dahulu adalah karena jika induk dari buffer QF / LL get's hidden (dan tidak ditampilkan di jendela), QF / LL jendela digabungkan dengan itu dihapus. Ini bukan masalah dalam dirinya sendiri tetapi ketika jendela menyembunyikan semua nomor jendela dipindahkan dan swap kacau karena nomor yang disimpan dari jendela yang ditandai pertama tidak (berpotensi) tidak ada lagi.
Untuk menempatkan perspektif ini:
Tanda jendela pertama
____________________
| one | -> winnr = 1 marked first g:markedWinNum=1
| | -> bufnr = 1
|__________________|
| two (QF window | -> winnr = 2
| coupled to one |
|__________________|
| three | -> winnr = 3
| | -> bufnr = 2
|__________________|
Tanda jendela kedua
____________________
| one | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 1
|__________________|
| two (QF window | -> winnr = 2
| coupled to one) |
|__________________|
| three | -> winnr = 3 marked second curNum=3
| | -> bufnr = 2 curBuf=2
|__________________|
Switch buffer pertama, window satu diisi dengan buffer window tiga. Dengan demikian jendela QF dihapus karena tidak memiliki jendela induk lagi. Ini mengatur ulang nomor windows. Perhatikan bahwa curNum (jumlah jendela yang dipilih kedua) menunjuk ke jendela yang tidak ada lagi.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2 curNum=3
| | -> bufnr = 2 curBuf=2
|__________________|
Jadi ketika mengganti buffer kedua, ia mencoba untuk memilih jendela curNum, yang tidak ada lagi. Jadi itu menciptakannya dan mengaktifkan buffer, menghasilkan satu jendela yang tidak diinginkan untuk tetap diam.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|