Vim: fermer tous les tampons sauf celui-ci


197

Comment puis-je fermer tous les tampons dans Vim sauf celui que je suis en train de modifier?


1
Je trouve ce lien
klokop

Réponses:



171

Essaye ça

bufdo bd

bufdo exécute la commande pour tous les tampons

http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers


Cela ne ferme pas le tampon NERDTree.
Uri

NERDTree est fermé si le focus est dans le panneau d'arbre nerd
gayavat

2
Vous voudrez peut-être fermer NERDTree avant de le faire pour empêcher la bdcommande de fermer le vim lui-même; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
lvarayut

11
La documentation avertit que l'argument :bufdo«ne doit pas supprimer les tampons ni ajouter de tampons à la liste des tampons». Donc, si cette solution fonctionne, elle fonctionne par accident… et souvent elle ne fonctionne pas pour moi (passe à un tampon différent).
glts

10
Cela ferme tous les tampons pour moi, ce qui n'est pas ce que les questions demandent. (MacVim version 8.0.1207)
Michael Leonard

143

J'ai pu le faire assez facilement comme ceci:

:%bd|e#

4
Ceci est une bonne réponse. Cela fait que BufOnly se sent un peu exagéré (je veux dire, un plugin entier?) À moins que vous n'utilisiez la fonction de passage d'arguments de BufOnly. Tout ce que je veux vraiment faire c'est:%bd|e#
shmup

41
@jorgeh %bd= supprimer tous les tampons. e#= ouvrir le dernier tampon pour l'édition. Le tuyau entre les deux exécute simplement une commande après l'autre.
OldTimeGuitarGuy

20
@Jared Vous pouvez utiliser %bd|e#|bd#pour supprimer le [No Name]tampon qui est créé.
kshenoy

12
Merveilleux. Alors là, vous avez la seule chose pour laquelle j'ai jamais utilisé le plugin BufOnly, distillé à une seule commande:command! BufOnly silent! execute "%bd|e#|bd#"
shmup

4
@Finn, vous devez vous échapper |:map <leader>o :%bd\|e#<cr>
Halil Özgür

57

Si vous ne vous souciez pas de l'actuel, il est plus simple de faire quelque chose comme (pas besoin de script):

1,100bd

4
Cela fermera également le tampon nerdtree.
Afshin Mehrabani

J'ai rencontré des problèmes lors de l'utilisation de cette commande lorsque NERDTree est activé. Je recommande d'utiliser le plugin BufOnly.vim comme mentionné par @VoY.
moeabdol

1
J'ai fait le mappage suivant qui tient compte de la suppression du tampon NERDTree:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri

5
Je l'utilise depuis longtemps, mais maintenant je l'obtiens E16: Invalid rangeparce que certains des tampons de la plage n'existent pas réellement. Il ignorait cela jusqu'à récemment.
Jon

3
@Jon Vérifiez :lspour voir le plus grand tampon que vous avez réellement ouvert, et définissez votre plage sur cela (c'est-à-dire si votre tampon le plus élevé est 22, alors :1,22bd). J'ai eu la même erreur jusqu'à ce que je fasse cela.
Nairou

51

je fais ça

:w | %bd | e#

Mon préféré si je veux juste que mon tampon actuel ouvre et ferme tous les autres.

Fonctionnement: commencez par écrire les modifications du tampon en cours, puis fermez tous les tampons ouverts, puis rouvrez le tampon sur lequel j'étais actuellement. Dans Vim, |enchaîne l'exécution des commandes ensemble. Si votre tampon est à jour, ce qui précède peut être réduit à:%bd | e#


Cela fonctionne généralement bien. mais parfois %ne peut pas fonctionner comme tous les sélecteurs. Pourriez-vous deviner quelque chose?
Jinyoung Kim

@JinyoungKim (from [1]) Dans la commande ":% bd", la plage '%' sera remplacée par les numéros de ligne de début et de fin dans le tampon actuel. Au lieu d'utiliser '%' comme plage, vous devez spécifier des nombres pour la plage. Par exemple, pour supprimer tous les tampons, vous pouvez utiliser la commande ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam

Je viens de vérifier le document. Alors, la plage '%' repose sur un certain nombre de lignes de fichiers actuelles?
Jinyoung Kim

2
J'ai trouvé une fonction intégrée bufnr("$")qui renvoie le dernier numéro de tampon. mais je n'ai aucune idée d'interpoler à la chaîne lorsque j'utilise comme ça :1,bufnr("$")bd. Peut-être .. la meilleure solution serait :1,9999bd.
Jinyoung Kim

2
:help :bdmontre :%bdelete " delete all buffers. C'est %exactement ce que vous voulez. J'utilise une variante de votre solution: :%bd<CR><C-O>:bd#<CR>cela supprimera tous les tampons, puis utilisera <C-O>pour récupérer la position dans le fichier actuel, puis :bd#pour supprimer le tampon non nommé. Cela ferme tous les tampons et vous laisse au même emplacement dans le fichier.
Alejandro

25

S'appuyant sur la réponse de juananruiz.

Faites un petit changement dans le tampon que vous souhaitez conserver, puis

:1,1000bd

La commande bd(suppression du tampon) ne supprimera aucun tampon avec des modifications non enregistrées. De cette façon, vous pouvez conserver le fichier actuel (modifié) dans la liste des tampons.

Modifier: veuillez noter que cela supprimera également votre NERDTreeBuffer. Vous pouvez le récupérer avec: NERDTree


Parfait, court et simple! :)
arkod

