Existe um comando vim para realocar uma guia?

200

Como posso alterar a posição / ordem da minha guia atual Vim? Por exemplo, se eu quiser reposicionar minha guia atual para ser a primeira guia?

Gavin
fonte

Respostas:

271

Você pode realocar uma guia :tabmusando argumentos absolutos relativos ou com índice zero.

absoluto:

  • Mova a guia para a posição i: :tabm i

relativo:

  • Mova as posições da guia i para a direita: :tabm +i
  • Mova as posições da guia i para a esquerda: :tabm -i

É um recurso relativamente novo. Portanto, se não funcionar, tente atualizar o seu vim.

maybeshewill
fonte
2
Isso não funciona. : tabm não aceita argumentos relativos, embora realmente deva.
Gavin
6
Você deve atualizar seu vim, se não o fizer, porque :tabmaceita argumentos relativos no vim 7.3.
maybeshewill
Eu tenho o VIM - Vi IMproved 7.3 (15 de agosto de 2010, compilado em 2 de abril de 2013 09:17:34) Correções incluídas: 1-547 e + - sem suporte lá, a documentação dizia que eu deveria especificar valor zero ou positivo
Vladimir
6
Note-se que a posição absoluta é zero-índice, que é um pouco estranho, já que vim exibe as guias 1-indexados (ou que poderia ser apenas o meu vim config)
Elliot Foster
1
Isso não lida com o caso da embalagem
Andy Ray
38

Você quer dizer mover a guia atual? Isso funciona usando 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.

Eu tenho duas ligações de teclas que movem minha guia atual para a esquerda ou para a direita. Muito conveniente!

EDIT: Aqui está minha macro VIM. Eu não sou um grande programador de ViM , então talvez isso possa ser melhorado, mas é assim que funciona para mim:

" 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

Depois disso, você pode vincular chaves, por exemplo, no seu .vimrc:

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

Agora você pode mover sua guia atual pressionando F9 ou F10.

hochl
fonte
Hmm ... então mover uma guia uma posição para a esquerda ou para a direita requer um script? Você pode colar?
Gavin
2
Eu adicionei meus scripts. Isso ajuda você?
hochl
25

Eu estava procurando o mesmo e depois de alguns posts, encontrei uma maneira mais simples do que uma função:

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

O tabpagenr () retorna a posição real da guia e tabmove usa índices.

Mapeei a direita para Ctrl + L e a esquerda para Ctrl + H:

map <C-H> :execute "tabmove" tabpagenr() - 2 <CR>
map <C-J> :execute "tabmove" tabpagenr() <CR>
Pablo Díaz Ogni
fonte
1
Isso não lida com o caso de embalagem, FYI
Andy Ray
2
Eu tive que usar :execute "tabmove" tabpagenr() + 1 <CR>para mover para a direita. Para MacVim 8.0.1420 (144) .
Paul Oliver
5

Mover a guia atual para a nésima posição

:tabm n

Onde nestá um número que indica a posição (começando do zero)


Mover guias para a esquerda / direita

Eu acho que uma solução melhor é mover a guia para a esquerda ou direita para sua posição atual, em vez de descobrir o valor numérico da nova posição em que você deseja.

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

Com os mapas de teclas acima, você poderá mover a guia atual:

  • À esquerda, usando: Alt +Left
  • Para a direita usando: Alt +Right
Sheharyar
fonte
Existe alguma diferença entre +tabmovee tabmove+? A posição importa?
4

Além das sugestões de outras respostas, você também pode simplesmente arrastar as guias com o mouse para movê-las, se o suporte ao mouse estiver ativado.

Por padrão, está ativado no MacVim e em outras implementações da GUI vim, seja usando as guias do widget da GUI ou as guias de estilo do terminal no modo GUI.

Ele também funciona no modo tty puro do Vim, se você tiver set mouse=ae possuir um terminal adequado (xterm e a maioria dos emuladores, como gnome-terminal, Terminal.app, iTerm2 e PuTTY / KiTTY, para citar uma visualização). Observe que os cliques do mouse além da coluna 222 também exigem set ttymouse=sgr; consulte No Vim, por que meu mouse não passa da 220ª coluna? para saber mais sobre isso.

Eu escrevi um plugin chamado vim-tabber que fornece algumas funcionalidades adicionais para trocar de guia, alterá- las e aumentar os recursos dos comandos internos de manipulação de guias, mantendo-se amplamente compatível com os recursos internos. Mesmo se você optar por não usar o plug-in, há algumas informações gerais de uso da guia no README.

Jim Stewart
fonte
depois de reorganizar a guia usando o mouse, não posso mais redimensionar o painel usando o mouse. Em vez disso, toda vez que clico e arrasto o cursor do mouse, as guias são reorganizadas novamente, como se o mouse clique em "preso". Você tem alguma idéia do que pode estar acontecendo aqui?
Gmile
Jim, eu
publiquei
1

Por alguma razão, a resposta da função parou de funcionar para mim. Suspeito de um conflito com o vim-ctrlspace . Independentemente disso, a matemática na resposta da função é desnecessária, pois o Vim pode mover as guias para a esquerda e para a direita com as funções incorporadas. Nós apenas temos que lidar com o caso de embalagem , porque o Vim não é fácil de usar.

" 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
fonte
O -tabme +tabmno meu vim 7.4 não movem corretamente as guias. Também o meu :help tabmnão lista isso como uma sintaxe válida. Então eu ter a última else execute ...endifcom elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif uso de Pablo resposta
TPI
Para o empacotamento no início / fim, estou usando esta solução agora por conta própria, porque usei duas funções e seu limpador de código para ler e manter. Apenas inverti a ordem tabmovee o sinal -/ +na executelinha.
rld.
1

Aqui está minha macro, usando argumentos relativos da resposta de @ 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>

Ele lida com o estojo de embalagem.

Jérôme
fonte