Comment fermer un seul tampon (parmi plusieurs) dans Vim?

446

J'ouvre plusieurs fichiers dans Vim en exécutant, par exemple,

vim a/*.php

qui ouvre 23 fichiers.

Je fais ensuite mon montage et exécute les opérations suivantes deux fois

:q

qui ferme tous mes tampons.

Comment pouvez-vous fermer un seul tampon dans Vim?

Léo Léopold Hertz 준영
la source
9
Notez que vous pouvez ouvrir les fichiers dans des fenêtres Vim distinctes en utilisant vim -o a/*.php(ou -Opour utiliser des fenêtres verticales) et éviter la navigation dans le tampon - c'est une excellente méthode pour seulement quelques fichiers, mais avec 23 fichiers, ils n'auront que quelques lignes / colonnes chaque.
Cascabel
1
@Jefromi: Merci de l'avoir signalé! Je n'ai jamais utilisé l'option -o auparavant.
Léo Léopold Hertz 준영
Au sujet des fentes de fenêtres. Si vous êtes déjà dans Vim et que vous souhaitez ouvrir un autre fichier dans une division: esp pour horizontal: evsp pour vertical.
Lanzafame

Réponses:

559

Un mot d'avertissement: "le w in bw ne signifie pas écrire mais effacer!"

Plus de manuels:

: bd

Déchargez le tampon [N] (par défaut: tampon actuel) et supprimez-le de la liste des tampons. Si le tampon a été modifié, cela échoue, sauf si [!] Est spécifié, auquel cas les modifications sont perdues. Le fichier n'est pas affecté.

Si vous savez ce que vous faites, vous pouvez également utiliser: bw

: bw

Comme |: bdelete |, mais supprimez vraiment le tampon.

hhh
la source
4
Aussi la possibilité de faire ': M, Nbd' pour fermer les numéros de tampon M à N. Ou ': bd N1 N2 ...' où N # est un numéro de tampon
enneigé
61
Le manuel dit de n'utiliser que :bwsi "vous savez ce que vous faites", ce que je ne sais pas, donc je suppose que je vais utiliser :bd.
jberryman
1
J'étais confus au début - j'ouvrais un nouvel onglet pour fermer les tampons ... mais fermer le tampon dans l'onglet (en utilisant une ligne droite :bd) ferme également l'onglet. Ce que vous voulez sans doute est :bd n .. [m]ou :n,mbdpour les numéros spécifiques ou plage de numéros à proximité, que vous pouvez faire sans regarder les tampons
JonnyRaa
6
west l'abréviation de writecommande selon le manuel Vim, il n'y a en outre aucune mention de "wipeout". La description de la commande ( help write) commence par "Ecrire tout le tampon dans le fichier actuel".
amn
3
@amn Je me suis aussi trompé, mais il voulait dire que wdans la bwcommande signifie effacer, il ne parle pas de la wcommande. Il a mis cet avertissement là pour que les gens ne pensent pas que la bwcommande signifiait écriture tampon (ce qui ne signifie pas effacement du tampon.)
John
351

Si cela n'est pas rendu évident par les réponses précédentes:

: bd fermera le tampon courant. Si vous ne voulez pas récupérer la liste des tampons.

RedBlueThing
la source
4
Avant de trouver: bd, cela n'avait aucun sens pour moi que les gens n'aient eu aucun problème à faire un: ls -> rechercher le numéro de document -> décharger le tampon par numéro. Les gens trouvent-ils cela efficace?
Svend
3
@svend pour une gamme de tampons certes, mais pour un seul a: bd est probablement plus efficace.
Pharaun
10
:bdferme uniquement le tampon alors que (quoi que cela signifie) alors que :bwva également effacer toutes les variables et l'élimine VRAIMENT du lstampon.
RedX
1
La réponse de hhh ci-dessous est plus verbeuse…
103

Vérifiez votre identifiant de tampon à l'aide de: tampons

vous verrez une liste de tampons comme

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

si vous voulez supprimer b.php du tampon

:2bw

si vous souhaitez supprimer / fermer tous les tampons

:1,3bw
rossignol2k1
la source
4
Vous pouvez également effacer tous les tampons avec:% bw
cdleonard
7
raccourci pour vérifier l'identifiant de la mémoire tampon: 2 CTRL-G
enneigé
43

Plutôt que de parcourir la sortie de la commande: ls et de supprimer (décharger, effacer ..) un tampon en spécifiant son numéro, je trouve que l'utilisation des noms de fichiers est souvent plus efficace.

Par exemple, après avoir ouvert quelques fichiers .txt pour rafraîchir mes souvenirs d'un point précis .. copiez et collez quelques lignes de texte à utiliser comme modèle de tri .. etc. Je taperais ce qui suit:

:bd txt <Tab>

Notez que la chaîne correspondante ne doit pas nécessairement se trouver au début du nom de fichier.

Ce qui précède affiche la liste des noms de fichiers qui correspondent à 'txt' en bas de l'écran et conserve la commande: bd que j'ai tapée initialement intacte, prête à être complétée.

Voici un exemple:

doc1.txt doc2.txt
:bd txt 

Je pourrais revenir en arrière sur le bit 'txt' et taper le nom du fichier que je souhaite supprimer, mais là où cela devient vraiment pratique, c'est que je n'ai pas à le faire: si j'appuie sur la touche Tab une deuxième fois, Vim termine automatiquement ma commande avec le premier match:

:bd doc1.txt

Si je veux me débarrasser de ce tampon particulier, je dois juste appuyer sur Entrée.

Et si le tampon que je veux supprimer se trouve être la deuxième (troisième .. etc.) correspondance, je n'ai qu'à appuyer sur la touche Tab pour que ma commande: bd fasse défiler la liste des correspondances.

Naturellement, cette méthode peut également être utilisée pour basculer vers un tampon donné via des commandes telles que: b ..: sb .. etc.

Cette approche est particulièrement utile lorsque l'option Vim `` cachée '' est définie, car la liste des tampons peut rapidement devenir assez grande, couvrant plusieurs écrans et rendant difficile de repérer le tampon particulier que je recherche.

Pour tirer le meilleur parti de cette fonctionnalité, il est probablement préférable de lire le fichier d'aide Vim suivant et de modifier le comportement de la complétion de la ligne de commande Tab en conséquence afin qu'il convienne le mieux à votre flux de travail:

:help wildmode

Le comportement que j'ai décrit ci-dessus résulte du paramètre suivant, que j'ai choisi par souci de cohérence afin d'émuler l'achèvement de bash:

:set wildmode=list:longest,full

Contrairement à l'utilisation de numéros de tampon, le mérite de cette approche est que je me souviens généralement d'au moins une partie d'un nom de fichier donné me permettant de cibler directement le tampon plutôt que d'avoir à rechercher d'abord son numéro via la commande: ls.

guv '
la source
40

Utilisation:

  • :ls - pour lister les tampons
  • :bd#n- pour fermer le tampon où #n est le numéro du tampon (utilisez lspour l'obtenir)

Exemples:

  • pour supprimer le tampon 2:

    :bd2
    
Shaun
la source
16

Vous pouvez également mapper les touches de fonction suivantes et précédentes, ce qui permet de parcourir les tampons en un clin d'œil

map <F2> :bprevious<CR>
map <F3> :bnext<CR>

de mon vimrc

Ravi
la source
2

Que diriez-vous

vim -O a a

De cette façon, vous pouvez éditer un seul fichier sur votre gauche et parcourir tout le répertoire sur votre droite ... Juste une pensée, pas la solution ...

Santi
la source
2

[EDIT: c'était une suggestion stupide d'une époque où je ne connaissais pas assez bien Vim. Veuillez ne pas utiliser d'onglets au lieu de tampons; les onglets sont les "dispositions de fenêtre" de Vim]

Peut-être passer à l'aide d'onglets?

vim -p a/*.php ouvre les mêmes fichiers dans les onglets

gtet gTbasculer les onglets d'avant en arrière

:q ferme uniquement l'onglet actuel

:qa ferme tout et sort

:tabo ferme tout sauf l'onglet actuel

Leonid Shevtsov
la source
2
Pourquoi dites-vous que l'utilisation d'onglets est une suggestion stupide? Je demande seulement parce que j'utilise des onglets tout le temps ...: ^ /
Nate
2
@Nate: J'ai décidé de développer ce leonid.shevtsov.me/en/…
Leonid Shevtsov
1
C'était un excellent article - cela m'a inspiré à creuser encore plus - l'avez-vous regardé wildmenu? Il est similaire à lustyjuggler (bien que plus simple) mais il est intégré (ce qui était bon pour moi, car lustyjuggler a besoin +ruby, et le vim par défaut pour les navires ubuntu oneiric -ruby).
Nate
@Nate: oui, j'utilise wildmenu pour ouvrir des fichiers, mais lorsque vous avez plusieurs fichiers dans le projet, il n'est tout simplement pas mis à l'échelle. En outre, le vim-noxpackage d'Ubuntu prend en charge Ruby.
Leonid Shevtsov
1

Ceux qui utilisent un plugin ou un plugin de navigation arborescente, comme Buffergator ou NERDTree, devront basculer ces divisions avant de détruire le tampon actuel - sinon vous enverrez vos divisions dans wonkyville

J'utilise:

"" Buffer Navigation                                                                                                                                                                                        
" Toggle left sidebar: NERDTree and BufferGator                                                                                                                                                             
fu! UiToggle()                                                                                                                                                                                              
  let b = bufnr("%")                                                                                                                                                                                        
  execute "NERDTreeToggle | BuffergatorToggle"                                                                                                                                                              
  execute ( bufwinnr(b) . "wincmd w" )                                                                                                                                                                      
  execute ":set number!"                                                                                                                                                                                    
endf                                                                                                                                                                                                        
map  <silent> <Leader>w  <esc>:call UiToggle()<cr>   

Où " NERDTreeToggle" dans cette liste équivaut à taper :NERDTreeToggle. Vous pouvez modifier cette fonction pour l'intégrer à votre propre configuration.

New Alexandria
la source
pour cela, le plugin bbye est parfait qui préserve la disposition de votre fenêtre lors de l'utilisation de :bdeleteou :bwipeout. Voir ma réponse .
Wolfson
0

Fermer le tampon sans fermer la fenêtre

Si vous souhaitez fermer un tampon sans détruire la disposition de votre fenêtre (disposition actuelle basée sur des divisions), vous pouvez utiliser un plugin comme bbye . Sur cette base, vous pouvez simplement utiliser

:Bdelete (instead of :bdelete)
:Bwipeout (instead of :bwipeout)

Ou créez simplement une cartographie dans votre .vimrcpour un accès plus facile comme

:nnoremap <Leader>q :Bdelete<CR>

Avantage sur vim's: bdelete et: bwipeout

De la documentation du plugin :

  • Fermez et supprimez le tampon.
  • Afficher un autre fichier dans cette fenêtre.
  • Afficher un fichier vide si aucun autre fichier n'est ouvert.
  • Ne laissez pas de tampons [aucun fichier] inutiles si vous décidez de modifier un autre fichier dans cette fenêtre.
  • Fonctionne même si un fichier est ouvert dans plusieurs fenêtres.
  • Travaillez correctement avec divers explorateurs de tampons et barres de tabulations.

: bdelete vs: bwipeout

De la documentation du plugin :

Vim a deux commandes pour fermer un tampon: :bdeleteet :bwipeout. Le premier supprime le fichier de la liste des tampons, efface ses options, ses variables et ses mappages. Cependant, il reste dans la liste déroulante, Ctrl-ovous ramène donc et rouvre le fichier. Si ce n'est pas ce que vous voulez, utilisez :bwipeoutl'équivalent de Bbye :Bwipeoutlà où vous l'auriez utilisé :bdelete.

Wolfson
la source