탭을 재배치하는 vim 명령이 있습니까?


200

에서 현재 탭의 위치 / 순서를 어떻게 변경 Vim합니까? 예를 들어, 현재 탭을 첫 번째 탭으로 재배치하려면?

답변:


271

:tabm상대 또는 0 인덱스 절대 인수 를 사용하여 탭을 재배치 할 수 있습니다 .

순수한:

  • 탭을 i로 이동 : :tabm i

상대적인:

  • 탭 i 위치를 오른쪽으로 이동 : :tabm +i
  • 탭 i 위치를 왼쪽으로 이동 : :tabm -i

비교적 새로운 기능입니다. 그래도 작동하지 않으면 vim을 업데이트하십시오.


2
작동하지 않습니다. : tabm은 실제로는 아니지만 상대 인수를 허용하지 않습니다.
Gavin

6
:tabmvim 7.3에서 상대 인수를 허용 하므로 vim을 업데이트하지 않으면 업데이트해야합니다 .
아마 shewillwill

VIM-Vi IMproved 7.3 (2010 8 월 15 일, 2013 년 4 월 2 일 09:17:34) 포함 된 패치 : 1-547 및 +-지원되지 않음, 설명서에서 0 또는 양수 값을 지정해야한다고 문서화
Vladimir

6
절대 위치는 0 인덱스이며, vim이 탭을 1 인덱스로 표시하기 때문에 조금 이상합니다 (또는 내 vim 설정일 수도 있습니다)
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 매크로가 있습니다. 나는 큰 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을 눌러 현재 탭을 이동할 수 있습니다.


흠 ... 그래서 탭을 왼쪽이나 오른쪽으로 이동하려면 스크립트가 필요합니까? 붙여 넣을 수 있습니까?
Gavin

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 번째 위치로 이동

:tabm n

n위치를 나타내는 숫자는 어디에 있습니까 (0에서 시작)


탭을 왼쪽 / 오른쪽으로 이동

더 나은 해결책은 원하는 새 위치의 숫자 값을 알아내는 대신 탭을 왼쪽 또는 오른쪽으로 현재 위치로 옮기는 것입니다.

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

위의 키맵을 사용하면 현재 탭을 이동할 수 있습니다.

  • 왼쪽을 사용하여 : Alt +Left
  • 오른쪽을 사용하여 : Alt +Right

+tabmove와 사이에 차이가 tabmove+있습니까? 위치가 중요합니까?

4

다른 답변의 훌륭한 제안 외에도 마우스 지원을 활성화 한 경우 마우스로 탭을 끌어서 이동할 수도 있습니다.

GUI 위젯 탭 또는 GUI 모드에서 터미널 스타일 탭 사용 여부에 관계없이 MacVim 및 기타 GUI vim 구현에서는 기본적으로 설정되어 있습니다.

또한 set mouse=a적절한 터미널 을 가지고 있고 (예 : gnome-terminal, Terminal.app, iTerm2 및 PuTTY / KiTTY와 같은 xterm 및 대부분의 에뮬레이터) 뷰가있는 경우 순수한 tty 모드 Vim에서 작동합니다 . 열 222 이상의 마우스 클릭에도 필요합니다 set ttymouse=sgr. 볼 에서 빔을되지 않는 이유는 무엇 2백20번째 열 과거 내 마우스를 사용할 수 있습니까? 그것에 대한 배경.

vim-tabber 라는 플러그인을 작성했습니다. 이 도구는 탭을 바꾸고 이동하고 내장 탭 조작 명령의 기능을 추가하는 동시에 내장 기능과 호환되는 추가 기능을 제공합니다. 플러그인을 사용하지 않더라도 README에 일반적인 탭 사용법 정보가 있습니다.


마우스를 사용하여 탭을 다시 정렬 한 후 더 이상 마우스를 사용하여 창 크기를 조정할 수 없습니다. 대신 마우스 커서를 클릭하고 끌 때마다 마치 마우스가 "고정"을 클릭하는 것처럼 탭이 다시 정렬됩니다. 여기서 무슨 일이 일어나고 있는지 아십니까?
gmile

Jim, 질문을 별도로 게시했습니다. stackoverflow.com/questions/43734501/…
gmile

1

어떤 이유로 함수 응답이 작동하지 않았습니다. vim-ctrlspace 와 충돌이 의심 됩니다. 그럼에도 불구하고 Vim은 내장 함수를 사용하여 탭을 왼쪽과 오른쪽으로 이동할 수 있으므로 함수 답변의 수학은 필요하지 않습니다. 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>

-tabm+tabm내 정력 7.4에서 제대로 탭을 이동하지 마십시오. 또한 내 :help tabm올바른 구문으로 나열하지 않습니다. 그래서 나는 파블로의 대답else execute ...endifelseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif 사용하여 마지막 을 대체했습니다
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.