Dupliquer le tampon dans un nouvel onglet au lieu de le déplacer

10

Je souhaite souvent maximiser temporairement un tampon dans une page à onglet, puis revenir à l'ancienne configuration de tampon que je regardais. Mon flux de travail actuel pour faire quelque chose comme ça est de fermer tous les autres tampons en utilisant <c-w>oou de déplacer le tampon que je regarde actuellement vers son propre onglet <c-w>T. Le problème avec la deuxième approche est qu'elle supprime le tampon de la page à onglet d'origine.

Je POPULATE trois fichiers a.txt, b.txtet c.txtavec a, bet crespectivement.

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

Lorsque j'ouvre ces trois fichiers dans une seule page à onglet, j'obtiens ce qui suit.

entrez la description de l'image ici

Ensuite, je peux passer a.txtà un onglet par lui-même. Quand je le fais, cependant, a.txtest supprimé de la page à onglet d'origine. (Ce serait donc après un <c-w>Tgt)

entrez la description de l'image ici

J'aimerais pouvoir choisir au moment où j'aurais appuyé <c-w>Tpour conserver le contenu du tampon d'origine, créer une nouvelle page à onglet contenant uniquement le tampon qui est actuellement ciblé, puis concentrer la nouvelle page à onglet que je viens de créé. En d'autres termes, une commande presque identique, <c-w>Tsauf que la page à onglet d'origine est conservée et se a.txttrouve maintenant dans deux pages à onglet.

Y a-t-il un moyen de faire cela?

Gregory Nisbet
la source

Réponses:

13

Je ne suis pas sûr mais vous pourriez essayer :tab split(ou la version plus courte :tab sp).

La :splitcommande doit dupliquer l'affichage de la fenêtre a.txt, tandis que le :tabmodificateur doit déplacer cette fenêtre dans une page à onglet dédiée.


Si vous voulez changer le comportement de C-w T, vous pouvez le remapper comme ceci:

nnoremap <C-w>T :tab split<CR>

Plus généralement, chaque fois que vous trouvez une commande qui divise la fenêtre, et que vous préférez qu'elle crée une nouvelle page d'onglet à la place, vous pouvez la préfixer avec :tab.

Il peut être utilisé, par exemple, pour lire un tampon d'aide dans une nouvelle page à onglet:

:tab help {your_topic}

Par défaut, la nouvelle page à onglet apparaîtra après la page actuelle. Mais si vous voulez le faire apparaître ailleurs, vous pouvez préfixer :tabun nombre.

Par exemple, pour dupliquer la fenêtre courante dans une page à onglet après la 3e, vous pouvez taper:

:3tab split

Et pour le faire apparaître comme le premier:

:0tab split

Pour plus d'informations, vous pouvez lire :h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one
user9433424
la source
2

J'ai surtout évité les onglets à cause de ce problème, mais maintenant j'ai une fonction qui a le comportement de duplication d'onglets que je veux. Je l'ai testé, mais je n'ai pas vraiment commencé à l'utiliser. Il peut y avoir un inconvénient caché à ce flux de travail.

Un problème avec la fonction est qu'elle ne duplique pas une partie de l'état de la paire tampon-fenêtre précédente (comme si elle set numberest activée ou non). Spéculer un peu, c-w Tn'a probablement pas ce problème car aucune duplication n'est effectuée et la fenêtre est probablement juste réparée.

Vim a quelques listes basées sur 1 pour des choses comme les tampons, les onglets et les fenêtres. Pour autant que je sache, ils sont basés sur 1 car la 0touche est utilisée pour se déplacer au début d'une ligne et, par conséquent, passer zéro comme argument numérique est impossible.

Nous nous soucions de trois listes pour émuler cette fonctionnalité:

  • La liste globale des pages à onglet
  • La liste des fenêtres par [onglet]
  • La liste globale des tampons

Nous enregistrons toutes ces valeurs, puis créons un nouvel onglet via "tabnew". De nouveaux onglets sont toujours créés à droite, donc aucun des indices sous l'onglet dont nous venons tabnewn'est invalidé. (Une façon plus robuste de le faire serait probablement mieux cependant).

La tabnewcommande déplace également le focus vers le nouvel onglet et la fenêtre unique qu'il contient. De là, nous pouvons utiliser la buffercommande pour créer une vue sur le tampon qui avait initialement le focus.

Ensuite, nous utilisons l'index enregistré de l'onglet d'origine pour restaurer le focus sur cet onglet. Et puis, en grande partie hors de la paranoïa, nous avons mis le focus dans cet onglet sur la fenêtre d'origine. Vim semble se rappeler quelle fenêtre a le focus dans les onglets non visibles, mais je n'aime pas me fier à cela.

(Quelques points stylistiques: la conversion numérique explicite 0+, les variables globales et les assertions sont toutes intentionnelles)

function! TabDuplicate()
  " set vars, sanity checking
  let g:tabdup_win      = 0+ winnr()
  let g:tabdup_buf      = 0+ bufnr('%')
  let g:tabdup_tabpage  = 0+ tabpagenr()
  call assert_true(g:tabdup_win > 0)
  call assert_true(g:tabdup_buf > 0)
  call assert_true(g:tabdup_tabpage > 0)
  " make a new tab page,
  " the new tab page will have focus
  " none of the indices, which are all
  " less than the current index, are
  " invalidated by creating a new tab
  execute "tabnew"
  " visit the buffer we saved
  execute "buffer " . g:tabdup_buf
  " return to the original tab page
  execute "tabnext " . g:tabdup_tabpage
  " return focus to original window
  execute g:tabdup_win . " windcmd w"
endfunction
Gregory Nisbet
la source