Alle oben genannten Antworten sind großartig. Leider funktionieren diese Lösungen in Kombination mit QuickFix- oder LocationList-Fenstern nicht gut (ich habe dieses Problem ausgeführt, als ich versucht habe, den Ale-Fehlermeldungen-Puffer dazu zu bringen, damit zu funktionieren).
Lösung
Daher habe ich eine zusätzliche Codezeile hinzugefügt, um alle diese Fenster vor dem Austausch zu schließen.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Der Gesamtcode sieht aus wie;
" 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>
Credits für die Swap-Funktion an Brandon Orther
Warum es gebraucht wird
Der Grund, warum die Swap-Funktionen nicht ordnungsgemäß funktionieren, ohne zuerst alle QuickFix- (QF) und LocationList- (LL) Fenster zu entfernen, liegt darin, dass das QF ausgeblendet wird (und nirgendwo in einem Fenster angezeigt wird), wenn das übergeordnete Element des QF / LL-Puffers das Get versteckt Das damit gekoppelte / LL-Fenster wird entfernt. Dies ist an sich kein Problem, aber wenn das Fenster ausgeblendet ist, werden alle Fensternummern neu zugewiesen und der Austausch wird durcheinander gebracht, da die gespeicherte Nummer des ersten markierten Fensters (möglicherweise) nicht mehr vorhanden ist.
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 Fenstermarke
____________________
| 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 Pufferschalter, 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 zweitausgewählten Fensters) auf ein Fenster verweist, 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 versucht, das nicht mehr vorhandene curNum-Fenster auszuwählen. Es erstellt es also und wechselt den Puffer, was dazu führt, dass ein unerwünschtes Fenster noch geöffnet ist.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|