คำตอบทั้งหมดข้างต้นนั้นยอดเยี่ยมโชคไม่ดีที่โซลูชันเหล่านี้ทำงานได้ไม่ดีเมื่อใช้ร่วมกับ QuickFix หรือ LocationList windows (ฉันพบปัญหานี้ในขณะที่พยายามรับบัฟเฟอร์ข้อความแสดงข้อผิดพลาด 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
|__________________|
บัฟเฟอร์สวิตช์แรกหน้าต่างหนึ่งจะเต็มไปด้วยบัฟเฟอร์ของหน้าต่างสาม ดังนั้นหน้าต่าง 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
|__________________|