क्या टैब को स्थानांतरित करने के लिए कोई vim कमांड है?


200

मैं अपने वर्तमान टैब की स्थिति / क्रम को कैसे बदल सकता हूँ Vim? उदाहरण के लिए, यदि मैं अपने वर्तमान टैब को पहले टैब में बदलना चाहता हूं?

जवाबों:


271

आप :tabmसापेक्ष या शून्य-इंडेक्स निरपेक्ष तर्कों का उपयोग करके टैब को स्थानांतरित कर सकते हैं ।

पूर्ण:

  • स्थिति i पर टैब ले जाएँ: :tabm i

रिश्तेदार:

  • टैब i पदों को दाईं ओर ले जाएं: :tabm +i
  • टैब i पदों को बाईं ओर ले जाएं: :tabm -i

यह एक अपेक्षाकृत नई सुविधा है। तो अगर यह काम नहीं करता है अपने विम को अद्यतन करने का प्रयास करें।


2
यह काम नहीं करता है। : टैमम सापेक्ष तर्कों को स्वीकार नहीं करता है, हालांकि यह वास्तव में होना चाहिए।
गैविन

6
यदि आपको ऐसा नहीं करना है, तो आपको अपने विम को अपडेट करना चाहिए, क्योंकि :tabmविम 7.3 में रिश्तेदार तर्क स्वीकार करते हैं।
13/13

मेरे पास VIM है - Vi IMproved 7.3 (2010 अगस्त 15, संकलित Apr 2 2013 09:17:34) शामिल पैच: 1-547 और + - वहाँ समर्थित नहीं, प्रलेखन ने कहा कि मुझे शून्य या सकारात्मक मूल्य निर्दिष्ट करना चाहिए
व्लादिमीर

6
ध्यान दें कि पूर्ण स्थिति शून्य-सूचकांक है, जो थोड़ा अजीब है क्योंकि विम 1-अनुक्रमित टैब प्रदर्शित करता है (या यह सिर्फ मेरा विम कॉन्फ़िगरेशन हो सकता है)
इलियट फोस्टर

1
यह रैपिंग केस को हैंडल नहीं करता है
एंडी रे

38

क्या आपका मतलब मौजूदा टैब को हिलाना है? यह वर्जित का उपयोग कर काम करता है।

:tabm[ove] [N]                                          *:tabm* *:tabmove*
            Move the current tab page to after tab page N.  Use zero to
            make the current tab page the first one.  Without N the tab
            page is made the last one.

मेरे पास दो प्रमुख बाइंडिंग हैं जो मेरे वर्तमान टैब को एक बाएं या एक दाएं ले जाते हैं। बेहद सुविधाजनक!

संपादित करें: यहाँ मेरा VIM मैक्रो है। मैं एक बड़ा वीआईएम कोडर नहीं हूं , इसलिए शायद इसे बेहतर किया जा सकता है, लेकिन यह मेरे लिए कैसे काम करता है:

" Move current tab into the specified direction.
"
" @param direction -1 for left, 1 for right.
function! TabMove(direction)
    " get number of tab pages.
    let ntp=tabpagenr("$")
    " move tab, if necessary.
    if ntp > 1
        " get number of current tab page.
        let ctpn=tabpagenr()
        " move left.
        if a:direction < 0
            let index=((ctpn-1+ntp-1)%ntp)
        else
            let index=(ctpn%ntp)
        endif

        " move tab page.
        execute "tabmove ".index
    endif
endfunction

इसके बाद आप चाबियों को बांध सकते हैं, उदाहरण के लिए अपने में इस तरह से .vimrc:

map <F9> :call TabMove(-1)<CR>
map <F10> :call TabMove(1)<CR>

अब आप F9 या F10 दबाकर अपने वर्तमान टैब को स्थानांतरित कर सकते हैं।


हम्म ... तो एक टैब एक स्थिति को छोड़ दिया या सही चलती एक स्क्रिप्ट की आवश्यकता है? क्या आप इसे पेस्ट कर सकते हैं?
गेविन

2
मैंने अपनी स्क्रिप्ट्स को जोड़ा। क्या यह आपकी मदद करता है?
hochl

25

मैं उसी की तलाश में था और कुछ पोस्टों के बाद मुझे एक फ़ंक्शन की तुलना में एक सरल तरीका मिला:

:execute "tabmove" tabpagenr() # Move the tab to the right
:execute "tabmove" tabpagenr() - 2 # Move the tab to the left

Tabpagenr () वास्तविक टैब स्थिति देता है, और tabmove अनुक्रमित उपयोग करता है।

मैंने Ctrl + L के दाईं ओर मैप किया और छोड़ दिया Ctrl + H:

map <C-H> :execute "tabmove" tabpagenr() - 2 <CR>
map <C-J> :execute "tabmove" tabpagenr() <CR>

1
यह रैपिंग मामले को नहीं संभालता है, FYI करें
एंडी रे

2
मुझे :execute "tabmove" tabpagenr() + 1 <CR>दाईं ओर जाने के लिए उपयोग करना था । के लिए MacVim 8.0.1420 (144)
पॉल ओलिवर

5

वर्तमान टैब को n वें स्थान पर ले जाएं

:tabm n

nस्थिति को निरूपित करते हुए एक संख्या कहां है (शून्य से शुरू)


टैब को लेफ्ट / राइट पर ले जाएं

