Có một lệnh vim để di chuyển một tab?


200

Làm cách nào tôi có thể thay đổi vị trí / thứ tự của tab hiện tại Vim? Ví dụ: nếu tôi muốn định vị lại tab hiện tại của mình thành tab đầu tiên?

Câu trả lời:


271

Bạn có thể định vị lại một tab bằng :tabmcách sử dụng các đối số tuyệt đối tương đối hoặc không có chỉ mục.

tuyệt đối:

  • Di chuyển tab đến vị trí i: :tabm i

quan hệ:

  • Di chuyển vị trí tab i sang phải: :tabm +i
  • Di chuyển vị trí tab i sang trái: :tabm -i

Đây là một tính năng tương đối mới. Vì vậy, nếu nó không hoạt động hãy thử cập nhật vim của bạn.


2
Điều này không hoạt động. : tabm không chấp nhận các đối số tương đối, mặc dù nó thực sự nên.
Gavin

6
Bạn nên cập nhật vim của mình nếu không, vì :tabmchấp nhận các đối số tương đối trong vim 7.3.
maybeshewill

Tôi có VIM - Vi IMproved 7.3 (ngày 15 tháng 8 năm 2010, được biên soạn ngày 2 tháng 4 năm 2013 09:17:34) Các bản vá bao gồm: 1-547 và + - không được hỗ trợ ở đó, tài liệu cho biết tôi nên chỉ định giá trị 0 hoặc dương
Vladimir

6
Lưu ý rằng vị trí tuyệt đối là zero-index, hơi lạ vì vim hiển thị các tab được lập chỉ mục 1 (hoặc có thể chỉ là cấu hình vim của tôi)
Elliot Foster

1
Điều này không xử lý trường hợp gói
Andy Ray

38

Bạn có nghĩa là di chuyển các tab hiện tại? Điều này hoạt động bằng cách sử dụng 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.

Tôi có hai ràng buộc chính di chuyển tab hiện tại của tôi một bên trái hoặc một bên phải. Rất tiện dụng!

EDIT: Đây là macro VIM của tôi. Tôi không phải là một lập trình viên ViM lớn , vì vậy có lẽ nó có thể được thực hiện tốt hơn, nhưng đó là cách nó hoạt động với tôi:

" 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

Sau này, bạn có thể liên kết các khóa, ví dụ như thế này trong .vimrc:

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

Bây giờ bạn có thể di chuyển tab hiện tại của mình bằng cách nhấn F9 hoặc F10.


Hmm ... vì vậy việc di chuyển một tab một vị trí sang trái hoặc phải yêu cầu một tập lệnh? Bạn có thể dán nó?
Gavin

2
Tôi đã thêm các kịch bản của tôi. Điều này có giúp gì cho bạn không?
hochl

25

Tôi đã tìm kiếm tương tự và sau một số bài viết, tôi tìm thấy một cách đơn giản hơn một chức năng:

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

Các tabpagenr () trả về vị trí tab thực tế, và tabmove sử dụng chỉ mục.

Tôi ánh xạ bên phải sang Ctrl + L và bên trái sang Ctrl + H:

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

1
Điều này không xử lý trường hợp gói, FYI
Andy Ray

2
Tôi đã phải sử dụng :execute "tabmove" tabpagenr() + 1 <CR>để di chuyển sang phải. Đối với MacVim 8.0.1420 (144) .
Paul Oliver

5

Di chuyển Tab hiện tại đến vị trí thứ n

:tabm n

Trường hợp nmột số biểu thị vị trí (bắt đầu từ số không)


Di chuyển Tab sang trái / phải

Tôi nghĩ rằng một giải pháp tốt hơn là di chuyển tab sang trái hoặc phải sang vị trí hiện tại thay vì tìm ra giá trị bằng số của vị trí mới mà bạn muốn.

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

Với các keymap trên, bạn sẽ có thể di chuyển tab hiện tại:

  • Ở bên trái bằng cách sử dụng: Alt +Left
  • Bên phải sử dụng: Alt +Right

Có sự khác biệt nào giữa +tabmovetabmove+không? Liệu vị trí có vấn đề?

4

Ngoài các gợi ý hay trong các câu trả lời khác, bạn cũng có thể chỉ cần kéo các tab bằng chuột để di chuyển chúng, nếu bạn đã bật hỗ trợ chuột.

Điều này được bật theo mặc định trong MacVim và các cài đặt GUI vim khác, cho dù sử dụng tab tiện ích GUI hoặc tab kiểu thiết bị đầu cuối trong chế độ GUI.

Nó cũng hoạt động ở chế độ tty thuần Vim, nếu bạn có set mouse=avà có một thiết bị đầu cuối phù hợp (xterm và hầu hết các trình giả lập của nó, chẳng hạn như gnome-terminal, Terminal.app, iTerm2 và PuTTY / KiTTY, để đặt tên cho chế độ xem). Lưu ý rằng nhấp chuột ngoài cột 222 cũng yêu cầu set ttymouse=sgr; xem Trong Vim, tại sao chuột của tôi không hoạt động qua cột thứ 220? cho nền tảng trên đó.

Tôi đã viết một plugin có tên vim-tabber cung cấp một số chức năng bổ sung để hoán đổi các tab xung quanh, dịch chuyển chúng và thêm vào các khả năng của các lệnh thao tác tab tích hợp, trong khi vẫn tương thích với các nội trang. Ngay cả khi bạn chọn không sử dụng plugin, vẫn có một số thông tin sử dụng tab chung trong README.


Sau khi sắp xếp lại tab bằng chuột, tôi không thể thay đổi kích thước khung bằng chuột. Thay vào đó, mỗi lần tôi nhấp và kéo con trỏ chuột, các tab sẽ sắp xếp lại, như thể con chuột nhấp vào "bị kẹt". Bạn có biết những gì có thể xảy ra ở đây?
gmile

Jim, tôi đã đăng riêng câu hỏi: stackoverflow.com/questions/43734501/ từ
gmile

1

Vì một số lý do, câu trả lời hàm ngừng hoạt động đối với tôi. Tôi nghi ngờ có xung đột với vim-ctrlspace . Bất kể, toán học trong câu trả lời hàm là không cần thiết, vì Vim có thể di chuyển các tab sang trái và phải với các hàm tích hợp. Chúng tôi chỉ phải xử lý trường hợp gói , vì Vim không thân thiện với người dùng.

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

Các -tabm+tabmtrong vim tôi 7.4 không di chuyển một cách chính xác các tab. Ngoài ra của tôi :help tabmkhông liệt kê đây là một cú pháp hợp lệ. Vì vậy, tôi đã thay thế câu cuối else execute ...endifbằng elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif cách sử dụng câu trả lời của Pablo
cfi

Để gói bắt đầu / kết thúc, hiện tại tôi đang sử dụng giải pháp này vì tôi đã sử dụng hai chức năng và trình dọn mã của anh ấy để đọc và bảo trì. Chỉ cần đảo ngược thứ tự tabmovevà dấu -/ +trong executedòng.
Rld.

1

Đây là macro của tôi, sử dụng các đối số tương đối từ câu trả lời của @ 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>

Nó xử lý các trường hợp gói.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.