Toutes les réponses ci-dessus sont excellentes, malheureusement ces solutions ne fonctionnent pas bien en combinaison avec les fenêtres QuickFix ou LocationList (j'ai rencontré ce problème en essayant d'obtenir le tampon de message d'erreur Ale pour fonctionner avec cela).
Solution
J'ai donc ajouté une ligne de code supplémentaire pour fermer toutes ces fenêtres avant de faire le swap.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Le code total ressemble à;
" 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>
Crédits pour la fonction swap à Brandon Orther
Pourquoi est-il nécessaire
La raison pour laquelle les fonctions d'échange ne fonctionnent pas correctement sans supprimer toutes les fenêtres QuickFix (QF) et LocationList (LL) est d'abord parce que si le parent du tampon QF / LL est get caché (et nulle part affiché dans une fenêtre), le QF / La fenêtre LL qui lui est couplée est supprimée. Ce n'est pas un problème en soi, mais lorsque la fenêtre se cache, tous les numéros de fenêtre sont réaffectés et l'échange est foiré car le numéro enregistré de la première fenêtre marquée n'existe (potentiellement) plus.
Pour mettre cette perspective en perspective:
Première marque de fenêtre
____________________
| one | -> winnr = 1 marked first g:markedWinNum=1
| | -> bufnr = 1
|__________________|
| two (QF window | -> winnr = 2
| coupled to one |
|__________________|
| three | -> winnr = 3
| | -> bufnr = 2
|__________________|
Deuxième marque de fenêtre
____________________
| 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
|__________________|
Premier commutateur de tampon, la fenêtre un est remplie du tampon de la fenêtre trois. Ainsi, la fenêtre QF est supprimée car elle n'a plus de fenêtre parente. Cela réorganise les numéros de fenêtres. Notez que curNum (le numéro de la deuxième fenêtre sélectionnée) pointe vers une fenêtre qui n'existe plus.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2 curNum=3
| | -> bufnr = 2 curBuf=2
|__________________|
Ainsi lors du basculement du second buffer, il essaie de sélectionner la fenêtre curNum, qui n'existe plus. Ainsi, il le crée et commute le tampon, ce qui entraîne l'ouverture d'une fenêtre indésirable.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|