¿Hay un comando vim para reubicar una pestaña?

200

¿Cómo puedo cambiar la posición / orden de mi pestaña actual Vim? Por ejemplo, si quiero reposicionar mi pestaña actual para que sea la primera pestaña.

Gavin
fuente

Respuestas:

271

Puede reubicar una pestaña :tabmutilizando argumentos absolutos relativos o de índice cero.

absoluto:

  • Mueva la pestaña a la posición i: :tabm i

relativo:

  • Mueva la pestaña i posiciones a la derecha: :tabm +i
  • Mueva la pestaña i posiciones a la izquierda: :tabm -i

Es una característica relativamente nueva. Entonces, si no funciona, intente actualizar su vim.

quizás ella lo hará
fuente
2
Esto no funciona : tabm no acepta argumentos relativos, aunque realmente debería hacerlo.
Gavin
66
Debería actualizar su vim si no lo hace, porque :tabmacepta argumentos relativos en vim 7.3.
maybeshewill
Tengo VIM - Vi IMproved 7.3 (15 de agosto de 2010, compilado el 2 de abril de 2013 09:17:34) Parches incluidos: 1-547 y + - no admitidos allí, la documentación dice que debería especificar cero o valor positivo
Vladimir
66
Tenga en cuenta que la posición absoluta es el índice cero, lo cual es un poco extraño ya que vim muestra pestañas indexadas 1 (o podría ser mi configuración vim)
Elliot Foster
1
Esto no maneja el caso de envoltura
Andy Ray
38

¿Te refieres a mover la pestaña actual? Esto 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.

Tengo dos combinaciones de teclas que mueven mi pestaña actual, una hacia la izquierda o la derecha. ¡Muy útil!

EDITAR: Aquí está mi macro VIM. No soy un gran codificador de ViM , así que tal vez podría hacerse mejor, pero así es como funciona para mí:

" 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

Después de esto, puede vincular claves, por ejemplo, así en su .vimrc:

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

Ahora puede mover su pestaña actual presionando F9 o F10.

hochl
fuente
Hmm ... así que mover una pestaña una posición hacia la izquierda o hacia la derecha requiere un script? ¿Puedes pegarlo?
Gavin
2
Agregué mis guiones. ¿Esto te ayuda?
hochl
25

Estaba buscando lo mismo y después de algunas publicaciones encontré una forma más simple que una función:

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

El tabpagenr () devuelve la posición real ficha y tabmove utiliza índices.

Mapeé la derecha a Ctrl + L y la izquierda a Ctrl + H:

map <C-H> :execute "tabmove" tabpagenr() - 2 <CR>
map <C-J> :execute "tabmove" tabpagenr() <CR>
Pablo Díaz Ogni
fuente
1
Esto no maneja el caso de envoltura, FYI
Andy Ray
2
Tuve que usar :execute "tabmove" tabpagenr() + 1 <CR>para moverme a la derecha. Para MacVim 8.0.1420 (144) .
Paul Oliver
5

Mover la pestaña actual a la enésima posición

:tabm n

Donde nhay un número que denota la posición (comenzando desde cero)


Mover pestañas a la izquierda / derecha

Creo que una mejor solución es mover la pestaña hacia la izquierda o hacia la derecha a su posición actual en lugar de calcular el valor numérico de la nueva posición en la que la quieres.

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

Con los mapas de teclas anteriores, podrá mover la pestaña actual:

  • A la izquierda usando: Alt +Left
  • A la derecha usando: Alt +Right
Sheharyar
fuente
¿Hay alguna diferencia entre +tabmovey tabmove+? ¿Importa la posición?
4

Además de las excelentes sugerencias en otras respuestas, también puede arrastrar las pestañas con el mouse para moverlas, si tiene habilitado el soporte para mouse.

Esto está activado de forma predeterminada en MacVim y otras implementaciones de GUI vim, ya sea utilizando las pestañas de widget de GUI o las pestañas de estilo de terminal en modo GUI.

También funciona en modo tty puro Vim, si tiene set mouse=ay tiene un terminal adecuado (xterm y la mayoría de sus emuladores, como gnome-terminal, Terminal.app, iTerm2 y PuTTY / KiTTY, por nombrar una vista). Tenga en cuenta que los clics del mouse más allá de la columna 222 también requieren set ttymouse=sgr; Ver en Vim, ¿por qué mi mouse no pasa de la columna 220? para antecedentes sobre eso.

He escrito un complemento llamado vim-tabber que proporciona algunas funcionalidades adicionales para intercambiar pestañas, cambiarlas y agregar a las capacidades de los comandos de manipulación de pestañas incorporados, sin dejar de ser en gran medida compatible con las funciones incorporadas. Incluso si elige no usar el complemento, hay información general sobre el uso de pestañas en el archivo README.

Jim Stewart
fuente
después de reorganizar la pestaña con el mouse, ya no puedo cambiar el tamaño del panel con el mouse. En cambio, cada vez que hago clic y arrastro el cursor del mouse, las pestañas se reorganizan nuevamente, como si el clic del mouse estuviera "atascado". ¿Tienes alguna idea de lo que podría estar pasando aquí?
gmile
Jim, he publicado la pregunta por separado: stackoverflow.com/questions/43734501/…
gmile
1

Por alguna razón, la respuesta de la función dejó de funcionar para mí. Sospecho un conflicto con vim-ctrlspace . Independientemente, la matemática en la respuesta de la función es innecesaria, ya que Vim puede mover pestañas de izquierda a derecha con funciones integradas. Solo tenemos que manejar el caso de envoltura , porque Vim no es 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
fuente
El -tabmy +tabmen mi vim 7.4 no mueven correctamente las pestañas. Además, mi :help tabmno enumera esto como una sintaxis válida. Así que reemplacé el último else execute ...endifcon el elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif uso de la respuesta de Pablo
cfi
Para el ajuste de inicio / fin, estoy usando esta solución ahora por mi cuenta porque usé dos funciones y su limpiador de código para leer y mantener. Simplemente invirtió el orden tabmovey el signo -/ +en la executelínea.
rld.
1

Aquí está mi macro, usando argumentos relativos de la respuesta 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>

Se encarga de la caja de envoltura.

Jérôme
fuente