उपरोक्त सभी उत्तर बहुत अच्छे हैं, दुर्भाग्य से ये समाधान क्विकफिक्स या लोकलिस्ट विंडो के साथ संयोजन में अच्छी तरह से काम नहीं करते हैं (मैं इस समस्या में भाग गया, जबकि इसके साथ काम करने के लिए एएल त्रुटि संदेश बफर प्राप्त करने की कोशिश कर रहा हूं)।
समाधान
इसलिए मैंने स्वैप करने से पहले इन सभी विंडो को बंद करने के लिए कोड की एक अतिरिक्त लाइन जोड़ी।
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>
ब्रैंडन ऑथर को स्वैप समारोह का श्रेय
इसकी आवश्यकता क्यों है
कारण यह है कि स्वैप फ़ंक्शंस सभी क्विकफ़िक्स (क्यूएफ) और लोकलिस्ट (एलएल) खिड़कियों को हटाए बिना ठीक से काम नहीं करते हैं, क्योंकि अगर QF / LL के अभिभावक गेट के छिपे हुए हैं (और एक विंडो में कहीं नहीं दिखाए गए हैं), 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
|__________________|
इसलिए जब दूसरे बफर को स्विच करते हैं, तो यह कर्नम विंडो का चयन करने की कोशिश करता है, जो किसी भी अधिक मौजूद नहीं है। तो यह इसे बनाता है और बफर को स्विच करता है, जिसके परिणामस्वरूप एक अवांछित खिड़की अभी भी खुली रहती है।
____________________
| three | -> winnr = 1 g:markedWinNum=1
| | -> bufnr = 2
|__________________|
| three | -> winnr = 2
| | -> bufnr = 2
|__________________|
| one | -> winnr = 3 curNum=3
| | -> bufnr = 1 curBuf=2
|__________________|