Alle oben genannten Antworten sind großartig, leider funktionieren diese Lösungen nicht gut in Kombination mit QuickFix oder LocationList Windows (ich bin auf dieses Problem gestoßen, als ich versucht habe, den Ale-Fehlermeldungspuffer damit zum Laufen zu bringen).
Lösung
Deshalb habe ich eine zusätzliche Codezeile hinzugefügt, um alle diese Fenster vor dem Tausch zu schließen.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Der gesamte Code sieht wie folgt aus;
" 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>
Kredite für die Swap-Funktion an Brandon Orther
Warum sie gebraucht wird
Der Grund, warum die Swap-Funktionen nicht richtig funktionieren, ohne vorher alle QuickFix (QF)- und LocationList (LL)-Fenster zu entfernen, liegt darin, dass, wenn der übergeordnete QF/LL-Puffer ausgeblendet wird (und nirgendwo in einem Fenster angezeigt wird), das mit ihm verbundene QF/LL-Fenster entfernt wird. Dies ist an sich kein Problem, aber wenn das Fenster ausgeblendet wird, werden alle Fensternummern neu zugewiesen, und der Tausch wird durcheinander gebracht, da die gespeicherte Nummer des ersten markierten Fensters (möglicherweise) nicht mehr existiert.
Um dies in die richtige Perspektive zu rücken:
Erste Fenstermarkierung
____________________
| one | -> winnr = 1 marked first g:markedWinNum=1
| | -> bufnr = 1
|__________________|
| two (QF window | -> winnr = 2
| coupled to one |
|__________________|
| three | -> winnr = 3
| | -> bufnr = 2
|__________________|
Zweite Fenstermarkierung
____________________
| 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
|__________________|
Erster Pufferwechsel, Fenster eins wird mit dem Puffer von Fenster drei gefüllt. Somit wird das QF-Fenster entfernt, da es kein übergeordnetes Fenster mehr hat. Dadurch werden die Fensternummern neu angeordnet. Beachten Sie, dass curNum (die Nummer des zweiten ausgewählten Fensters) auf ein Fenster zeigt, das nicht mehr existiert.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2 curNum=3
| | -> bufnr = 2 curBuf=2
|__________________|
Beim Umschalten des zweiten Puffers wird also versucht, das Fenster curNum auszuwählen, das nicht mehr existiert. Also wird es erstellt und der Puffer umgeschaltet, was dazu führt, dass ein unerwünschtes Fenster noch offen ist.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|