上記の回答はすべて素晴らしいものですが、残念ながらこれらのソリューションは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>
Brandon Ortherへのスワップ機能のクレジット
なぜ必要なのか
すべてのQuickFix(QF)およびLocationList(LL)ウィンドウを最初に削除しないと、スワップ関数が適切に機能しない理由は、QF / LLの親がgetを非表示にすると(ウィンドウのどこにも表示されない)、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
|__________________|
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
|__________________|
最初のバッファスイッチ、ウィンドウ1はウィンドウ3のバッファで埋められます。したがって、親ウィンドウがなくなったため、QFウィンドウは削除されます。これにより、ウィンドウ番号が再配置されます。curNum(2番目に選択されたウィンドウの番号)が、存在しないウィンドウを指していることに注意してください。
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2 curNum=3
| | -> bufnr = 2 curBuf=2
|__________________|
そのため、2番目のバッファを切り替えると、もう存在しないcurNumウィンドウが選択されます。したがって、それを作成してバッファを切り替え、不要なウィンドウを1つ開いたままにします。
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|