Yukarıdaki yanıtların hepsi harika, ne yazık ki bu çözümler QuickFix veya LocationList pencereleri ile birlikte iyi çalışmıyor (Ale hata mesajı arabelleği bununla çalışmak için çalışırken bu sorunla karşılaştım).
Çözüm
Bu yüzden takas yapmadan önce tüm bu pencereleri kapatmak için ekstra bir kod satırı ekledim.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Toplam kod şuna benzer;
" 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>
Brandon Orther'e takas fonksiyonu kredileri
Neden gerekli?
Takas işlevlerinin önce tüm QuickFix (QF) ve LocationList (LL) pencerelerini kaldırmadan düzgün çalışmamasının nedeni, QF / LL'nin üst öğesi arabelleğin gizlenmesi (ve hiçbir yerde bir pencerede gösterilmemesi), QF'nin / LL penceresi ona bağlı olarak kaldırılır. Bu kendi başına bir sorun değildir, ancak pencere gizlendiğinde tüm pencere numaraları yeniden atanır ve ilk işaretli pencerenin kaydedilen numarası (potansiyel olarak) artık mevcut olmadığından takas bozulur.
Bunu yanlış anlamak için:
İlk pencere işareti
____________________
| one | -> winnr = 1 marked first g:markedWinNum=1
| | -> bufnr = 1
|__________________|
| two (QF window | -> winnr = 2
| coupled to one |
|__________________|
| three | -> winnr = 3
| | -> bufnr = 2
|__________________|
İkinci pencere işareti
____________________
| 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
|__________________|
Birinci tampon anahtarı, birinci pencere üçüncü pencerenin tamponu ile doldurulur. Böylece QF penceresi artık üst penceresi olmadığından kaldırılır. Bu, pencere numaralarını yeniden düzenler. CurNum'un (ikinci olarak seçilen pencerenin sayısı) artık var olmayan bir pencereyi gösterdiğini unutmayın.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2 curNum=3
| | -> bufnr = 2 curBuf=2
|__________________|
Bu nedenle, ikinci arabelleği değiştirirken, artık bulunmayan curNum penceresini seçmeye çalışır. Böylece onu oluşturur ve arabelleği değiştirerek istenmeyen bir pencerenin hareketsiz kalmasını sağlar.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|