Comment puis-je fermer un tampon sans fermer la fenêtre?


120

Les vues multicouches de Vim (Windows, Buffers et Tabs) m'ont laissé un peu confus. Disons que je divise l'affichage (: sp), puis que je sélectionne un tampon différent à afficher dans chaque fenêtre. Maintenant, je veux fermer l'un des tampons, mais je ne veux pas que la fenêtre se ferme (après la fermeture, elle peut afficher le tampon suivant de la liste ou un tampon vide, cela n'a pas d'importance). Comment puis-je faire ceci?

Merci.


Y a-t-il une raison pour laquelle vous souhaitez fermer le tampon plutôt que de ne plus le voir là-bas?
rampion

9
Je me suis également posé des questions à ce sujet. Supprimer un tampon et devoir reconstruire par la suite la partie de mes divisions détruite dans le processus est ennuyeux.
brettkelly

3
29 votes jusqu'à présent. Je pense que c'est un cas d'utilisation assez courant. J'en ai besoin lorsque je travaille avec beaucoup de tampons. Parfois, j'utilise 2 fenêtres et je veux fermer un tampon. Je ne veux pas que cette fenêtre disparaisse. Je veux juste que le prochain tampon soit affiché ici.
Wilson Freitas


Réponses:



145

J'ai un peu dérangé ça et j'ai finalement trouvé:

:bp | sp | bn | bd

Voici la version copier / coller pour le mappage des touches:

:bp<bar>sp<bar>bn<bar>bd<CR>

Je l'ai testé un peu et cela fonctionne de manière cohérente dans diverses conditions. Lorsqu'il est utilisé sur le dernier tampon, il vous laissera un nouveau tampon vide.

Jetez ceci dans votre .vimrc:

map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>

Redémarrez Vim ou simplement :source ~/.vimrcpour que les modifications prennent effet. La prochaine fois que vous souhaitez fermer un tampon, tapez simplement: \q(si \est votre clé principale)


1
Je vous remercie! Nice et simple, contrairement à presque toutes les autres solutions que j'ai vues.
jwd

16
Pour le débutant, jetez dans votre .vimrc : map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>. Redémarrez VIM, la prochaine fois que vous souhaitez fermer un tampon, tapez simplement:\q
EasyCo

5
Cela aura un résultat inattendu si vous aviez une fenêtre fractionnée verticalement. En fait, toute configuration de fractionnement de fenêtre autre que la norme (créée par sp).
hitzg le

2
Je pense que l'extrait de ce qu'il faut mettre dans .vimrc ne devrait pas inclure le point à la fin. A part ça, génial! Cela devrait être la réponse acceptée.
Ernesto

3
c'est élégant. comme d'autres l'ont dit, si vous utilisez principalement des divisions verticales, changez spavec vsp. mon entrée .vimrc ressemble à ceci:cnoremap bd bp<bar>vsp<bar>bn<bar>bd
Connor

38

J'ai cherché ça aujourd'hui et j'ai trouvé

:b#|bd#

qui change la fenêtre actuelle en tampon précédemment ouvert et supprime / masque le tampon que vous venez de quitter.

Cela nécessite au moins deux tampons connus.

Si une autre fenêtre mais la fenêtre actuelle affiche le même tampon, cela détruira toujours le fractionnement. Vous pouvez changer toutes les fenêtres dans le tampon précédemment ouvert avec

:windo b#

J'ai ajouté plus de détails sur l'ancienne commande en discutant d'un mappage pour elle (et de certains pièges) dans une réponse à une question similaire .


Cela peut également être fait ... :#b|#bdIl suffit d'échanger la commande de tampon et le numéro de tampon ci-dessus.
Ashish

Je l'ai utilisé un peu mais je suis toujours ennuyé qu'il rouvre un tampon précédemment fermé.
pean

@pean C'est ce que j'ai mentionné dans la réponse liée - voir "Notes importantes". Ouais, ce serait mieux si cela passait à un autre tampon ouvert.
valable

