Усі вищезазначені відповіді чудові, на жаль, ці рішення не працюють добре в поєднанні з вікнами QuickFix або LocationList (я зіткнувся з цією проблемою, намагаючись примусити буфер повідомлення про помилку Ale працювати з цим).
Рішення
Тому я додав додатковий рядок коду, щоб закрити всі ці вікна, перш ніж робити своп.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Загальний код схожий;
" 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>
Кредити за функцію підкачки Брендону Ортеру
Для чого це потрібно
Причина функцій підкачки не працює належним чином, не видаляючи спочатку всі вікна QuickFix (QF) та LocationList (LL), тому що, якщо батьківський буфер QF / LL буфер отримує приховано (і ніде не відображається у вікні), QF / Приєднане до нього вікно LL видаляється. Це само по собі не є проблемою, але коли вікно приховує всі номери вікна перепризначені, а підкачка замішана, оскільки збережене число першого позначеного вікна вже (можливо) більше не існує.
Щоб поставити це невпевнено:
Перша позначка вікна
____________________
| one | -> winnr = 1 marked first g:markedWinNum=1
| | -> bufnr = 1
|__________________|
| two (QF window | -> winnr = 2
| coupled to one |
|__________________|
| three | -> winnr = 3
| | -> bufnr = 2
|__________________|
Друга позначка вікна
____________________
| 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
|__________________|
Перший буферний перемикач, перше вікно заповнено буфером вікна три. Таким чином, вікно QF видаляється, оскільки воно вже не має батьківського вікна. Це переставляє номери вікон. Зауважте, що curNum (номер другого вибраного вікна) вказує на вікно, яке вже не існує.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2 curNum=3
| | -> bufnr = 2 curBuf=2
|__________________|
Тому при перемиканні другого буфера він намагається вибрати вікно curNum, яке більше не існує. Так він створює його і перемикає буфер, в результаті чого одне небажане вікно залишається відкритим.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|