Utiliser les onglets de Vim comme des tampons

366

Je l' ai regardé la possibilité d'utiliser des onglets dans vim (avec :tabe, :tabnewetc.) en remplacement de ma pratique actuelle d'avoir de fichiers ouverts dans la même fenêtre dans des tampons cachés.

Je voudrais que chaque fichier distinct que j'ai ouvert soit toujours dans son propre onglet. Cependant, il y a certaines choses qui empêchent cela. Comment puis-je résoudre ces problèmes:

  1. Lorsque les commandes aiment gfet ^]sautent vers un emplacement dans un autre fichier, le fichier s'ouvre dans un nouveau tampon dans l'onglet actuel. Existe-t-il un moyen pour que toutes ces sortes de commandes ouvrent le fichier dans un nouvel onglet ou basculent vers l'onglet existant avec le fichier s'il est déjà ouvert?

  2. Lors du changement de tampons, je peux utiliser :b <part of filename><tab> et cela complétera les noms des fichiers dans les tampons existants. <part of filename>peut même être le milieu d'un nom de fichier au lieu du début. Existe-t-il un équivalent pour changer d'onglet?

échancrure
la source

Réponses:

642

Arrête arrête arrête.

Ce n'est pas ainsi que les onglets de Vim sont conçus pour être utilisés. En fait, ils sont mal nommés. Un meilleur nom serait "viewport" ou "layout", car c'est ce qu'est un onglet - c'est une disposition différente des fenêtres de tous vos tampons existants.

