Tất cả các câu trả lời trên đều tuyệt vời, thật không may, các giải pháp này không hoạt động tốt khi kết hợp với cửa sổ QuickFix hoặc LocationList (Tôi đã gặp vấn đề này trong khi cố gắng để bộ đệm thông báo lỗi Ale hoạt động với điều này).
Giải pháp
Do đó, tôi đã thêm một dòng mã bổ sung để đóng tất cả các cửa sổ này trước khi thực hiện trao đổi.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
Tổng số mã trông như thế nào;
" 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>
Tín dụng cho chức năng hoán đổi sang Brandon Orther
Tại sao cần thiết
Lý do các hàm hoán đổi không hoạt động đúng mà không loại bỏ tất cả các cửa sổ QuickFix (QF) và LocationList (LL) trước tiên là bởi vì nếu cha mẹ của bộ đệm QF / LL thì ẩn (và không hiển thị trong cửa sổ), QF Cửa sổ / LL cùng với nó được gỡ bỏ. Bản thân đây không phải là vấn đề nhưng khi cửa sổ ẩn tất cả các số cửa sổ được gán lại và việc hoán đổi bị rối do số lưu của cửa sổ được đánh dấu đầu tiên sẽ không còn tồn tại nữa.
Để đặt suy nghĩ này:
Dấu cửa sổ đầu tiên
____________________
| one | -> winnr = 1 marked first g:markedWinNum=1
| | -> bufnr = 1
|__________________|
| two (QF window | -> winnr = 2
| coupled to one |
|__________________|
| three | -> winnr = 3
| | -> bufnr = 2
|__________________|
Dấu cửa sổ thứ hai
____________________
| 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
|__________________|
Công tắc đệm đầu tiên, cửa sổ một được lấp đầy với bộ đệm của cửa sổ ba. Do đó, cửa sổ QF bị loại bỏ vì nó không còn cửa sổ cha nữa. Điều này sắp xếp lại các số cửa sổ. Lưu ý rằng curNum (số lượng cửa sổ được chọn thứ hai) đang trỏ đến một cửa sổ không còn tồn tại nữa.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2 curNum=3
| | -> bufnr = 2 curBuf=2
|__________________|
Vì vậy, khi chuyển đổi bộ đệm thứ hai, nó cố gắng chọn cửa sổ curNum, không còn tồn tại nữa. Vì vậy, nó tạo ra nó và chuyển đổi bộ đệm, dẫn đến một cửa sổ không mong muốn được mở.
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|