Déplacer la fenêtre existante vers l'onglet existant

14

Parfois, je dois déplacer des fenêtres dans un onglet déjà existant, et je me demandais s'il y avait un raccourci de commande / clavier qui pourrait le faire. Je sais que je peux fermer la fenêtre, basculer sur l'onglet, puis l'ouvrir dans une nouvelle division, mais je me demandais s'il y avait un moyen plus court d'accomplir cela. Notez que je veux le déplacer vers un onglet existant , pas un nouvel onglet comme le <C-w>Tfait.

Arbre à feuilles persistantes
la source
Il n'est pas possible de déplacer des fenêtres entre les onglets.
lcd047
Hmm, c'est dommage. Je pourrais probablement créer un mappage ou une commande qui pourrait l'accomplir cependant.
EvergreenTree
Je pense que le mieux que vous puissiez faire est d'enregistrer tous les paramètres de la fenêtre, puis de les recréer sur l'onglet existant.
tommcdo

Réponses:

10

Bien qu'il existe des commandes pour déplacer les fenêtres existantes dans la page à onglet actuelle (c'est-à-dire affecter la disposition des fenêtres en les faisant pivoter, les redimensionner et les déplacer), il n'y a pas de commandes pour déplacer une fenêtre vers un autre onglet.

Comme une fenêtre n'est qu'une fenêtre dans un tampon chargé, vous devez:

  1. Notez le numéro de tampon affiché dans la fenêtre actuelle.
  2. :close! la fenêtre.
  3. Basculez vers la page à onglet cible existante.
  4. :sbuffer le numéro de tampon pour le rouvrir.

Vous perdrez ainsi toutes les options spécifiques aux fenêtres. Vous pouvez également les enregistrer et les restaurer dans un script.

Ingo Karkat
la source
J'ai pensé que c'était le cas. Je pourrais probablement faire un petit script qui fait exactement cela.
EvergreenTree
2
  1. aller à l'onglet cible existant
  2. divisez-le comme vous le souhaitez
  3. :b ab(tabuler le reste)

abne sont que des lettres aléatoires, remplacez-les par le début du nom de fichier souhaité. :bla complétion de tabulation a très bien fonctionné pour moi, il peut généralement trouver le bon tampon source basé sur une seule lettre et 1-2 Tabtouches.

L'avantage de cette approche par rapport à Ingo est le manque de noter ou de se souvenir de quoi que ce soit, ce qui signifie moins de charge cognitive. Nom de fichier que vous connaissez déjà de toute façon.

lkraav
la source
2

Les deux commandes définies ci-dessous déplacent tous les tampons de l'onglet de droite vers l'onglet actuel, puis ferment l'onglet de droite. Mtabsples déplace en se divisant horizontalement et en Mtabvspse divisant verticalement. Vous devez déplacer l'onglet fusionné avant d'utiliser les commandes. Utilisez +tabm, -tabmou <n>tabm.

Installer

Ajoutez le script vim ci-dessous à votre vimrc:

function! Mtab(vert)
    if tabpagenr() == tabpagenr("$")
        return 0
    endif
    +tabnext
    let s:killed_tab = tabpagenr()
    let s:buf_list = tabpagebuflist()
    -tabnext
    for item in s:buf_list
        if a:vert
            vsp
        else
            sp
        endif
        execute "buf " . item
    endfor
    execute "tabclose " . s:killed_tab
endfunction

command! Mtabsp call Mtab(0)
command! Mtabvsp call Mtab(1)

Détails techniques

La fonction Mtab reçoit un paramètre vert. Il détermine si l'onglet actuel est divisé horizontalement ou verticalement.

Le résultat souhaité est atteint grâce aux étapes suivantes:

  1. Nous passons temporairement à l'onglet suivant
  2. Utilisez deux variables pour référencer son numéro de tabulation et ses tampons
  3. Revenir à l'onglet courant
  4. Nous séparons l'onglet et ouvrons chaque tampon
  5. Enfin, nous fermons l'onglet de droite

Si notre onglet actuel est le dernier, les commandes sont ignorées.

evpo
la source
1

Si c'est un fichier tampon (ne fonctionnera pas pour gratter les tampons etc.), vous pouvez:

  1. :let @f=@%ENTER - dans la fenêtre source;
    • Ceci remplace le contenu du registre normal f par le contenu du registre spécial % , qui contient le nom du fichier actuel.
    • Remarque: J'ai choisi le registre f comme dans le fichier , mais vous pouvez utiliser n'importe quel autre registre que vous aimez.
    • Vous pouvez vérifier que le registre contient le chemin correct avec: :echo @f
  2. Facultativement: Ctrl-WCtrl-Q- pour fermer l'ancienne fenêtre;
  3. gt/ gT- accédez à l'onglet cible (et à la fenêtre);
  4. Ctrl-Ws - divisez l'onglet comme vous le souhaitez, pour ouvrir une nouvelle fenêtre;
  5. :e␣Ctrl-RfENTER
    • dans la fenêtre nouvellement ouverte, charge un fichier à partir du chemin stocké dans le registre f ;
    • Remarque: le caractère ␣ marque ici un espace régulier.

Remarque importante: l'étape finale ne fonctionnera pas correctement si le chemin contient des espaces ou des caractères spéciaux! :-( Comme solution de contournement, la commande suivante, légèrement plus longue, devrait fonctionner pour les chemins avec des espaces (bien qu'elle puisse toujours échouer pour certains autres caractères spéciaux):

  • :e␣"Ctrl-Rf"ENTER

(c'est-à-dire en citant le résultat de Ctrl-R, f )

Inspiré par les réponses de lkraav et ingo-karkat .

Akavel
la source
C'est fantastique, j'ai besoin de mettre en place un mappage pour "couper et coller" de Windows dans les onglets.
dragon788