Come posso chiudere un singolo buffer (su molti) in Vim?


445

Apro diversi file in Vim, ad esempio, eseguendo

vim a/*.php

che apre 23 file.

Quindi apporto la mia modifica ed eseguo due volte quanto segue

:q

che chiude tutti i miei buffer.

Come puoi chiudere un solo buffer in Vim?


9
Nota che puoi aprire i file in finestre Vim separate usando vim -o a/*.php(o -Ousare finestre verticali) ed evitare la navigazione del buffer - questo è un ottimo metodo per solo pochi file, ma con 23 file avranno solo poche righe / colonne ogni.
Cascabel,

1
@Jefromi: Grazie per averlo sottolineato! Non ho mai usato l'opzione -o prima.
Léo Léopold Hertz

Sul tema delle spaccature delle finestre. Se sei già in Vim e vuoi aprire un altro file in una divisione: esp per orizzontale: evsp per verticale.
Lanzafame,

Risposte:


558

Un avvertimento: "il w in bw non è sinonimo di scrittura ma di cancellazione!"

Altro dai manuali:

: bd

Scaricare il buffer [N] (impostazione predefinita: buffer corrente) ed eliminarlo dall'elenco dei buffer. Se il buffer è stato modificato, ciò ha esito negativo, a meno che non venga specificato [!], Nel qual caso le modifiche vanno perse. Il file rimane inalterato.

Se sai cosa stai facendo, puoi anche usare: bw

: bw

Come |: bdelete |, ma cancella davvero il buffer.


4
Anche la possibilità di fare ': M, Nbd' per chiudere i numeri di buffer da M a N. Oppure ': bd N1 N2 ...' dove N # è un numero di buffer
snowbound

61
Il manuale dice di usare solo :bwse "sai cosa stai facendo", cosa che non faccio, quindi immagino che userò :bd.
jberryman,

1
All'inizio ero confuso da questo - stavo aprendo una nuova scheda per chiudere i buffer ... ma chiudendo il buffer nella scheda (usando una scala :bd) si chiude anche la scheda. Quello che probabilmente vuoi è :bd n .. [m]o :n,mbdper numeri specifici o un intervallo di numeri da chiudere, cosa che puoi fare senza guardare ai buffer
JonnyRaa

6
wè l'abbreviazione di writecomando secondo il manuale di Vim, inoltre non si fa menzione di alcun "wipeout". La descrizione del comando ( help write) inizia con "Scrivi l'intero buffer nel file corrente".
AMN

3
@amn Anche io mi sono confuso, ma intendeva che wnel bwcomando significa cancellare non sta parlando del wcomando. Ha messo questo avviso lì in modo che la gente non pensasse che il bwcomando significasse buffer write (che non significa buffer wipeout).
John

351

Se ciò non è reso evidente dalle risposte precedenti:

: bd chiuderà il buffer corrente. Se non vuoi afferrare l'elenco dei buffer.


4
Prima di trovare: bd non aveva mai senso per me che le persone non avessero problemi a fare un: ls -> scansiona il numero di documento -> scarica il buffer per numero. Le persone lo trovano davvero efficace?
Svend

3
@svend per una serie di buffer sicuramente, ma per uno solo a: bd è probabilmente più efficace.
Faraone,


10
:bdchiude solo il buffer considerando che (qualunque cosa ciò significhi) considerando :bwche cancella anche tutte le variabili e REALMENTE lo elimina dal lsbuffer.
RedX,

1
la risposta di seguito è più dettagliata ...

103

Controlla il tuo ID buffer usando: buffer

vedrai un elenco di buffer lì come

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

se vuoi rimuovere b.php dal buffer

:2bw

se si desidera rimuovere / chiudere tutto dai buffer

:1,3bw

4
Puoi anche cancellare tutti i buffer con:% bw
cdleonard,

7
scorciatoia per verificare l'id buffer: 2 CTRL-G
snowbound

43

Invece di sfogliare l'output del comando: ls ed eliminare (unload, wipe ..) un buffer specificandone il numero, trovo che l'uso dei nomi dei file sia spesso più efficace.

Ad esempio, dopo aver aperto un paio di file .txt per aggiornare i miei ricordi di qualche punto preciso ... copia e incolla alcune righe di testo da utilizzare come modello di sorta ... ecc. Digiterei quanto segue:

:bd txt <Tab>

Notare che la stringa corrispondente non deve essere all'inizio del nome del file.

Quanto sopra mostra l'elenco dei nomi dei file che corrispondono a 'txt' nella parte inferiore dello schermo e mantiene il comando: bd inizialmente digitato intatto, pronto per essere completato.

Ecco un esempio:

doc1.txt doc2.txt
:bd txt 

Potrei eseguire il backspace sul bit 'txt' e digitare il nome del file che desidero eliminare, ma dove questo diventa davvero conveniente è che non devo: se premo il tasto Tab una seconda volta, Vim completa automaticamente il mio comando con la prima partita:

:bd doc1.txt

Se voglio liberarmi di questo particolare buffer, devo solo premere Invio.

E se il buffer che voglio eliminare sembra essere la seconda (terza ... ecc.) Corrispondenza, devo solo continuare a premere il tasto Tab per far scorrere il mio comando: bd nell'elenco delle corrispondenze.

Naturalmente, questo metodo può essere utilizzato anche per passare a un determinato buffer tramite comandi come: b ..: sb .. ecc.

Questo approccio è particolarmente utile quando è impostata l'opzione 'nascosta' Vim, perché l'elenco dei buffer può rapidamente diventare abbastanza grande, coprendo diverse schermate e rendendo difficile individuare il buffer particolare che sto cercando.

Per sfruttare al meglio questa funzionalità, è probabilmente consigliabile leggere il seguente file della guida di Vim e modificare di conseguenza il comportamento del completamento della riga di comando di Tab in modo che si adatti al meglio al flusso di lavoro:

:help wildmode

Il comportamento che ho descritto sopra deriva dalla seguente impostazione, che ho scelto per motivi di coerenza al fine di emulare il completamento bash:

:set wildmode=list:longest,full

A differenza dell'utilizzo dei numeri di buffer, il merito di questo approccio è che di solito ricordo almeno parte di un determinato nome di file che mi ha permesso di indirizzare direttamente il buffer anziché dover prima cercare il suo numero tramite il comando: ls.


40

Uso:

  • :ls - per elencare i buffer
  • :bd#n- per chiudere il buffer dove #n è il numero del buffer (usare lsper ottenerlo)

Esempi:

  • per eliminare il buffer 2:

    :bd2
    

16

Puoi anche mappare i tasti funzione successivi e precedenti, rendendo il ciclo attraverso i buffer un gioco da ragazzi

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

dal mio vimrc


2

Che ne dite di

vim -O a a

In questo modo puoi modificare un singolo file alla tua sinistra e navigare nell'intera directory alla tua destra ... Solo un pensiero, non la soluzione ...


2

[EDIT: questo è stato un suggerimento stupido da quando non conoscevo abbastanza bene Vim. Si prega di non utilizzare le schede anziché i buffer; le schede sono i "layout di finestra" di Vim]

Forse passare all'utilizzo delle schede?

vim -p a/*.php apre gli stessi file nelle schede

gte gTcambia scheda avanti e indietro

:q chiude solo la scheda corrente

:qa chiude tutto ed esce

:tabo chiude tutto tranne la scheda corrente


2
Perché dici che usare le schede è un suggerimento stupido? Lo chiedo solo perché utilizzo sempre le schede ...: ^ /
Nate

2
@Nate: ho deciso di approfondire quel leonid.shevtsov.me/it/…
Leonid Shevtsov,

1
È stato un ottimo post - mi ha ispirato a scavare ancora più a fondo - hai mai visto wildmenu? È simile a Lustyjuggler (anche se più semplice) ma è integrato (il che è stato un bene per me, perché Lustyjuggler ha bisogno +ruby, e il vim predefinito per le navi oniriche di Ubuntu -ruby).
Nate,

@Nate: sì, sto usando wildmenu per aprire i file, ma quando hai molti file nel progetto, non si adatta. Inoltre, il vim-noxpacchetto di Ubuntu ha il supporto di Ruby.
Leonid Shevtsov,

1

Coloro che utilizzano un plug-in di buffer o di navigazione ad albero, come Buffergator o NERDTree, dovranno attivare o disattivare queste suddivisioni prima di distruggere il buffer corrente, altrimenti invierai le suddivisioni in wonkyville

Io uso:

"" 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>   

Dove " NERDTreeToggle" in quell'elenco equivale a digitare :NERDTreeToggle. È possibile modificare questa funzione per integrarla con la propria configurazione.


per questo, il plugin bbye è perfetto che conserva il layout della finestra quando si utilizza :bdeleteo :bwipeout. Vedere la mia risposta .
Wolfson,

0

Chiudi buffer senza chiudere la finestra

Se vuoi chiudere un buffer senza distruggere il layout della tua finestra (layout attuale basato su split), puoi usare un plugin come bbye . Sulla base di questo, puoi semplicemente usare

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

O semplicemente creare una mappatura nella tua .vimrcper un accesso più facile come

:nnoremap <Leader>q :Bdelete<CR>

Vantaggio rispetto a vim's: bdelete e: bwipeout

Dalla documentazione del plug-in :

  • Chiudere e rimuovere il buffer.
  • Mostra un altro file in quella finestra.
  • Mostra un file vuoto se non hai altri file aperti.
  • Non lasciare inutili buffer [nessun file] se si decide di modificare un altro file in quella finestra.
  • Funziona anche se un file è aperto in più finestre.
  • Lavora bene con vari esploratori di buffer e schede.

: bdelete vs: bwipeout

Dalla documentazione del plug-in :

Vim ha due comandi per chiudere un buffer: :bdeletee :bwipeout. Il primo rimuove il file dall'elenco dei buffer, cancella le sue opzioni, variabili e mappature. Tuttavia, rimane nella jumplist, quindi Ctrl-oti riporta indietro e riapre il file. Se non è quello che vuoi, usa :bwipeouto l'equivalente di Bbye :Bwipeoutdove avresti usato :bdelete.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.