Essayer de battre Vim en 1 tab == 1 buffer est un exercice futile. Vim ne sait pas ou de soins et il ne respectera pas sur toutes les commandes en particulier, tout ce qui utilise le tampon de quickfix ( :make, :grepet :helpgrepsont ceux qui viennent à l' esprit) ignorera joyeusement onglets et il n'y a rien que vous pouvez faire pour arrêter cette.

Au lieu:

  • :set hidden
    Si vous ne disposez pas déjà de cet ensemble, faites-le. Il fait fonctionner vim comme tous les autres éditeurs de fichiers multiples de la planète. Vous pouvez avoir des tampons modifiés qui ne sont pas visibles dans une fenêtre quelque part.
  • Utilisation :bn, :bp, :b #, :b name, et ctrl-6pour basculer entre les tampons. Je ctrl-6m'aime bien (seul, il bascule vers le tampon précédemment utilisé ou #ctrl-6bascule vers le numéro de tampon #).
  • Utilisez :lspour lister les tampons, ou un plugin comme MiniBufExpl ou BufExplorer .
Zathrus
la source
192
Pour moi, c'est un bug, pas une "erreur utilisateur". La recherche sur le Web des «onglets Vim» indique que presque tout le monde n'est pas d'accord avec vous ou ne connaît pas la «vraie» façon d'utiliser les onglets Vim. De plus, si les onglets sont vraiment des vues de "mise en page", pourquoi les titres d'onglet par défaut sont-ils le nom du fichier actuel? Si je voulais plusieurs vues du même fichier, tous mes titres d'onglet seraient du même nom (pas très utile?). Donc, dans tous les cas, l'implémentation de l'onglet par défaut dans Vim est défectueuse.
cmcginty
45
Que vas-tu montrer d'autre dans le titre de l'onglet? Il affiche le nom du tampon actuel (pas "nom de fichier"). Vous pouvez de toute façon modifier ce qui s'affiche dans le titre de l'onglet.
aehlke
46
@Casey: FWIW, quand j'ai entendu parler pour la première fois des onglets de Vim et que je devais en faire la tête et à quoi ils servaient, j'ai pensé exactement à la définition donnée par Zathrus. (Je suis un novice Vim btw). Donc non, je ne suis pas d'accord pour dire que c'est une fonctionnalité tellement cassée ou peu intuitive ... encore moins d'accord que "à propos de tout le monde" n'est pas d'accord (et pense qu'au moins une ou deux références pourraient donner plus de poids à l'affirmation). Cela fonctionne incroyablement bien pour avoir plusieurs dispositions d'écran simultanées.
ata
17
Ce commentaire est faux, je ne sais pas pourquoi il est voté ou accepté. Robince ci-dessous a la bonne réponse -: tab sball et: switchbuf sont ce que vous recherchez.
Roel
38
+1 pour "Stop, stop, stop". Vim est autant une mentalité qu'un outil. Il est important d'enseigner la mentalité aux nouveaux utilisateurs, afin qu'ils puissent utiliser l'outil à son plein potentiel.
Cody Poll
273

Un peu tard pour la fête ici, mais surpris de ne pas voir ce qui suit dans cette liste:

:tab sball - cela ouvre un nouvel onglet pour chaque tampon ouvert.

:help switchbuf- cela contrôle le comportement de commutation du tampon, essayez :set switchbuf=usetab,newtab. Cela devrait signifier basculer vers l'onglet existant si le tampon est ouvert, ou en créer un nouveau dans le cas contraire.

robince
la source
4
+1 pour switchbuf- set switchbuf=useopenest grande pour éviter le comportement ennuyeux des :make, :vimgrepet des commandes similaires qui change les tampons dans la mise en page de la fenêtre , même lorsque la mémoire tampon a déjà été affiché.
mMontu
3
pourquoi ne me convient pas? après avoir défini :se switchbuf=usetab,newtab, quand une utilisation bnpour changer de tampon, il ouvre toujours le fichier tampon dans l'onglet actuel au lieu de basculer vers l'onglet existant? Y a-t-il quelque chose qui ne va pas?
zhiyelee
173

Vim :help windowexplique assez bien la confusion "tabs vs buffers".

Un tampon est le texte en mémoire d'un fichier.
Une fenêtre est une fenêtre sur un tampon.
Une page à onglet est un ensemble de fenêtres.

L'ouverture de plusieurs fichiers est réalisée dans vim avec des tampons . Dans d'autres éditeurs (par exemple, notepad ++), cela se fait avec des onglets, donc l'onglet de nom dans vim peut être trompeur.

Les fenêtres ont pour but de diviser l'espace de travail et d'afficher plusieurs fichiers (tampons) ensemble sur un seul écran. Dans d'autres éditeurs, cela pourrait être réalisé en ouvrant plusieurs fenêtres GUI et en les réorganisant sur le bureau.

Enfin, dans cette analogie, les pages à onglet de vim correspondraient à plusieurs bureaux, c'est-à-dire différents réarrangements de fenêtres.

Comme l' help: tab-pageexplique Vim, une page à onglet peut être utilisée, lorsque l'on souhaite modifier temporairement un fichier, mais ne veut rien changer dans la disposition actuelle des fenêtres et des tampons. Dans un tel cas, une autre page à onglet peut être utilisée uniquement dans le but de modifier ce fichier particulier.

Bien sûr, vous devez vous rappeler que l'affichage du même fichier dans de nombreuses pages à onglet ou fenêtres entraînerait l'affichage de la même copie de travail (tampon).

créneler
la source
11
C'est en fait une réponse impressionnante, mais il a fallu quelques lectures pour donner un sens. buffers = tabs, windows = gui windows, tab pages = desktops font le meilleur sens jusqu'à présent que j'ai trouvé pour quelqu'un qui n'est pas familier avec les concepts
icc97
4
J'ai tendance à les considérer comme regardant à travers une fenêtre dans une pièce - buffer= objet , window= vitre et tab= fenêtre . Je peux me déplacer dans la pièce et regarder depuis différentes fenêtres ( tabs). Différentes fenêtres peuvent avoir un nombre, une disposition et une taille de volets différents . Le même objet peut être visualisé simultanément à partir de différents volets dans différentes fenêtres .
go2null
Si vous êtes familier avec les espaces de travail Linux et le paradigme Windows, vous verrez l'héritage de l' vimutilisation. Au début, il n'y avait qu'une fenêtre . Les gestionnaires de fenêtres vous ont ensuite permis de diviser les fenêtres en volets (mosaïque WM) ou en volets superposés (, WM flottant), mais ils se référaient toujours à chaque volet comme une fenêtre. Ajoutez maintenant le concept d'un espace de travail où le volet peut être affiché dans plusieurs espaces de travail. Donc, dans ce paradigme, buffer= app , window= window et tab= workspace .
go2null
56

Contrairement à certaines des autres réponses ici, je dis que vous pouvez utiliser les onglets comme vous le souhaitez. vim a été conçu pour être polyvalent et personnalisable, plutôt que de vous forcer à travailler selon des paramètres prédéfinis. Nous savons tous comment nous, les programmeurs, aimons imposer notre "éthique" à tous les autres, donc cette réalisation est certainement une caractéristique principale.

<C-w>gfest l'équivalent tabulation de la gfcommande des tampons . <C-PageUp>et <C-PageDown>basculera entre les onglets. (Dans Byobu, ces deux commandes ne fonctionnent jamais pour moi, mais elles fonctionnent en dehors de Byobu / tmux. Les alternatives sont gtet gT.) <C-w>TDéplaceront la fenêtre actuelle vers une nouvelle page d'onglet.

Si vous préférez que vim utilise un onglet existant si possible, plutôt que de créer un onglet en double, ajoutez-le :set switchbuf=usetabà votre fichier .vimrc. Vous pouvez ajouter newtabà la liste ( :set switchbuf=usetab,newtab) pour forcer les commandes QuickFix qui affichent les erreurs de compilation à s'ouvrir dans des onglets séparés. Je préfère splitplutôt, ce qui ouvre les erreurs de compilation dans une fenêtre divisée.

Si la prise en charge de la souris est activée avec :set mouse=a, vous pouvez interagir avec les onglets en cliquant dessus. Il y a également un +bouton par défaut qui créera un nouvel onglet.

Pour la documentation sur les onglets, tapez :help tab-pageen mode normal. (Après cela, vous pouvez vous entraîner à déplacer une fenêtre vers un onglet en utilisant <C-w>T.) Il y a une longue liste de commandes. Certaines des commandes de la fenêtre concernent les onglets, vous pouvez donc également consulter cette documentation via :help windows.

Ajout: 2013-12-19

Pour ouvrir plusieurs fichiers dans vim avec chaque fichier dans un onglet distinct, utilisez vim -p file1 file2 .... Si vous êtes comme moi et oubliez toujours d'ajouter -p, vous pouvez l'ajouter à la fin, car vim suit les règles normales d'analyse des options de ligne de commande. Vous pouvez également ajouter un mappage d'alias bash vimà vim -p.

Zenexer
la source
3
+1 pour vim -pcependant être conscient que jusqu'à 10 onglets seront affichés par défaut. Les fichiers supplémentaires sont chargés dans des tampons, mais ne s'affichent pas dans leur propre onglet.
IanB
@IanB: comment surmonter le paramètre par défaut de le limiter à 10 onglets?
0xC0000022L
3
@ 0xC0000022L voir tabpagemaxparamètre
IanB
14

J'ai rencontré le même problème. Je voulais que les onglets fonctionnent comme des tampons et je n'arrive jamais à les obtenir. La solution sur laquelle j'ai finalement opté était de faire en sorte que les tampons se comportent comme des tabulations!

Découvrez le plugin appelé Mini Buffer Explorer , une fois installé et configuré, vous pourrez travailler avec les tampons virtuellement de la même manière que les onglets sans perdre aucune fonctionnalité.

Dominic Dos Santos
la source
10

C'est une réponse pour ceux qui ne connaissent pas Vim et qui viennent d'autres éditeurs de texte (dans mon cas Sublime Text).

J'ai lu toutes ces réponses et ce n'était toujours pas clair. Si vous les lisez suffisamment, les choses commencent à avoir un sens, mais cela m'a pris des heures à faire des allers-retours entre les questions.

La première chose est, comme d'autres l'ont expliqué:

Les pages à onglets ressemblent beaucoup à des onglets , elles agissent comme des onglets et ressemblent beaucoup à des onglets dans la plupart des autres éditeurs GUI, mais elles ne le sont pas. Je pense que c'est un mauvais modèle mental qui a été construit dans Vim, qui obscurcit malheureusement le pouvoir supplémentaire que vous avez dans une page à onglet.

La première description que j'ai comprise était de la réponse de @ crenate, c'est qu'ils sont l'équivalent de plusieurs bureaux. Quand on le voit à cet égard, vous n'aurez jamais que deux bureaux ouverts mais beaucoup de fenêtres GUI ouvertes dans chacun.

Je dirais qu'ils sont similaires à ceux d'autres éditeurs / navigateurs:

  1. Regroupements d'onglets
  2. Espaces de travail Sublime Text (c'est-à-dire une liste des fichiers ouverts que vous avez dans un projet)

Quand vous les voyez comme ça, vous vous rendez compte de leur puissance que vous pouvez facilement regrouper des ensembles de fichiers (tampons), par exemple vos fichiers CSS, vos fichiers HTML et vos fichiers JS dans différentes pages à onglet. Ce qui est en fait assez génial.

Autres descriptions que je trouve déroutantes

Fenêtre

Cela n'a aucun sens pour moi. Une fenêtre qui, bien qu'elle ait un terme de dictionnaire défini , je n'ai entendu parler que de fenêtres Vim dans le :help windowdocument. Viewport n'est pas un terme que j'ai jamais entendu en ce qui concerne les éditeurs comme Sublime Text, Visual Studio, Atom, Notepad ++. En fait, je n'en avais jamais entendu parler pour Vim jusqu'à ce que je commence à essayer d'utiliser les pages à onglets.

Si vous affichez des pages à onglet comme plusieurs bureaux, alors se référer à un bureau comme une seule fenêtre semble étrange.

Espaces de travail

Cela a peut-être plus de sens, la définition du dictionnaire est:

Une installation de stockage de mémoire pour une utilisation temporaire.

C'est donc comme un endroit où vous stockez un groupe de tampons.

Au départ, je ne ressemblais pas au concept d'un espace de travail de Sublime Text qui est une liste de tous les fichiers que vous avez ouverts dans votre projet:

le fichier sublime-workspace, qui contient des données spécifiques à l'utilisateur, telles que les fichiers ouverts et les modifications de chacun.

Cependant, en y réfléchissant davantage, cela est en fait d'accord. Si vous considérez une page à onglet Vim comme un projet Sublime Text, il semblerait étrange de n'avoir qu'un seul fichier ouvert dans chaque projet et de continuer à basculer entre les projets. C'est pourquoi il est étrange d'utiliser une page à onglet pour ouvrir un seul fichier.

Collection de fenêtres

Le :help windowfait référence aux pages à onglet de cette façon. De plus, de nombreuses autres réponses utilisent le même concept. Cependant, jusqu'à ce que vous compreniez ce qu'est une fenêtre Vim, alors ce n'est pas très utile, comme construire un château sur du sable.

Comme je l'ai mentionné ci-dessus, une fenêtre vim est la même qu'une fenêtre d'affichage et silencieuse parfaitement expliquée dans cet article linux.com :

Une fonctionnalité très utile dans Vim est la possibilité de diviser la zone visible entre un ou plusieurs fichiers, ou simplement de diviser la fenêtre pour afficher plus facilement deux bits du même fichier. La documentation Vim y fait référence comme une fenêtre ou une fenêtre, de manière interchangeable.

Vous connaissez peut-être déjà cette fonctionnalité si vous avez déjà utilisé la fonction d'aide de Vim en utilisant: rubrique d'aide ou en appuyant sur la touche F1. Lorsque vous entrez dans l'aide, Vim divise la fenêtre et ouvre la documentation d'aide dans la fenêtre supérieure, laissant votre document ouvert dans la fenêtre inférieure.

Je trouve étrange qu'une page à onglet soit appelée une collection de fenêtres au lieu d'une collection de tampons. Mais je suppose que vous pouvez ouvrir deux pages d'onglets distinctes chacune avec plusieurs fenêtres pointant toutes vers le même tampon, du moins c'est ce que je comprends jusqu'à présent.

icc97
la source
1
Enfin, après une année solide d'utilisation à plein temps de Vim, je suis tombé sur un cas où je voulais utiliser plus d'une page à onglet. Actuellement, les tampons fonctionnent parfaitement pour moi car j'utiliserais des onglets dans d'autres éditeurs. Mais ayant un grand moniteur, je comparais tout un tas de 3-4 tampons différents. Ensuite, un collègue m'a demandé de rechercher du code ailleurs dans la base de code. Plutôt que de perdre mon ensemble de fenêtres de comparaison, je pourrais simplement créer une nouvelle page à onglet qui me permet ensuite de faire une recherche distincte comme je le ferais en utilisant normalement Vim et puis je pourrais fermer la page à onglet une fois terminée et revenir à mon ensemble initial
icc97
4

En regardant: onglets d'aide il ne ressemble pas à vim veut fonctionner comme vous le faites ...

Les tampons sont partagés entre les onglets, il ne semble donc pas possible de verrouiller un tampon donné pour qu'il n'apparaisse que sur un certain onglet.

C'est une bonne idée, cependant.

Vous pourriez probablement obtenir l'effet souhaité en utilisant un terminal qui prend en charge les onglets, comme multi-gnome-terminal, puis en exécutant des instances vim dans chaque onglet de terminal. Pas parfait, cependant ...

Mike G.
la source
J'ai essayé cela, le problème avec cela, en plus de rendre la navigation entre les onglets difficile, est que le texte tiré ne peut pas être partagé entre les onglets des terminaux, car ce sont essentiellement deux terminaux / shells différents
puk
@puk: Essayez le plugin vim YankRing. Il enregistre le texte retiré dans un fichier, il peut donc être partagé entre les instances de Vim.
pixelastic
@Pixelastic J'ai trouvé ici une solution appropriée pour tirer sur le presse-papiers du système. En outre, Vim fonctionne mieux dans un cas. J'ai cessé de le faire faire ce que je voulais et j'ai appris à utiliser correctement vim :-) stackoverflow.com/a/8757876/654789
puk
@puk: Merci, il ne m'est pas venu à l'esprit que l'utilisation du presse-papiers du système signifie également le partager entre les instances de vim :)
pixelastic
4
  • Vous pouvez mapper des commandes qui manipulent normalement les tampons pour manipuler les onglets, comme je l'ai fait avec gf dans mon .vimrc:

    map gf :tabe <cfile><CR>
    

    Je suis sûr que vous pouvez faire de même avec [^

  • Je ne pense pas que vim le supporte (pour l'instant). J'utilise gt et gT pour passer aux onglets suivant et précédent, respectivement. Vous pouvez également utiliser Ngt, où N est le numéro de tabulation. Un béguin que j'ai, c'est que, par défaut, le numéro de tabulation n'est pas affiché dans la ligne de tabulation. Pour résoudre ce problème, j'ai mis quelques fonctions à la fin de mon fichier .vimrc (je n'ai pas collé ici car il est long et n'a pas été formaté correctement).

Lucas Oman
la source
<c-w>gfouvrira le nom du fichier sous le curseur dans un nouvel onglet
Peter Rincker
4

J'utilise des tampons comme des onglets, en utilisant le plugin BufExplorer et quelques macros:

" CTRL+b opens the buffer list
map <C-b> <esc>:BufExplorer<cr>

" gz in command mode closes the current buffer
map gz :bdelete<cr>

" g[bB] in command mode switch to the next/prev. buffer
map gb :bnext<cr>
map gB :bprev<cr>

Avec BufExplorer, vous n'avez pas de barre d'onglets en haut, mais d'un autre côté, il économise de l'espace sur votre écran, et vous pouvez avoir un nombre infini de fichiers / tampons ouverts et la liste des tampons est consultable ...

jkramer
la source
2

Si vous souhaitez que les tampons fonctionnent comme des onglets, consultez le plugin de tabline .

Cela utilise une seule fenêtre et ajoute une ligne en haut pour simuler les onglets (affichant simplement la liste des tampons). Cela est sorti il ​​y a longtemps lorsque les onglets n'étaient pris en charge que dans GVim mais pas dans la ligne de commande vim. Puisqu'il ne fonctionne qu'avec des tampons, tout s'intègre bien avec le reste de vim.

thien.vuong
la source