1
Vous pouvez également faire :bn|bd#ou :bp|bd#passer au tampon ouvert précédent ou suivant, respectivement, plutôt qu'au tampon auquel vous avez accédé le plus récemment (b #).
pavon

12
nmap <leader>d :bprevious<CR>:bdelete #<CR>

Fonctionne comme il se doit jusqu'à ce qu'un tampon soit ouvert dans plusieurs fenêtres. Assez bien à moins que vous ne souhaitiez utiliser les plus gros scripts disponibles.

Edit: c'est ce que j'utilise en ce moment:

function! BufferDelete()
    if &modified
        echohl ErrorMsg
        echomsg "No write since last change. Not closing buffer."
        echohl NONE
    else
        let s:total_nr_buffers = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))

        if s:total_nr_buffers == 1
            bdelete
            echo "Buffer deleted. Created new buffer."
        else
            bprevious
            bdelete #
            echo "Buffer deleted."
        endif
    endif
endfunction

1
J'ai essayé de cette façon mais cela ne fonctionnait pas très bien en utilisant plusieurs fenêtres fractionnées. Voici ma solution si quelqu'un a le même problème:nmap <leader>d :ene<CR>:bd #<CR>
caio

7

Je pense que c'est ce que tu cherches

http://www.vim.org/htmldoc/windows.html#window-moving

Essaye ça:

Regardez votre identifiant de tampon en utilisant

:buffers

vous y verrez une liste de tampons comme

1  a.cpp
2  b.py
3  c.php

si vous souhaitez supprimer b.py du tampon

:2bw

si vous voulez tout supprimer / fermer des tampons

:1,3bw

1
Je ne veux pas déplacer la fenêtre. Je veux fermer le tampon sans toucher la position, la taille ou l'existence de la fenêtre.
Mosh

5

Pour ceux qui utilisent NERDTree.

Je corrige cela en utilisant ce plugin https://github.com/jistr/vim-nerdtree-tabs et maintenant je peux fermer le seul buff / file / tab sans fermer la fenêtre.

Après avoir installé le plugin ci-dessus, mettez le code suivant sur mon .vimrc:

let g:nerdtree_tabs_autoclose=0

La description de la variable ci-dessus est: Fermer l'onglet actuel s'il n'y a qu'une seule fenêtre et que c'est NERDTree (par défaut 1)

Plus d'informations ici: https://github.com/jistr/vim-nerdtree-tabs#configuration


2

Je ne pense pas qu'il existe un moyen unique de le faire, mais vous pouvez le faire :enewou :lsrépertorier vos tampons et les échanger vers un autre en utilisant :b [number].

Une fois que vous avez un tampon différent dans la fenêtre :bd #, vous supprimerez le tampon précédent dans la fenêtre, et comme le tampon actuel existe toujours, la fenêtre ne sera pas fermée.


2

J'avais l'habitude d'utiliser :

:bp<bar>sp<bar>bn<bar>bd<CR>

Mais j'ai trouvé certaines occasions où il fermait ma fenêtre.

Récemment, j'ai remarqué que je l'utilise toujours lorsque je travaille sur un projet et que je dois ouvrir rapidement mon .tmux.conf .zshrcavant de retourner au travail.

Pour cet usage, je trouve préférable de:

  • revenir au tampon sur lequel je travaillais auparavant C-6
  • tapez :bd#supprimer le tampon précédent (je cartographié comme ceci: nnoremap <leader>d :bd#<CR>)

Cela me permet de contrôler le tampon vers lequel je retourne et me semble plus naturel.


1

Aurait

:enew

Faites ce que vous voulez? il éditera un nouveau tampon sans nom dans la fenêtre actuelle en laissant le fichier existant ouvert dans toutes les autres fenêtres.


Cela ouvrira un nouveau tampon vide. Je veux fermer le tampon actuel sans fermer la fenêtre.
Mosh

