มีคำสั่ง vim เพื่อย้ายแท็บหรือไม่?


200

ฉันจะเปลี่ยนตำแหน่ง / คำสั่งของแท็บปัจจุบันได้Vimอย่างไร ตัวอย่างเช่นหากฉันต้องการเปลี่ยนตำแหน่งแท็บปัจจุบันของฉันให้เป็นแท็บแรก

คำตอบ:


271

คุณสามารถเปลี่ยนตำแหน่งแท็บ:tabmโดยใช้อาร์กิวเมนต์สัมบูรณ์แบบสัมพันธ์หรือแบบศูนย์ดัชนีก็ได้

แน่นอน:

  • ย้ายแท็บไปที่ตำแหน่ง i: :tabm i

ญาติ:

  • ย้ายแท็บ i ไปทางขวา: :tabm +i
  • ย้ายแท็บ i ไปทางซ้าย: :tabm -i

มันเป็นคุณสมบัติที่ค่อนข้างใหม่ ดังนั้นถ้ามันไม่ทำงานลองอัปเดตเสียงเรียกเข้าของคุณ


2
มันใช้งานไม่ได้ : tabm ไม่ยอมรับอาร์กิวเมนต์ที่เกี่ยวข้องแม้ว่าควรจะเป็นจริง
กาวิน

6
คุณควรอัพเดตกลุ่มของคุณหากไม่เป็นเพราะ:tabmยอมรับข้อโต้แย้งที่เกี่ยวข้องในกลุ่ม 7.3
maybeshewill

ฉันมี VIM - Vi IMproved 7.3 (2010 15 สิงหาคมรวบรวม 2 เมษายน 2013 09:17:34) แพทช์รวม: 1-547 และ + - ไม่ได้รับการสนับสนุนมีเอกสารกล่าวว่าฉันควรระบุศูนย์หรือค่าบวก
Vladimir

6
โปรดทราบว่าตำแหน่งสัมบูรณ์คือ zero-index ซึ่งค่อนข้างแปลกเนื่องจาก vim แสดงแท็บ 1-indexed (หรืออาจเป็นเพียงค่า vim config ของฉัน)
Elliot Foster

1
กรณีนี้ไม่รองรับกรณีการตัด
Andy Ray

38

คุณหมายถึงการย้ายแท็บปัจจุบันหรือไม่ งานนี้ใช้ 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.

ฉันมีการผูกสองปุ่มที่เลื่อนแท็บปัจจุบันไปทางซ้ายหรือขวาหนึ่งอัน มีประโยชน์มาก!

แก้ไข:นี่คือมาโคร VIM ของฉัน ฉันไม่ได้เป็นcoder 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
Andy Ray

2
ฉันต้องใช้:execute "tabmove" tabpagenr() + 1 <CR>เพื่อเลื่อนไปทางขวา สำหรับMacVim 8.0.1420 (144)
Paul Oliver

5

ย้ายแท็บปัจจุบันเพื่อที่ n THตำแหน่ง

:tabm n

ที่ไหนnเป็นจำนวน denoting ตำแหน่ง (เริ่มต้นจากศูนย์)


ย้ายแท็บไปทางซ้าย / ขวา

ฉันคิดว่าทางออกที่ดีกว่าคือการย้ายแท็บไปทางซ้ายหรือขวาไปยังตำแหน่งปัจจุบันแทนที่จะหาค่าตัวเลขของตำแหน่งใหม่ที่คุณต้องการ

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

ด้วยปุ่มกดด้านบนคุณจะสามารถย้ายแท็บปัจจุบันได้:

  • ไปทางซ้ายโดยใช้: Alt +Left
  • ไปทางขวาโดยใช้: Alt +Right

มีความแตกต่างระหว่าง+tabmoveและtabmove+? ตำแหน่งสำคัญหรือไม่

4

นอกเหนือจากคำแนะนำที่ดีในคำตอบอื่น ๆ คุณยังสามารถลากแท็บด้วยเมาส์เพื่อย้ายได้หากคุณเปิดใช้งานการรองรับเมาส์

นี่เป็นค่าเริ่มต้นใน MacVim และการใช้งาน GUI vim อื่น ๆ ไม่ว่าจะเป็นการใช้แท็บวิดเจ็ต GUI หรือแท็บสไตล์เทอร์มินัลในโหมด GUI

มันยังทำงานในโหมด tty บริสุทธิ์ Vim หากคุณมีset mouse=aและมีเทอร์มินัลที่เหมาะสม (xterm และอีมูเลเตอร์ส่วนใหญ่ของมันเช่น gnome-terminal, Terminal.app, iTerm2 และ PuTTY / KiTTY เพื่อตั้งชื่อมุมมอง) โปรดทราบว่าการคลิกเมาส์ที่อยู่นอกเหนือจากคอลัมน์ 222 นั้นจำเป็นต้องใช้set ttymouse=sgrเช่นกัน เห็นในเสียงทำไมเมาส์ของฉันไม่ทำงานเกินคอลัมน์ที่ 220 สำหรับพื้นหลังในนั้น

ฉันได้เขียนปลั๊กอินที่เรียกว่าvim-tabberที่มีฟังก์ชั่นเพิ่มเติมบางอย่างสำหรับการสลับแท็บไปรอบ ๆ ขยับพวกมันและเพิ่มความสามารถของคำสั่งการจัดการแท็บในตัว แม้ว่าคุณเลือกที่จะไม่ใช้ปลั๊กอิน แต่ก็มีข้อมูลการใช้งานแท็บทั่วไปใน README


หลังจากจัดเรียงแท็บใหม่โดยใช้เมาส์ฉันไม่สามารถปรับขนาดบานหน้าต่างโดยใช้เมาส์ได้อีก แต่ทุกครั้งที่ฉันคลิกและลากเคอร์เซอร์ของเมาส์แท็บจะจัดเรียงใหม่อีกครั้งราวกับว่าการคลิกเมาส์ "ติดอยู่" คุณมีความคิดใด ๆ ว่าเกิดอะไรขึ้นที่นี่
gmile

จิมฉันโพสต์คำถามแยกต่างหาก: stackoverflow.com/questions/43734501/…
gmile

1

ด้วยเหตุผลบางอย่างคำตอบฟังก์ชั่นหยุดทำงานสำหรับฉัน ฉันสงสัยว่ามีความขัดแย้งกับกลุ่ม-ctrlspace โดยไม่คำนึงถึงคณิตศาสตร์ในคำตอบฟังก์ชันนั้นไม่จำเป็นเนื่องจาก Vim สามารถย้ายแท็บไปทางซ้ายและขวาด้วยฟังก์ชันในตัว เราเพียงแค่ต้องจัดการกับกรณีการห่อเพราะเป็นกลุ่มที่ไม่ได้ใช้งานง่าย

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

The -tabmand +tabmin 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 ใช้คำตอบของ Pablo
cfi

สำหรับการเริ่มต้น / สิ้นสุดฉันใช้โซลูชันนี้แทนตัวเองเพราะฉันใช้สองฟังก์ชันและตัวล้างโค้ดของเขาเพื่ออ่านและบำรุงรักษา เพิ่งกลับคำสั่งซื้อtabmoveและเครื่องหมาย-/ +ในexecuteบรรทัด
rld

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>

มันจัดการกรณีห่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.