VIM में विंडो के बीच फाइल स्वैप कैसे करें?


123

जब मैं VIM के साथ काम करता हूं, तो मेरे पास हमेशा कई विंडो दिखाई देती हैं। कभी-कभी मैं उन जगहों पर उन खिड़कियों को स्वैप करने के लिए, एक आसान तरीका चाहता हूं। क्या इसे और अधिक आसान बनाने के लिए कोई प्लगइन, मैक्रो आदि है? BTW, मैं MiniBufExplorer का उपयोग करता हूं।


2
"उन विंडो को स्थानों पर स्वैप करना" से, क्या आपका मतलब है "विंडो बी में विंडो ए में है और इसके विपरीत, खिड़कियों की स्थिति को बदलने के बिना बफर को खोलना"?
hcs42

1
हां, यह बिल्कुल वैसा ही है जैसा मैं चाहता हूं।
mdrozdziel

जवाबों:


304

इसमें कुछ उपयोगी कमांड बनाए गए हैं जो आपको एक निश्चित मात्रा में नियंत्रण प्रदान करते हैं, लेकिन यह व्यापक नहीं है। मुख्य हैं:

  • Ctrl- W, r(यानी पकड़ CTRL, प्रेस W, रिलीज CTRL, प्रेस r) - जो खिड़कियों को घुमाता है (पहली खिड़की दूसरी बन जाती है, दूसरी तीसरी बन जाती है, आदि)

  • Ctrl- W, x- वर्तमान विंडो को अगले एक के साथ स्वैप करें

  • Ctrl- W, Shift- H- इस विंडो को दूर बाईं ओर ले जाएं

  • Ctrl- W, Shift- K- इस विंडो को ऊपर की ओर ले जाएं

(और इसी तरह Ctrl- W, Shift- Jऔर Ctrl- W, Shift- के लिए L)। देख:

:help window-moving

अधिक जानकारी के लिए।


16
यह "सर्वश्रेष्ठ उत्तर" होना चाहिए - मूल कार्यक्षमता, कस्टम Vimscript नहीं।
डेविड रिवर

1
पूरी तरह से नहीं, नहीं। उपयोग के बहुत सारे मामले हैं जो विंडो प्रबंधन में निर्मित किए गए विंडो को नष्ट और पुनः बनाए बिना उपयोग नहीं किया जा सकता है। स्वैप बफ़र स्क्रिप्ट इन उपयोग मामलों की अनुमति देता है।
बोबापुल

ध्यान दें कि ctl-w भी काम करता है। ctl-W कुछ टर्मिनल एमुलेटर में विंडो बंद करेगा।
डेटाकिड

7

मैंने लिखा है और अपने विम विंडो को कॉपी-पेस्ट करने के लिए अपने vimrc में निम्नलिखित कोड स्निपेट का उपयोग कर रहा हूं।

यह उदाहरण के लिए निम्नलिखित शॉर्टकट परिभाषित करता है:

  • <c-w>y: "यन्क्स विन्डो", अर्थात वर्तमान विंडो में बफ़र की संख्या को एक वैश्विक चर में संग्रहीत करता है।
  • <c-w>pp: "वर्तमान विंडो के स्थान पर विंडो को डालता है", अर्थात यह पहले से संग्रहीत बफर नंबर को पढ़ता है और वर्तमान विंडो में उस बफर को खोलता है। यह उस बफर की संख्या को भी संग्रहीत करता है जो वर्तमान विंडो में हुआ करता था।

यदि "उन विंडो को स्थानों पर स्वैप करके", तो आपका मतलब है "विंडो बी में विंडो ए में बफर खोलना, और इसके विपरीत, खिड़कियों की स्थिति को बदलने के बिना", आप विंडोज़ स्वैप करने के लिए निम्नलिखित कीबोर्ड अनुक्रम का उपयोग कर सकते हैं:

  1. विंडो ए चुनें (या तो माउस के साथ या कीबोर्ड कमांड के साथ)
  2. प्रेस <c-w>y(बफर नंबर yanking)
  3. विंडो B चुनें
  4. प्रेस <c-w>pp(बफर को चिपकाते हुए)
  5. विंडो A चुनें
  6. प्रेस <c-w>pp(बफर को फिर से चिपकाते हुए)

यह केवल Vim> = 7.0 में काम करता है।

if version >= 700
function! HOpen(dir,what_to_open)

    let [type,name] = a:what_to_open

    if a:dir=='left' || a:dir=='right'
        vsplit
    elseif a:dir=='up' || a:dir=='down'
        split
    end

    if a:dir=='down' || a:dir=='right'
        exec "normal! \<c-w>\<c-w>"
    end

    if type=='buffer'
        exec 'buffer '.name
    else
        exec 'edit '.name
    end
endfunction

function! HYankWindow()
    let g:window = winnr()
    let g:buffer = bufnr('%')
    let g:bufhidden = &bufhidden
