위의 모든 대답은 훌륭하지만 불행히도 이러한 솔루션은 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
|__________________|
두 번째 창 표시
____________________
| 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 (두 번째로 선택된 창의 수)이 더 이상 존재하지 않는 창을 가리키고 있습니다.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2 curNum=3
| | -> bufnr = 2 curBuf=2
|__________________|
따라서 두 번째 버퍼를 전환 할 때 더 이상 존재하지 않는 curNum 창을 선택하려고합니다. 따라서 버퍼를 생성하고 버퍼를 전환하여 원치 않는 하나의 창이 계속 열립니다.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|