Vim: Chiudi tutti i buffer tranne questo


196

Come posso chiudere tutti i buffer in Vim tranne quello che sto attualmente modificando?


1
Ho trovato questo link
klokop il

Risposte:



171

Prova questo

bufdo bd

bufdo esegue il comando per tutti i buffer

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


Questo non chiude il buffer NERDTree.
Uri,

NERD L'albero è chiuso se lo stato attivo è nel pannello albero nerd
gayavat,

2
Potresti voler chiudere NERDTree prima di farlo per evitare che il bdcomando chiuda il vim stesso; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
lvarayut,

11
La documentazione avverte che l'argomento :bufdo"non deve eliminare i buffer o aggiungere buffer all'elenco dei buffer". Quindi, se questa soluzione funziona, funziona per caso ... e spesso non funziona per me (passa a un buffer diverso).
inizia il

10
Questo chiude tutti i buffer per me, che non è quello che fanno le domande. (Versione MacVim 8.0.1207)
Michael Leonard,

143

Sono stato in grado di farlo abbastanza facilmente in questo modo:

:%bd|e#

4
Questa è una bella risposta Fa sembrare BufOnly un po 'eccessivo (intendo un intero plugin?) A meno che tu non stia usando la funzione di passaggio degli argomenti di BufOnly. Tutto quello che ho sempre voluto fare è:%bd|e#
shmup

41
@jorgeh %bd= elimina tutti i buffer. e#= apre l'ultimo buffer per la modifica. La pipe in mezzo fa solo un comando dopo l'altro.
OldTimeGuitarGuy

20
@Jared È possibile utilizzare %bd|e#|bd#per eliminare il [No Name]buffer che viene creato.
kshenoy,

12
Meraviglioso. Quindi qui hai l'unica cosa per cui abbia mai usato il plugin BufOnly, distillato con un singolo comando:command! BufOnly silent! execute "%bd|e#|bd#"
shmup

4
@Finn devi scappare |:map <leader>o :%bd\|e#<cr>
Halil Özgür

57

Se non ti interessa quello attuale, è più semplice fare qualcosa del genere (non è necessario alcun copione):

1,100bd

4
Chiuderà anche il buffer nerdtree.
Afshin Mehrabani,

Ho riscontrato alcuni problemi utilizzando questo comando quando è abilitato NERDTree. Consiglio di usare il plugin BufOnly.vim come menzionato da @VoY.
Moeabdol,

1
Ho creato la seguente mappatura che spiega l'eliminazione del buffer NERDTree:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri

5
L'ho usato per molto tempo, ma ora capisco E16: Invalid rangeperché alcuni dei buffer nell'intervallo in realtà non esistono. Lo ignorava fino a poco tempo fa.
Jon,

3
@Jon Controlla :lsper vedere il buffer più grande che hai effettivamente aperto, e imposta il tuo intervallo su quello (cioè se il tuo buffer più alto è 22, allora :1,22bd). Ho avuto lo stesso errore fino a quando non l'ho fatto.
Nairou,

51

lo faccio

:w | %bd | e#

Il mio preferito se voglio solo aprire il mio buffer corrente e chiudere tutti gli altri.

Come funziona: prima scrivi le modifiche del buffer corrente, quindi chiudi tutti i buffer aperti, quindi riapri il buffer su cui mi trovavo attualmente. In Vim, le |catene eseguono insieme i comandi. Se il buffer è aggiornato, è possibile abbreviare quanto sopra:%bd | e#


Funziona principalmente bene. ma a volte %non può funzionare come tutti i selettori. Potresti indovinare qualcosa?
Jinyoung Kim,

@JinyoungKim (da [1]) Nel comando ":% bd", l'intervallo '%' verrà sostituito con i numeri di riga iniziale e finale nel buffer corrente. Invece di utilizzare '%' come intervallo, è necessario specificare i numeri per l'intervallo. Ad esempio, per eliminare tutti i buffer, è possibile utilizzare il comando ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam

