Comment lier un ensemble de tampons à un onglet?

14

Lorsque j'ai besoin de travailler sur différents projets en même temps, j'ai le flux de travail suivant:

  • Je crée un onglet pour chaque projet.
  • Dans chaque onglet, j'ouvre les fichiers que je souhaite modifier, ce qui crée plusieurs tampons.
  • En option, si j'ai besoin de voir deux (ou plus) fichiers en même temps, je crée des fenêtres divisées, j'ai donc un onglet contenant différentes fenêtres qui affiche un tampon.

Pour naviguer entre mes tampons, je ne l'utilise pas vraiment :lset :b [name or number of buffer]j'ai plutôt créé des mappages pratiques me permettant de basculer entre les tampons avec :bnextet:bprevious

Cette façon de travailler est plutôt bonne mais quelque chose me dérange: les tampons sont partagés entre les onglets.

Si j'ouvre file1et file2dedans tab1et file3dedans tab2, si tab1j'utilise plusieurs fois :bnextje verrai file3dans cet onglet que je ne veux pas. Le flux de travail que je voudrais obtenir est le suivant :

  • Démarrez vim (j'ai un premier onglet avec un tampon dedans): $ vim foo
  • Ajoutez un tampon à cet onglet: :e bar
  • Ouvrez un nouvel onglet et passez-y: :tabnew
  • Ouvrez un nouveau tampon dans cet onglet: :e baz
  • Si je reste dans ce tampon et que je le fais :bnextou :bpreviousje reste sur le baztampon (car c'est le seul dans cet onglet)
  • Si je vais dans l'onglet précédent :tabpreviouset que j'exécute plusieurs fois, :bnextje basculerai uniquement entre les tampons fooet barmais ne verrai pasbaz

Voici donc ma question: est-il possible de lier un ensemble de tampons à un onglet et de faire vim interdire l'accès à certains tampons d'un autre onglet que celui dans lequel ils sont censés être?

Remarque: je sais que l'utilisation :b [myBuffer]serait un moyen de conserver un tampon dans un onglet, mais lorsque j'ai 3 ou 4 fichiers à modifier, j'ai l'impression que je suis vraiment plus rapide à utiliser mes mappages qu'à taper le nom du tampon (même si je peux ne tapez que quelques caractères pour correspondre au nom du tampon) .

statox
la source
1
Voici une vieille discussion mettant en évidence les avantages et les inconvénients d'une telle approche, et suggérant à la place quelque chose qui aujourd'hui pourrait être traduit par: plusieurs instances de vim (une par projet / liste de tampons) + tmux: vim.1045645.n5.nabble.com/…
VanLaser
@VanLaser: Merci pour le lien, c'est une discussion intéressante! En fait, j'inclus tmux et différentes instances de vim lorsque je suis sur ma machine personnelle. Ma question vient du fait que je dois utiliser Windows pour mon travail professionnel et je n'aime vraiment pas comment les fenêtres sont gérées: utiliser alt+tab(ou pire encore la souris) est beaucoup moins facile que de changer d'onglet dans vim.
statox
1
Peut - être que vim-ctrlspace peut vous aider - il annonce par liste de tampons de tabulation; Mais je ne l'utilise pas.
VanLaser

Réponses:

7

Mhh, je n'ai trouvé aucun plugin, mais vous pouvez l'écrire vous-même. Vous devez apprendre vimscript pour cela. Je viens de mettre en œuvre la fonctionnalité que vous pouvez basculer entre les tampons dans un onglet (pas encore de suppression). Vous pouvez copier ceci dans votre vimrc:

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

Fermez votre vimrc et ouvrez-le à nouveau. Pour trouver le tampon suivant, utilisez simplement

:call WindowBufManagerNext()

ou définissez votre propre commande ou mappage. Cela fonctionnera tant que vous ne fermez pas ou ne supprimez pas un onglet ou un tampon. Cela ne fonctionnera pas non plus pour plusieurs tampons. Il faudrait un peu plus de travail pour ajouter ces fonctionnalités, mais c'est définitivement faisable.

philolo1
la source
Je n'ai pas non plus trouvé de plugin et j'espérais une fonctionnalité intégrée pour le faire, mais il semble que vous ayez raison, je vais probablement devoir le faire moi-même. Merci pour votre code, je pourrais l'utiliser, il a une base pour développer un plugin complet.
statox
6

Les tampons sont globaux et vous ne pouvez rien y faire à part écrire votre propre couche d'abstraction au-dessus des pages à onglet, des fenêtres et des tampons. La réponse de philolo1 montre une approche raisonnable du problème mais vous trouverez rapidement les limites d'une telle "solution" et devrez dupliquer de nombreuses fonctionnalités intégrées comme :bufdoou le fichier alternatif ...

Les «arguments», d'autre part, peuvent être locaux dans une fenêtre et peuvent donc être plus utiles dans votre flux de travail que les «tampons» (au sens le plus strict du mot):

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

Les arguments ne sont pas aussi flexibles que les tampons, mais ils peuvent fournir une base plus fiable pour votre flux de travail.

Mais travailler sur chaque projet dans sa propre instance Vim est à mon avis la seule solution pratique.

romainl
la source
Je suis d'accord avec l'idée que l'utilisation d'instances vim distinctes est meilleure lorsque je peux l'utiliser dans un terminal, comme je l'ai dit dans un autre commentaire, je dois utiliser des fenêtres sur mon ordinateur professionnel et basculer entre des instances gvim est une douleur dans le cul avec cet OS . Je vais jeter un œil aux arguments que je n'ai jamais utilisés auparavant et cela pourrait être une bonne solution de contournement, merci!
statox
2

Donc, avec un peu de retard, je pense avoir trouvé une réponse satisfaisante (du moins pour moi!). Vous aurez besoin de deux des plugins de Shougo:

et une carte d'accès rapide à utiliser à la place de :ls, pour afficher (et sélectionner) uniquement les tampons de l' onglet actuel .

Par exemple, quelque chose comme:

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

unir - par tampons d'onglets

Vous pouvez maintenant vous déplacer dans la liste de tampons de l'onglet actuel ( j, k), en sélectionner un ( CR), annuler ( q), entrer en mode "entrée" (insérer) pour filtrer rapidement la sélection de tampon en tapant quelques lettres, ou même appuyer sur Tabpour ouvrir la liste d'actions pour l'élément actuellement sélectionné (par exemple pour ouvrir le tampon au - dessus de l'actuel actif) - en bref, vous agissez de la manière générique "Unite".

(voir aussi :h unite_default_key_mappingset Aide Unite en général).


Et maintenant, pour l'astuce finale (mais facultative). Avec altercmd , vous pouvez créer votre propre lscommande , activée par onglet, (basée sur la fonctionnalité Unite ci-dessus):

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

... et chaque fois que vous frappez :ls, Vim exécutera votre commande à la place.

Notez que vous n'aurez pas non plus besoin de :bnou :bp, car la visualisation et la sélection des tampons d'onglet sont désormais la même commande.

VanLaser
la source
J'essaierai aussi cette solution. Pour le moment, j'essaie de ctrl-espace mentionné par VanLaser dans le commentaire, ce qui est plutôt bien. Je vais voir quelle solution est la plus pratique. +1 également pour le plugin altercmd qui est plutôt cool!
statox
2

Je ne peux pas commenter car mon compte est nouveau, désolé, mais ++++ 1 pour ctrl-espace.

J'ai été vendu au moment où je l'ai fait à mi-chemin de l'aide. Ctrlspace a une structure comme celle-ci:

workspaces --> contain tabs --> contain buffers

Ainsi, vous pouvez enregistrer un espace de travail pour chaque projet sur lequel vous travaillez, puis le charger immédiatement quand vous le souhaitez. Cela signifie qu'à chaque fois que vous fermez vim, vous pouvez enregistrer tous vos tampons et séparations d'onglets.

Vous pouvez également nommer vos onglets. Si cela ne suffit pas, vous pouvez également modifier très facilement les répertoires de travail et créer des signets pour les répertoires que vous utilisez fréquemment.

Il s'interface parfaitement avec nerdtree si vous l'utilisez (même si honnêtement, vous n'aurez probablement même pas l'impression d'en avoir besoin après une semaine avec ctrlspace)


Considérez ce cas d'utilisation:

Vous avez un projet. Il s'agit de planter des arbres. Il y a des arbres fruitiers et des arbres d'argent. Les arbres d'argent contiennent des dollars et des cents tandis que les arbres fruitiers contiennent des pommes et des oranges.

Dans cet exemple, les pommes, les oranges, les dollars et les cents sont tous des "tampons".

Ctrlspace vous permet de séparer les pommes et les oranges dans un "onglet" que vous pouvez étiqueter "fruits" - cette étiquette apparaîtra dans la ligne d'étiquette en haut de votre fenêtre. De même, les dollars et les cents vont dans un onglet "argent".

L'espace de travail "Arbres" enregistre toute cette configuration et vous permet d'y accéder immédiatement chaque fois que vous ouvrez vim.


Maintenant que je suis conscient de son existence, je ne peux vraiment pas imaginer faire du développement orienté objet dans vim sans ce plugin. Juste au cas où, voici le lien: https://github.com/szw/vim-ctrlspace

épinard
la source
2

Alors finalement décidé de créer mon propre plugin pour résoudre mon problème, il est disponible sur github .

J'ai utilisé l'idée de @ philolo1 et j'ai essayé de la compléter, au moment où j'écris cette réponse, c'est encore un travail en cours.

EDIT Je ne maintiens plus le plugin au fur et à mesure que mon flux de travail évolue et j'ai réalisé que la liaison des tampons à un onglet ajoute plus de problèmes qu'il n'en résout.


Le plugin lie les tampons aux onglets: lorsque l'utilisateur ouvre un tampon, il est automatiquement "stocké" dans l'onglet et n'est pas accessible à partir d'un autre onglet.

L'installation doit être «conviviale pour le gestionnaire de plugins» (au moins, elle fonctionne bien avec Vim-Plug et Vundle )

Certaines des caractéristiques principales sont:

  • Gérer automatiquement la liaison des tampons (l'utilisateur peut les ouvrir comme il l'a fait auparavant)
  • :NextBufet :PrevBufremplacer :bnet :bNgarder un état cohérent des onglets
  • :ListBufpermet de lister les tampons de manière similaire à l' :lsexception qu'ils sont séparés dans des onglets et un signe permet à l'utilisateur de voir facilement dans quel onglet il se trouve actuellement.
  • :ChangeBuf accepter un numéro de tampon ou un nom de tampon pour changer de tampon et changer d'onglet automatiquement
  • La fermeture d'un tampon se fait avec :CloseBuf
  • La fermeture d'un onglet se fait avec :CloseTab

Pour d' autres opérations que l'utilisateur doit être en mesure d'utiliser les fonctionnalités intégrées (comme :tabopen, :tabnext, etc ...)

Pour chaque commande, certains mappages par défaut sont fournis et peuvent être facilement désactivés en les ajoutant let g:betterTabsVim_map_keys = 0à votre .vimrc.

J'ai également essayé de créer un fichier d'aide explicite ( :h betterTabs.txt): il n'est pas encore terminé mais les utilisateurs devraient trouver le minimum pour utiliser le plugin.

J'ai encore beaucoup de tests à faire pour être sûr que le plugin ne gâche aucun comportement natif.

Enfin, si quelqu'un veut aider, il est toujours possible de créer des problèmes sur la page github ou de créer des demandes d'extraction.

statox
la source
1

Découvrez ce plugin. Il me semble que cela correspond parfaitement à vos besoins. https://github.com/szw/vim-ctrlspace

Alex T.
la source
En effet, VanLaser l'a mentionné dans les commentaires et je ne l'ai pas regardé de près au début, mais il semble vraiment bien, je l'essaie depuis quelques jours maintenant.
statox