endfunction

function! HDeleteWindow()
    call HYankWindow()
    set bufhidden=hide
    close
endfunction

function! HPasteWindow(direction)
    let old_buffer = bufnr('%')
    call HOpen(a:direction,['buffer',g:buffer])
    let g:buffer = old_buffer
    let &bufhidden = g:bufhidden
endfunction

noremap <c-w>d :call HDeleteWindow()<cr>
noremap <c-w>y :call HYankWindow()<cr>
noremap <c-w>p<up> :call HPasteWindow('up')<cr>
noremap <c-w>p<down> :call HPasteWindow('down')<cr>
noremap <c-w>p<left> :call HPasteWindow('left')<cr>
noremap <c-w>p<right> :call HPasteWindow('right')<cr>
noremap <c-w>pk :call HPasteWindow('up')<cr>
noremap <c-w>pj :call HPasteWindow('down')<cr>
noremap <c-w>ph :call HPasteWindow('left')<cr>
noremap <c-w>pl :call HPasteWindow('right')<cr>
noremap <c-w>pp :call HPasteWindow('here')<cr>
noremap <c-w>P :call HPasteWindow('here')<cr>

endif

4

मैंने उसी समय के आसपास एक समान प्रश्न पूछा : मैं विशेष रूप से एक मनमाने ढंग से जटिल लेआउट को बदलने के बिना खिड़कियों को स्वैप करने का एक तरीका चाहता था। मैंने उन समाधानों में से एक से एक विम प्लग बनाना समाप्त कर दिया जो सुझाया गया था। इसे WindowSwap.vim कहा जाता है ; अपने पसंदीदा विम प्लगइन प्रबंधक के साथ इसे स्थापित करें और इसे एक चक्कर दें।

WindowSwap.vim के साथ, आप बस करेंगे

  1. <Leader>yw एक खिड़की के लिए।
  2. अपने कर्सर को दूसरी विंडो में ले जाएं।
  3. <Leader>pw उस विंडो को पेस्ट करने के लिए, इसे पहले वाले की स्थिति से स्वैप करें।

प्रमुख संयोजन निश्चित रूप से आपकी प्राथमिकताओं के लिए विन्यास योग्य हैं।


1

के रूप में <c-w>rया <c-w>xएक प्रतिबंध है कि आप खिड़कियों को घुमा या विनिमय नहीं कर सकते हैं जब ऊर्ध्वाधर और क्षैतिज खिड़की विभाजन मिश्रित होते हैं। और <c-w>Hखिड़की लेआउट को आपकी अपेक्षा से परे बदल सकता है, खासकर जब आपके पास कई खिड़कियां हों।

तो आप खिड़की / बफर स्विचिंग की अपनी विशेष जरूरतों को पूरा करने के लिए कुछ काम कर सकते हैं। वर्तमान विंडो को ऊपर बाईं ओर विंडो के साथ स्विच करने का उदाहरण है (आमतौर पर मैं इसे लंबवत रूप से अधिकतम बनाता हूं):

function! SwitchMainWindow()
  let l:current_buf = winbufnr(0)
  exe "buffer" . winbufnr(1)
  1wincmd w
  exe "buffer" . l:current_buf
endfunction
nnoremap <c-w><c-e> :call SwitchMainWindow()<cr>

1

मेरी राय में, http://vimcasts.org/episodes/working-with-windows/ के पास इस प्रश्न का सही उत्तर है। संक्षेप में:

  • ctrl-w w खुली खिड़कियों के बीच चक्र
  • ctrl-w h विंडो को बाईं ओर केंद्रित करें
  • ctrl-w j विंडो को नीचे की ओर केंद्रित करें
  • ctrl-w k विंडो को ऊपर तक केंद्रित करें
  • ctrl-w l खिड़की को दाईं ओर केंद्रित करें
  • ctrl-w r सभी विंडो घुमाएं
  • ctrl-w x अपने पड़ोसी के साथ वर्तमान विंडो का आदान-प्रदान करें
  • ctrl-w H वर्तमान विंडो को बाईं ओर ले जाएं
  • ctrl-w J वर्तमान विंडो को नीचे ले जाएं
  • ctrl-w K वर्तमान विंडो को ऊपर ले जाएं
  • ctrl-w L वर्तमान विंडो को दाईं ओर ले जाएं

3
उत्तर जोड़ने का क्या कारण है जो पोस्ट में कोई नई उपयोगी जानकारी नहीं लाता है? यह 6 साल पहले पूरी तरह से उत्तर दिया गया था। क्या आप vimcasts के लिए विज्ञापन अभियान कर रहे हैं?
mdrozdziel

@mdrozdziel मैं ओपी के 9 साल बाद इस जवाब की सराहना करता हूं। अधिकांश संक्षिप्त जवाब केवल उस जानकारी के साथ है जिसकी मुझे आवश्यकता थी।
रोरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.