49
:% bd est en fait "tous" au lieu de 1-1000.
John Tyree

Cela dépend-il set nohiddend'être réglé?
Felipe Alvarez

15

En utilisant

:on[ly][!]

et

:h only

27
Cela ferme les fenêtres, pas les tampons.
ZyX

13
Toujours utile, car les gens peuvent bien googler pour le mauvais terme, et le trouveront. Merci à vous deux. :)
archgoon

1
@archgoon oui, mais devrait être spécifié dans la réponse.
andho

10

Fermeture de tous les tampons ouverts:

silent! execute "1,".bufnr("$")."bd"

Fermeture de tous les tampons ouverts à l' exception du tampon actuel :

function! CloseAllBuffersButCurrent()
  let curr = bufnr("%")
  let last = bufnr("$")

  if curr > 1    | silent! execute "1,".(curr-1)."bd"     | endif
  if curr < last | silent! execute (curr+1).",".last."bd" | endif
endfunction

Ajoutez cette fonction à .vimrcet appelez-la avec :call CloseAllBuffersButCurrent().

Carte pratique:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>

J'ai remarqué que lors de la reprise des sessions vim, qui restaure les tampons, je ne pouvais plus supprimer les tampons en utilisant ce qui précède. Au lieu de cela, j'ai dû utiliser:%bd|e#|bd#
shmup

Meilleure solution. J'ai ajouté une commande pour rouvrir NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa

5

Je mets cela dans mon fichier .vimrc

nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>

puis votre leader + ca(tout fermer) ferme tous les tampons sauf le courant.

Ce qu'il fait c'est

: w - sauvegarde le tampon actuel

% bd - ferme tous les tampons

e # - ouvre le dernier fichier modifié

bd # - ferme le tampon sans nom



1

Voici ce que je fais. Donc, j'aime garder la position de mon curseur après avoir supprimé tous les tampons et la plupart des solutions ci-dessus ignorent simplement ce fait. Je pense également que le remappage de la commande est préférable à la frappe, alors ici, j'utilise <leader>bdpour supprimer tous les tampons et revenir à la position d'origine du curseur.

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"

%bd = supprimer tous les tampons.

e# = ouvrir le dernier tampon pour l'édition (quel est le tampon sur lequel je travaille).

bd#pour supprimer le tampon [No Name] qui est créé lorsque vous utilisez %bd.

Le tuyau entre les deux ne fait qu'une commande après l'autre. Vous devez y échapper en utilisant\|

'" = garder la position de mon curseur.


0

J'aime 1,100bd( suggéré par juananruiz ) qui semble fonctionner pour moi.

J'ai ajouté un quit!à ma cartographie pour me donner

nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>

Cela tue tous les tampons et arrête Vim, ce que je cherchais principalement.


1
Il n'y a vraiment aucune raison pour que vous ayez le bdqmappage qui ferme tous les tampons et quitte vim avec :q!, alors que vous pouvez simplement l'utiliser :qa!. Sauf si je
néglige

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.