इसे स्थानांतरित करने के बजाय नए टैब में डुप्लिकेट बफर करें


10

मैं अक्सर एक टैब पृष्ठ में एक बफर को अस्थायी रूप से अधिकतम करना चाहता हूं और फिर उस पुराने बफर कॉन्फ़िगरेशन पर वापस जाता हूं जिसे मैं देख रहा था। इस तरह से कुछ करने के लिए मेरा वर्तमान वर्कफ़्लो या तो उपयोग करने वाले सभी बफर को बंद करने के लिए है <c-w>oया मैं वर्तमान में अपने स्वयं के टैब को देख रहा बफर को स्थानांतरित करने के लिए <c-w>T। दूसरे दृष्टिकोण के साथ समस्या यह है कि यह मूल टैब पृष्ठ से बफर को हटा देता है।

मैं तीन फाइलों को पॉप्युलेट a.txt, b.txtऔर c.txtसाथ a, b, और cक्रमशः।

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

जब मैं इन तीनों फ़ाइलों को एक टैब पृष्ठ में खोलता हूं, तो मुझे निम्नलिखित मिलते हैं।

यहाँ छवि विवरण दर्ज करें

फिर मैं a.txtअपने आप टैब पर जा सकता हूं । हालांकि, मैं a.txtमूल टैब पृष्ठ से हटा दिया जाता हूं । (तो यह एक के बाद होगा <c-w>Tgt)

यहाँ छवि विवरण दर्ज करें

मुझे उस समय चुनने की क्षमता चाहिए, जो मैंने <c-w>Tमूल बफ़र की सामग्री को संरक्षित करने के लिए दबाया होगा , एक नया टैब पृष्ठ बनाएँ जिसमें केवल बफ़र हो, जो इस समय केंद्रित है, और फिर नए टैब पृष्ठ पर ध्यान केंद्रित करें जो मैंने अभी-अभी किया है बनाया था। दूसरे शब्दों में, एक कमांड लगभग बिल्कुल वैसा ही है, <c-w>Tसिवाय इसके कि मूल टैब पेज संरक्षित है और अब a.txtदो टैब पेजों में है।

क्या इसे करने का कोई तरीका है?

जवाबों:


13

मुझे यकीन नहीं है लेकिन आप :tab split(या छोटे संस्करण :tab sp) की कोशिश कर सकते हैं ।

:splitआदेश व्यूपोर्ट प्रदर्शित नकल करना चाहिए a.txt, जबकि :tabसंशोधक एक समर्पित टैब पृष्ठ में इस व्यूपोर्ट बढ़ना चाहिए।


यदि आप के व्यवहार को बदलना चाहते हैं C-w T, तो आप इसे इस तरह से दोबारा बना सकते हैं:

nnoremap <C-w>T :tab split<CR>

आमतौर पर, हर बार जब आप एक कमांड पाते हैं जो विंडो को विभाजित करता है, और आप इसके बजाय एक नया टैब पेज बनाते हैं, तो आप इसके साथ उपसर्ग कर सकते हैं :tab

इसका उपयोग, उदाहरण के लिए, एक नए टैब पृष्ठ में मदद बफर पढ़ने के लिए किया जा सकता है:

:tab help {your_topic}

डिफ़ॉल्ट रूप से, नया टैब पृष्ठ वर्तमान के बाद दिखाई देगा। लेकिन अगर आप इसे कहीं और दिखाना चाहते हैं, तो आप :tabएक गिनती के साथ उपसर्ग कर सकते हैं ।

उदाहरण के लिए, एक के बाद एक टैब पृष्ठ में वर्तमान व्यूपोर्ट को डुप्लिकेट करने के लिए, आप टाइप कर सकते हैं:

:3tab split

और इसे पहले वाले के रूप में प्रदर्शित करने के लिए:

:0tab split

अधिक जानकारी के लिए, आप पढ़ सकते हैं :h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one

2

मैं ज्यादातर इस समस्या के कारण टैब से बचता रहा हूं, लेकिन अब मेरे पास एक फ़ंक्शन है जिसमें टैब दोहराव वाला व्यवहार है जो मुझे चाहिए। मैंने इसका परीक्षण किया है, लेकिन बयाना में इसका उपयोग शुरू नहीं किया है। इस वर्कफ़्लो में कुछ छिपे हुए दोष हो सकते हैं।

फ़ंक्शन के साथ एक समस्या यह है कि यह पिछली बफर-विंडो जोड़ी से कुछ राज्य की नकल नहीं करता है (जैसे कि set numberचालू है या नहीं)। थोड़ा सा निर्दिष्ट करना, c-w Tशायद यह समस्या नहीं है क्योंकि कोई दोहराव नहीं किया जाता है और खिड़की शायद बस reparented है।

विम के पास बफ़र्स, टैब और विंडो जैसी चीजों के लिए 1-आधारित सूचियों की एक जोड़ी है। जहां तक ​​मैं बता सकता हूं, वे 1-आधारित हैं क्योंकि 0कुंजी का उपयोग एक पंक्ति की शुरुआत में जाने के लिए किया जाता है और परिणामस्वरूप एक संख्यात्मक तर्क के रूप में शून्य पास करना असंभव है।

हम इस कार्यक्षमता का अनुकरण करने के लिए तीन सूचियों की परवाह करते हैं:

  • टैब पृष्ठों की वैश्विक सूची
  • प्रति- [टैब पेज] खिड़कियों की सूची
  • बफ़र्स की वैश्विक सूची

हम इस सभी मानों को सहेजते हैं, फिर "tabnew" के माध्यम से एक नया टैब बनाते हैं। नए टैब हमेशा दाईं ओर बनाए जाते हैं, इसलिए टैब के नीचे का कोई भी इंडिकेटर जिसे हम tabnewअमान्य नहीं करते हैं। (ऐसा करने का एक अधिक मजबूत तरीका शायद बेहतर होगा)।

tabnewआदेश भी नए टैब और यह के भीतर एकल खिड़की करने के लिए ध्यान देने के ले जाता है। वहां से हम bufferकमांड का उपयोग बफर पर एक दृश्य बनाने के लिए कर सकते हैं जो मूल रूप से फोकस था।

फिर हम उस टैब पर वापस ध्यान केंद्रित करने के लिए मूल टैब के सहेजे गए इंडेक्स का उपयोग करते हैं। और फिर, मोटे तौर पर व्यामोह से बाहर, हम उस टैब के भीतर फोकस को मूल विंडो पर सेट करते हैं। विम को याद है कि किस विंडो में गैर-दृश्य टैब में फ़ोकस है, लेकिन मुझे उस पर भरोसा करना पसंद नहीं है।

(कुछ शैलीगत बिंदु: स्पष्ट संख्यात्मक रूपांतरण 0+, वैश्विक चर और दावे सभी जानबूझकर हैं)

function! TabDuplicate()
  " set vars, sanity checking
  let g:tabdup_win      = 0+ winnr()
  let g:tabdup_buf      = 0+ bufnr('%')
  let g:tabdup_tabpage  = 0+ tabpagenr()
  call assert_true(g:tabdup_win > 0)
  call assert_true(g:tabdup_buf > 0)
  call assert_true(g:tabdup_tabpage > 0)
  " make a new tab page,
  " the new tab page will have focus
  " none of the indices, which are all
  " less than the current index, are
  " invalidated by creating a new tab
  execute "tabnew"
  " visit the buffer we saved
  execute "buffer " . g:tabdup_buf
  " return to the original tab page
  execute "tabnext " . g:tabdup_tabpage
  " return focus to original window
  execute g:tabdup_win . " windcmd w"
endfunction
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.