Bir sekmenin yerini değiştirmek için bir vim komutu var mı?


200

Mevcut sekmemin konumunu / sırasını nasıl değiştirebilirim Vim? Örneğin, geçerli sekmemi ilk sekme olarak yeniden konumlandırmak istersem?

Yanıtlar:


271

Bir sekmeyi :tabmgöreli veya sıfır dizin mutlak bağımsız değişkenleri kullanarak yeniden konumlandırabilirsiniz .

mutlak:

  • Sekmeyi i konumuna taşı: :tabm i

bağıl:

  • Sekme i konumlarını sağa taşı: :tabm +i
  • Sekme i konumlarını sola taşı: :tabm -i

Nispeten yeni bir özellik. Bu yüzden işe yaramazsa viminizi güncellemeyi deneyin.


2
Bu işe yaramıyor. : tabm göreceli bağımsız değişkenleri kabul etmese de, gerçekten de öyle olmalıdır.
Gavin

6
Vim'inizi güncellememelisiniz, çünkü :tabmvim 7.3'deki göreceli bağımsız değişkenleri kabul eder.
maybeshewill

VIM - Vi IMproved 7.3'üm var (2010 Ağu 15, 2 Nisan 2013 tarihinde derlendi 09:17:34) Dahil olan yamalar: 1-547 ve + - orada desteklenmiyor, belgeler sıfır veya pozitif değer belirtmem gerektiğini söyledi
Vladimir

6
Mutlak konumun sıfır endeksi olduğuna dikkat edin, çünkü vim 1 dizinli sekmeleri görüntülediğinden (veya sadece benim vim yapılandırmam olabilir)
Elliot Foster

1
Bu, sarma davasını ele almıyor
Andy Ray

38

Mevcut sekmeyi taşımak mı demek istediniz? Bu tabmove kullanarak çalışır.

: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.

Geçerli sekmemi bir sola veya sağa hareket ettiren iki anahtar bağlantım var. Çok kullanışlı!

EDIT: İşte benim VIM makro. Ben büyük bir ViM kodlayıcı değilim , bu yüzden belki daha iyi yapılabilir, ama benim için böyle çalışır:

" 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

Bundan sonra anahtarları bağlayabilirsiniz, örneğin .vimrc:

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

Şimdi geçerli sekmenizi F9 veya F10 tuşuna basarak taşıyabilirsiniz.


Hmm ... bir sekmeyi bir konum sola veya sağa hareket ettirmek için bir komut dosyası mı gerekiyor? Yapıştırır mısın?
Gavin

2
Senaryolarımı ekledim. Bu size yardımcı oluyor mu?
hochl

25

Ben de aynı şeyi arıyordum ve bazı yayınlardan sonra bir fonksiyondan daha basit bir yol buldum:

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

Tabpagenr () gerçek sekme konumunu döndürür ve tabmove dizinler kullanır.

Sağı Ctrl + L ve solunu Ctrl + H ile eşledim:

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

1
Bu, ambalaj kasasını ele almıyor, FYI
Andy Ray

2
:execute "tabmove" tabpagenr() + 1 <CR>Sağa gitmek için kullanmak zorunda kaldım . İçin MacVim 8.0.1420 (144) .
Paul Oliver

5

N Güncel Tab taşı inci Pozisyon

:tabm n

nKonumu gösteren bir sayı nerede (sıfırdan başlayarak)


Sekmeleri Sola / Sağa Taşı

Daha iyi bir çözüm, sekmeyi, istediğiniz yeni konumun sayısal değerini bulmak yerine sola veya sağa güncel konumuna getirmektir.

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

Yukarıdaki tuş haritalarıyla mevcut sekmeyi taşıyabilirsiniz:

  • Sola: Alt +Left
  • Doğru kullanarak: Alt +Right

Arasında herhangi bir fark var mı +tabmoveve tabmove+? Pozisyon önemli mi?

4

Diğer yanıtlardaki ince önerilere ek olarak, fare desteğini etkinleştirdiyseniz sekmeleri taşımak için fare ile de sürükleyebilirsiniz.

Bu, GUI widget sekmelerini veya GUI modunda terminal stili sekmelerini kullanıyor olsun, MacVim ve diğer GUI vim uygulamalarında varsayılan olarak açıktır.

Ayrıca, set mouse=auygun bir terminaliniz varsa ve varsa (tnom terminali, Terminal.app, iTerm2 ve PuTTY / KiTTY gibi xterm ve çoğu emülatörleri ) saf tty modunda Vim'de çalışır. 222 sütununun ötesindeki fare tıklamalarının da gerektirdiğini unutmayın set ttymouse=sgr; bkz . Vim'de, farem neden 220. sütunu geçmiyor? arka plan için.

Sekmeleri takas etmek, kaydırmak ve yerleşik sekme manipülasyon komutlarının yeteneklerini eklemek için bazı ek işlevler sağlayan vim-tabber adlı bir eklenti yazdım . Eklentiyi kullanmamayı seçseniz bile, README'de bazı genel sekme kullanım bilgileri vardır.


sekmeyi fareyi kullanarak yeniden düzenledikten sonra, fareyi kullanarak bölmeyi artık yeniden boyutlandıramıyorum. Bunun yerine, fare imlecini her tıklayıp sürüklediğimde, sekmeler fare "tıkanmış" gibi tıklar. Burada neler olabileceğine dair bir fikrin var mı?
gmile

Jim, soruyu ayrı olarak yayınladım: stackoverflow.com/questions/43734501/…
gmile

1

Bazı nedenlerden dolayı, işlev yanıtı benim için çalışmayı durdurdu. Vim-ctrlspace ile bir çakışma olduğundan şüpheleniyorum . Ne olursa olsun, Vim yerleşik işlevlerle sekmeleri sola ve sağa hareket ettirebildiğinden, işlev yanıtındaki matematik gereksizdir. Sadece sarma kasasını idare etmeliyiz , çünkü Vim kullanıcı dostu değildir.

" 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>

-tabmVe +tabmbenim vim 7.4 doğru sekmeleri hareket yok. Ayrıca benim :help tabmgeçerli bir sözdizimi olarak listelemez. Bu yüzden son değiştirildiği else execute ...endifile elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif kullanarak Pablo'nun cevabı
STF'nizi

Başlamak / bitirmek için sarma için, bu çözümü şimdi kendi başıma kullanıyorum çünkü okumak ve korumak için iki işlev ve kod temizleyicisini kullandım. Sadece satırın sırasını tabmoveve -/ +işaretini tersine çevirdim execute.
rld.

1

İşte @ maybeshewill'in cevabındaki göreceli argümanları kullanarak makrom:

" 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>

Sarma kasasını idare eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.