Wszystkie powyższe odpowiedzi są świetne, niestety te rozwiązania nie działają dobrze w połączeniu z oknami QuickFix lub LocationList (uruchomiłem ten problem, próbując zmusić bufor komunikatów o błędach Ale do pracy z tym).
Rozwiązanie
Dlatego dodałem dodatkowy wiersz kodu, aby zamknąć wszystkie te okna przed wykonaniem zamiany.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Cały kod wygląda;
" 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>
Kredyty dla funkcji zamiany Brandon Orther
Dlaczego jest to potrzebne
Powodem, dla którego funkcje wymiany nie działają poprawnie bez uprzedniego usunięcia wszystkich okien QuickFix (QF) i LocationList (LL), jest to, że jeśli element nadrzędny bufora QF / LL get jest ukryty (i nigdzie nie pokazano w oknie), QF Połączone z nim okno / LL jest usuwane. Nie jest to problem sam w sobie, ale gdy okno się ukrywa, wszystkie numery okien są ponownie przypisywane, a zamiana jest pomieszana, ponieważ zapisana liczba pierwszego zaznaczonego okna już (potencjalnie) już nie istnieje.
Aby umieścić to w innej perspektywie:
Znak pierwszego okna
____________________
| one | -> winnr = 1 marked first g:markedWinNum=1
| | -> bufnr = 1
|__________________|
| two (QF window | -> winnr = 2
| coupled to one |
|__________________|
| three | -> winnr = 3
| | -> bufnr = 2
|__________________|
Drugi znak okna
____________________
| 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
|__________________|
Pierwszy przełącznik bufora, okno pierwsze jest wypełnione buforem okna trzeciego. W ten sposób okno QF jest usuwane, ponieważ nie ma już okna nadrzędnego. To zmienia kolejność numerów Windows. Zauważ, że curNum (numer drugiego wybranego okna) wskazuje na okno, które już nie istnieje.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2 curNum=3
| | -> bufnr = 2 curBuf=2
|__________________|
Więc przełączając drugi bufor, próbuje wybrać okno curNum, które już nie istnieje. Tworzy go i przełącza bufor, co powoduje, że jedno niechciane okno jest nadal otwarte.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|