Existe-t-il une commande vim pour déplacer un onglet?

200

Comment puis-je modifier la position / l'ordre de mon onglet actuel dans Vim? Par exemple, si je veux repositionner mon onglet actuel pour qu'il soit le premier onglet?

Gavin
la source

Réponses:

271

Vous pouvez déplacer un onglet en :tabmutilisant des arguments absolus relatifs ou à index zéro.

absolu:

  • Déplacer l'onglet vers la position i: :tabm i

relatif:

  • Déplacer les positions de l'onglet i vers la droite: :tabm +i
  • Déplacer les positions de l'onglet i vers la gauche: :tabm -i

C'est une fonctionnalité relativement nouvelle. Donc, si cela ne fonctionne pas, essayez de mettre à jour votre vim.

Peut-être qu'elle le fera
la source
2
Ça ne marche pas. : tabm n'accepte pas d'arguments relatifs, bien qu'il le devrait vraiment.
Gavin
6
Vous devez mettre à jour votre vim si ce n'est pas le cas, car :tabmaccepte les arguments relatifs dans vim 7.3.
maybeshewill
J'ai VIM - Vi IMproved 7.3 (15 août 2010, compilé le 2 avril 2013 09:17:34) Correctifs inclus: 1-547 et + - non pris en charge là-bas, la documentation a dit que je devrais spécifier une valeur nulle ou positive
Vladimir
6
Notez que la position absolue est zéro-index, ce qui est un peu étrange puisque vim affiche les onglets indexés 1 (ou ce pourrait être ma configuration vim)
Elliot Foster
1
Cela ne gère pas le cas d'emballage
Andy Ray
38

Voulez-vous dire déplacer l'onglet actuel? Cela fonctionne en utilisant 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.

J'ai deux raccourcis clavier qui déplacent mon onglet actuel vers la gauche ou vers la droite. Très utile!

EDIT: Voici ma macro VIM. Je ne suis pas un gros codeur ViM , alors peut-être que cela pourrait être mieux, mais c'est comme ça que ça fonctionne pour moi:

" 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

Après cela, vous pouvez lier des clés, par exemple comme ceci dans votre .vimrc:

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

Vous pouvez maintenant déplacer votre onglet actuel en appuyant sur F9 ou F10.

hochl
la source
Hmm ... donc déplacer un onglet d'une position vers la gauche ou la droite nécessite un script? Pouvez-vous le coller?
Gavin
2
J'ai ajouté mes scripts. Est-ce que cela vous aide?
hochl
25

Je cherchais la même chose et après quelques articles, j'ai trouvé un moyen plus simple qu'une fonction:

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

Le tabpagenr () retourne la position de l' onglet réelle et tabmove utilise des index.

J'ai mappé la droite sur Ctrl + L et la gauche sur Ctrl + H:

map <C-H> :execute "tabmove" tabpagenr() - 2 <CR>
map <C-J> :execute "tabmove" tabpagenr() <CR>
Pablo Díaz Ogni
la source
1
Cela ne gère pas le cas d'emballage, FYI
Andy Ray
2
J'ai dû utiliser :execute "tabmove" tabpagenr() + 1 <CR>pour me déplacer vers la droite. Pour MacVim 8.0.1420 (144) .
Paul Oliver
5

Déplacer l'onglet actuel vers la n e position

:tabm n

nest un nombre indiquant la position (à partir de zéro)


Déplacer les onglets vers la gauche / droite

Je pense qu'une meilleure solution consiste à déplacer l'onglet vers la gauche ou la droite vers sa position actuelle au lieu de déterminer la valeur numérique de la nouvelle position dans laquelle vous le souhaitez.

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

Avec les keymaps ci-dessus, vous pourrez déplacer l'onglet actuel:

  • À gauche en utilisant: Alt +Left
  • À droite en utilisant: Alt +Right
Sheharyar
la source
Y a-t-il une différence entre +tabmoveet tabmove+? La position est-elle importante?
4

En plus des suggestions fines dans d'autres réponses, vous pouvez également simplement faire glisser les onglets avec la souris pour les déplacer, si la prise en charge de la souris est activée.

Ceci est activé par défaut dans MacVim et d'autres implémentations de GUI vim, que ce soit en utilisant les onglets de widget GUI ou les onglets de style de terminal en mode GUI.

Il fonctionne également en mode pur tty Vim, si vous avez set mouse=aet avez un terminal approprié (xterm et la plupart des émulateurs de celui-ci, tels que gnome-terminal, Terminal.app, iTerm2 et PuTTY / KiTTY, pour nommer une vue). Notez que les clics de souris au-delà de la colonne 222 nécessitent également set ttymouse=sgr; voir Dans Vim, pourquoi ma souris ne fonctionne-t-elle pas au-delà de la 220e colonne? pour le fond à ce sujet.

J'ai écrit un plugin appelé vim-tabber qui fournit des fonctionnalités supplémentaires pour permuter les onglets, les déplacer et ajouter aux capacités des commandes de manipulation des onglets intégrées, tout en restant largement compatible avec les commandes intégrées. Même si vous choisissez de ne pas utiliser le plugin, le README contient des informations générales sur l'utilisation des onglets.

Jim Stewart
la source
après avoir réorganisé l'onglet à l'aide de la souris, je ne peux plus redimensionner le volet à l'aide de la souris. Au lieu de cela, chaque fois que je clique et que je fais glisser le curseur de la souris, les onglets se réorganisent à nouveau, comme si la souris cliquait sur "coincé". Avez-vous une idée de ce qui pourrait se passer ici?
gmile
Jim, j'ai posté la question séparément: stackoverflow.com/questions/43734501/…
gmile
1

Pour une raison quelconque, la réponse de la fonction a cessé de fonctionner pour moi. Je soupçonne un conflit avec vim-ctrlspace . Quoi qu'il en soit, les calculs dans la réponse de la fonction ne sont pas nécessaires, car Vim peut déplacer les onglets vers la gauche et la droite avec des fonctions intégrées. Nous avons juste à gérer le boîtier d'emballage , car Vim n'est pas convivial.

" 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
la source
Le -tabmet +tabmdans mon vim 7.4 ne déplace pas correctement les onglets. De plus, my :help tabmne répertorie pas cela comme une syntaxe valide. J'ai donc remplacé le dernier else execute ...endifen elseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif utilisant la réponse de Pablo
cfi
Pour que l'emballage commence / fin, j'utilise maintenant cette solution par rapport à la mienne car j'ai utilisé deux fonctions et son nettoyeur de code pour lire et maintenir. Juste inversé l'ordre de tabmoveet le signe -/ +dans la executeligne.
rld.
1

Voici ma macro, en utilisant les arguments relatifs de la réponse 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>

Il gère le boîtier d'emballage.

Jérôme
la source