1

Ma solution préférée pour cela est le plugin bufkill.vim ( GitHub ). Il fournit des versions alternatives des différentes :bcommandes -prefix qui fonctionnent de la même manière que leurs homologues, mais laissent la fenêtre ouverte. Ils affichent quel que soit le dernier tampon visible contenu, ou un tampon vide / nouveau s'il n'y avait pas de tampon antérieur.

De la documentation:

Lorsque vous souhaitez décharger / supprimer / effacer un tampon, utilisez:
  : bun /: bd /: bw pour fermer également la fenêtre (commande vim), ou
  : BUN /: BD /: BW pour laisser la (les) fenêtre (s) intacte (s) (ce script).

1

Pour «fermer» une vue, utilisez :hid[e]. Fonctionne si vous avez réussi à diviser la fenêtre ou à ouvrir plusieurs fichiers. Vous ne pouvez pas masquer le dernier tampon affiché.

1 Astuce supplémentaire qui m'a aidé: utilisez :e ./path/to/file.workpour ouvrir un fichier dans la fenêtre sans diviser la fenêtre.

PS A deux jours de vim, j'ai encore du mal à trouver les commandes d'aide précises. J'espère que cela aidera quelqu'un d'autre à continuer à travailler jusqu'à ce qu'il ait vraiment le temps de comprendre vim.


1

Voici une fonction vimscript très lisible, qui gère bien tous les cas ,

  • se comportent de manière similaire à celle intégrée :bd(si une seule fenêtre, il suffit de l'invoquer!),
    • émettre un avertissement et ne rien faire si le tampon est modifié.
    • s'il n'y a pas d'autre tampon, créez-en un, via :enew.
    • si un autre tampon existe et dans buffer-list, basculez vers celui-ci, sinon passez ensuite, via :bn.
  • comportement plus raisonnable pour la mise en page à plusieurs fenêtres
    • ne fermer aucune fenêtre,
    • restez toujours sur la fenêtre d'origine.
    • pour chaque fenêtre qui affiche le tampon actuel, procédez comme indiqué ci-dessus, puis supprimez l'ancien tampon actuel.
nnoremap <Leader> b: appelez DeleteCurBufferNotCloseWindow () <CR>

func! DeleteCurBufferNotCloseWindow () abandonner
    si & modifié
        echohl ErrorMsg
        echom "E89: pas d'écriture depuis la dernière modification"
        echohl Aucun
    elseif winnr ('$') == 1
        bd
    else "fenêtre multiple
        laissez oldbuf = bufnr ('%')
        laissez oldwin = winnr ()
        pendant 1 ", toutes les fenêtres affichant oldbuf resteront ouvertes
            si buflisted (bufnr ('#'))
                b #
            autre
                bn
                laissez curbuf = bufnr ('%')
                si curbuf == oldbuf
                    enew "oldbuf est le seul tampon, créez-en un
                fin si
            fin si
            laissez gagner = bufwinnr (oldbuf)
            si gagner == -1
                Pause
            else "il y a une autre fenêtre qui affiche oldbuf
                Exec win 'wincmd w'
            fin si
        à la fin
        "supprimer oldbuf et restaurer la fenêtre sur oldwin
        exec oldbuf 'bd'
        exec oldwin 'wincmd w'
    fin si
endfunc

0

Si vous êtes comme moi et que vous êtes venu ici en essayant de faire le contraire , fermez la fenêtre sans fermer le tampon, vous pouvez le faire via:

:close


0

Une version simple que j'utilise personnellement est

:bp|bd#

Il va au tampon précédent et supprime l'autre tampon (qui est en fait l'original d'où nous avons sauté). Cela fait ce que vous attendez dans 99% des cas sans scripts compliqués.

En tant que raccourci clavier, j'utilise ce qui suit

nnoremap <silent> <Leader>c :bp<BAR>bd#<CR>

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.