Apakah ada perintah vim untuk memindahkan tab?

200

Bagaimana saya bisa mengubah posisi / urutan tab saya saat ini Vim? Misalnya, jika saya ingin memposisikan ulang tab saya saat ini menjadi tab pertama?

Gavin
sumber

Jawaban:

271

Anda dapat merelokasi tab dengan :tabmmenggunakan argumen absolut relatif atau indeks nol.

mutlak:

  • Pindahkan tab ke posisi i: :tabm i

relatif:

  • Pindahkan posisi tab i ke kanan: :tabm +i
  • Pindahkan posisi tab i ke kiri: :tabm -i

Ini fitur yang relatif baru. Jadi, jika tidak berhasil coba perbarui vim Anda.

mungkin masih akan
sumber
2
Ini tidak berhasil. : tabm tidak menerima argumen relatif, meskipun memang seharusnya demikian.
Gavin
6
Anda harus memperbarui vim Anda jika tidak, karena :tabmmenerima argumen relatif dalam vim 7.3.
maybeshewill
Saya memiliki VIM - Vi IMproved 7.3 (2010 15 Agustus, disusun 2 Apr 2013 09:17:34) Termasuk tambalan: 1-547 dan + - tidak didukung di sana, dokumentasi mengatakan saya harus menentukan nilai nol atau positif
Vladimir
6
Perhatikan bahwa posisi absolut adalah indeks nol, yang sedikit aneh karena vim menampilkan tab 1-diindeks (atau mungkin hanya konfigurasi vim saya)
Elliot Foster
1
Ini tidak menangani bungkusnya
Andy Ray
38

Apakah maksud Anda memindahkan tab saat ini? Ini berfungsi menggunakan tabmove.

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

Saya memiliki dua binding kunci yang menggerakkan tab saya saat ini satu kiri atau satu kanan. Sangat berguna!

EDIT: Ini makro VIM saya. Saya bukan pembuat kode besar ViM , jadi mungkin itu bisa dilakukan dengan lebih baik, tapi begitulah cara kerjanya bagi saya:

" 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

Setelah ini, Anda dapat mengikat kunci, misalnya seperti ini di .vimrc:

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

Sekarang Anda dapat memindahkan tab saat ini dengan menekan F9 atau F10.

hochl
sumber
Hmm ... jadi memindahkan tab satu posisi ke kiri atau ke kanan membutuhkan skrip? Bisakah Anda menempelkannya?
Gavin
2
Saya menambahkan skrip saya. Apakah ini membantu Anda?
Hochl
25

Saya mencari yang sama dan setelah beberapa posting saya menemukan cara yang lebih sederhana daripada fungsi:

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

The tabpagenr () mengembalikan posisi tab yang sebenarnya, dan tabmove menggunakan indeks.

Saya memetakan kanan untuk Ctrl + L dan kiri untuk Ctrl + H:

map <C-H> :execute "tabmove" tabpagenr() - 2 <CR>
map <C-J> :execute "tabmove" tabpagenr() <CR>
Pablo Díaz Ogni
sumber
1
Ini tidak menangani bungkusnya, FYI
Andy Ray
2
Saya harus menggunakan :execute "tabmove" tabpagenr() + 1 <CR>untuk bergerak ke kanan. Untuk MacVim 8.0.1420 (144) .
Paul Oliver
5

Pindahkan Tab Sekarang ke Posisi ke-n

:tabm n

Di mana nangka yang menunjukkan posisi (mulai dari nol)


Pindahkan Tab ke Kiri / Kanan

Saya pikir solusi yang lebih baik adalah dengan memindahkan tab ke kiri atau kanan ke posisi saat ini daripada mencari tahu nilai numerik dari posisi baru yang Anda inginkan.

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

Dengan keymaps di atas, Anda dapat memindahkan tab saat ini:

  • Ke kiri menggunakan: Alt +Left
  • Ke kanan menggunakan: Alt +Right
Sheharyar
sumber
Apakah ada perbedaan antara +tabmovedan tabmove+? Apakah posisi itu penting?
4

Selain saran bagus dalam jawaban lain, Anda juga dapat dengan mudah menyeret tab dengan mouse untuk memindahkannya, jika dukungan mouse Anda diaktifkan.

Ini diaktifkan secara default di MacVim dan implementasi vim GUI lainnya, apakah menggunakan tab widget GUI atau tab gaya terminal dalam mode GUI.

Ini juga berfungsi dalam mode tty murni Vim, jika Anda memiliki set mouse=adan memiliki terminal yang sesuai (xterm dan sebagian besar emulatornya, seperti gnome-terminal, Terminal.app, iTerm2, dan PuTTY / KiTTY, untuk menyebutkan tampilan). Perhatikan bahwa klik mouse di luar kolom 222 juga memerlukan set ttymouse=sgr; lihat Di Vim, mengapa mouse saya tidak berfungsi melewati kolom ke-220? untuk latar belakang itu.

Saya telah menulis sebuah plugin bernama vim-tabber yang menyediakan beberapa fungsionalitas tambahan untuk bertukar tab, menggesernya, dan menambah kemampuan perintah manipulasi tab bawaan, sementara sebagian besar tetap kompatibel dengan builtin. Bahkan jika Anda memilih untuk tidak menggunakan plugin, ada beberapa informasi penggunaan tab umum di README.

Jim Stewart
sumber
setelah mengatur ulang tab menggunakan mouse, saya tidak bisa lagi mengubah ukuran panel menggunakan mouse. Sebagai gantinya, setiap kali saya mengklik dan menyeret kursor mouse, tab-tab itu mengatur ulang lagi, seolah-olah mouse klik "macet". Apakah Anda tahu apa yang sedang terjadi di sini?
gmile
Jim, saya telah memposting pertanyaan secara terpisah: stackoverflow.com/questions/43734501/…
gmile
1

Untuk beberapa alasan, jawaban fungsi berhenti bekerja untuk saya. Saya menduga ada konflik dengan vim-ctrlspace . Apapun, matematika dalam fungsi jawaban tidak perlu, karena Vim dapat memindahkan tab ke kiri dan ke kanan dengan fungsi bawaan. Kami hanya harus menangani bungkusnya , karena Vim tidak ramah pengguna.

" 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>
Andy Ray
sumber
The -tabmdan +tabmdalam vim saya 7.4 tidak benar memindahkan tab. Juga saya :help tabmtidak mencantumkan ini sebagai sintaks yang valid. Jadi saya mengganti yang terakhir else execute ...endifdengan elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif menggunakan jawaban Pablo
cfi
Untuk memulai / mengakhiri, saya menggunakan solusi ini sekarang karena saya menggunakan dua fungsi dan pembersih kodenya untuk membaca & memelihara. Baru saja membalik urutan tabmovedan -/ +tanda di executegaris.
rld.
1

Inilah makro saya, menggunakan argumen relatif dari jawaban @ 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>

Ini menangani kasing.

Jérôme
sumber