Ho appena controllato il documento. Quindi, l'intervallo '%' si basa su un numero di linee di file correnti?
Jinyoung Kim,

2
Ho trovato la funzione integrata bufnr("$")che restituisce l'ultimo numero di buffer. ma non ho idea di interpolare la stringa quando uso in questo modo :1,bufnr("$")bd. Forse .. la migliore soluzione sarebbe :1,9999bd.
Jinyoung Kim,

2
:help :bdspettacoli :%bdelete " delete all buffers. Quindi %è esattamente quello che vuoi. Uso una variante della tua soluzione: :%bd<CR><C-O>:bd#<CR>questo eliminerà tutti i buffer, quindi userà <C-O>per ripristinare la posizione nel file corrente, quindi :bd#per rimuovere il buffer senza nome. Questo chiude tutti i buffer e ti lascia nella stessa posizione nel file.
Alejandro,

25

Basandosi sulla risposta di juananruiz.

Apporta quindi una piccola modifica al buffer che desideri conservare

:1,1000bd

Il comando bd(eliminazione buffer) non eliminerà alcun buffer con modifiche non salvate. In questo modo è possibile mantenere il file corrente (modificato) nell'elenco dei buffer.

Modifica: si noti che ciò eliminerà anche NERDTreeBuffer. Puoi riaverlo con: NERDTree


Perfetto, breve e semplice! :)
Arkod

49
:% bd è in realtà "tutto" invece di 1-1000.
John Tyree,

Questo dipende set nohiddenda essere impostato?
Felipe Alvarez,

15

Usando

:on[ly][!]

e

:h only

27
Questo chiude Windows, non i buffer.
ZyX,

13
Ancora utile, poiché le persone potrebbero anche cercare su Google il termine sbagliato e lo troveranno. Quindi grazie a entrambi. :)
archgoon,

1
@archgoon sì, ma dovrebbe essere specificato nella risposta.
andho,

10

Chiusura di tutti i buffer aperti:

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

Chiusura di tutti i buffer aperti ad eccezione di quello corrente :

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

Aggiungi questa funzione .vimrce chiamala usando :call CloseAllBuffersButCurrent().

Mappa della convenienza:

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

Ho notato che quando ho ripreso le sessioni di vim, che ripristinano i buffer, non sono stato più in grado di rimuovere i buffer usando quanto sopra. Invece, ho dovuto usare:%bd|e#|bd#
shmup

Soluzione migliore. Ho aggiunto un comando per riaprire NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa

5

L'ho inserito nel mio file .vimrc

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

quindi il tuo leader + ca(chiudi tutto) chiudi tutti i buffer tranne quello corrente.

Quello che fa è

: w - salva il buffer corrente

% bd - chiude tutti i buffer

e # - apre l'ultimo file modificato

bd # - chiude il buffer senza nome



1

Ecco cosa faccio. Quindi mi piace mantenere la posizione del cursore dopo aver rimosso tutti i buffer e la maggior parte delle soluzioni sopra ignora questo fatto. Penso anche che rimappare il comando sia meglio che digitarlo, quindi qui uso <leader>bdper rimuovere tutti i buffer e tornare alla posizione del cursore originale.

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

%bd = elimina tutti i buffer.

e# = apri l'ultimo buffer per la modifica (qual è il buffer su cui sto lavorando).

bd#per eliminare il buffer [Nessun nome] che viene creato durante l'utilizzo %bd.

La pipe in mezzo fa solo un comando dopo l'altro. Devi scappare però usando\|

'" = mantieni la posizione del cursore.


0

Mi piace 1,100bd( suggerito da Juanuanruiz ) che sembra funzionare per me.

Ho aggiunto a quit!alla mia mappatura per darmi

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

Questo uccide tutti i buffer e spegne Vim, che è quello che stavo cercando principalmente.


1
Non c'è davvero alcun motivo per cui tu abbia la bdqmappatura che chiude tutti i buffer ed esce da VIM :q!, quando invece puoi semplicemente usare :qa!. A meno che non stia trascurando qualcosa
shmup

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.