मुझे लगता है कि एक बेहतर समाधान यह है कि आप जिस नई स्थिति में चाहते हैं उसके संख्यात्मक मान का पता लगाने के बजाय टैब को उसकी वर्तमान स्थिति में बाईं या दाईं ओर ले जाएं।

noremap <A-Left>  :-tabmove<cr>
noremap <A-Right> :+tabmove<cr>

उपरोक्त कीमैप के साथ, आप वर्तमान टैब को स्थानांतरित करने में सक्षम होंगे:

  • का उपयोग कर बाईं ओर: Alt +Left
  • सही उपयोग करने के लिए: Alt +Right

क्या कोई अंतर है +tabmoveऔर tabmove+? स्थिति क्या मायने रखती है?

4

अन्य उत्तरों में ठीक सुझावों के अलावा, आप माउस को ले जाने के लिए टैब को भी खींच सकते हैं, यदि आपके पास माउस सपोर्ट सक्षम है।

यह मैकविम और अन्य जीयूआई विम कार्यान्वयन में डिफ़ॉल्ट रूप से है, चाहे जीयूआई विजेट टैब या जीयूआई मोड में टर्मिनल स्टाइल टैब का उपयोग कर रहा हो।

यह शुद्ध tty मोड Vim में भी काम करता है, अगर आपके पास set mouse=aएक उपयुक्त टर्मिनल (xterm और इसके अधिकांश एमुलेटर हैं, जैसे कि gnome-टर्मिनल, Terminal.app, iTerm2, और PuTTY / KiTTY, एक दृश्य का नाम देने के लिए)। ध्यान दें कि कॉलम 222 से परे माउस को भी आवश्यकता होती है set ttymouse=sgr; विम में देखें , मेरा माउस 220 वें कॉलम से आगे क्यों नहीं बढ़ रहा है? उस पर पृष्ठभूमि के लिए।

मैंने vim-tabber नामक एक प्लगइन लिखा है जो कि टैब को स्वैप करने, उन्हें शिफ्ट करने और बिल्ट-इन टैब मैनिपुलेशन कमांड की क्षमताओं को जोड़ने के लिए कुछ अतिरिक्त कार्यक्षमता प्रदान करता है, जबकि बिल्टइन के साथ काफी हद तक संगत है। यहां तक ​​कि अगर आप प्लगइन का उपयोग नहीं करना चुनते हैं, तो README में कुछ सामान्य टैब उपयोग की जानकारी है।


माउस का उपयोग करके टैब को फिर से व्यवस्थित करने के बाद, मैं अब माउस का उपयोग करके फलक का आकार बदल नहीं सकता। इसके बजाय, हर बार जब मैं माउस कर्सर को क्लिक करता हूं और खींचता हूं, तो टैब फिर से व्यवस्थित हो जाते हैं, जैसे कि माउस "अटक" पर क्लिक करता है। क्या आपको पता है कि यहां क्या हो सकता है?
gmile

जिम, मैंने अलग से प्रश्न पोस्ट किया है: stackoverflow.com/questions/43734501/…
gmile

1

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

" Move current tab into the specified direction.
"
" @param direction -1 for left, 1 for right.
function! TabMove(direction)
    let s:current_tab=tabpagenr()
    let s:total_tabs = tabpagenr("$")

    " Wrap to end
    if s:current_tab == 1 && a:direction == -1
        tabmove
    " Wrap to start
    elseif s:current_tab == s:total_tabs && a:direction == 1
        tabmove 0
    " Normal move
    else
        execute (a:direction > 0 ? "+" : "-") . "tabmove"
    endif
    echo "Moved to tab " . tabpagenr() . " (previosuly " . s:current_tab . ")"
endfunction

" Move tab left or right using Command-Shift-H or L
map <D-H> :call TabMove(-1)<CR>
map <D-L> :call TabMove(1)<CR>

-tabmऔर +tabmमेरी vim 7.4 में सही ढंग से टैब के लिए कदम नहीं है। इसके अलावा मेरी :help tabmयह एक वैध वाक्य रचना के रूप में सूचीबद्ध नहीं है। इसलिए मैं पिछले प्रतिस्थापित else execute ...endifके साथ elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif का उपयोग कर पाब्लो का जवाब
CFI

प्रारंभ / समाप्ति के लिए रैपिंग के लिए, मैं अब इस समाधान का उपयोग अपने दम पर कर रहा हूं क्योंकि मैंने पढ़ने और बनाए रखने के लिए दो फ़ंक्शन और उनके कोड क्लीनर का उपयोग किया है। बस लाइन में / tabmoveऔर के क्रम को उलट दिया । -+execute
पुराना।

1

यहाँ मेरा मैक्रो है, @ maybeshewill के उत्तर के सापेक्ष तर्कों का उपयोग करते हुए:

" Shortcuts to move between tabs with Ctrl+Shift+Left/Right
function TabLeft()
   if tabpagenr() == 1
      execute "tabm"
   else
      execute "tabm -1"
   endif
endfunction

function TabRight()
   if tabpagenr() == tabpagenr('$')
      execute "tabm" 0
   else
      execute "tabm +1"
   endif
endfunction

map <silent><C-S-Right> :execute TabRight()<CR>
map <silent><C-S-Left> :execute TabLeft()<CR>

यह रैपिंग केस को हैंडल करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.