Vim: Schließen Sie alle Puffer außer diesem

196

Wie kann ich alle Puffer in Vim schließen, außer den, die ich gerade bearbeite?

Rafid
quelle
1
Ich fount diesen Link
klokop

Antworten:

171

Versuche dies

bufdo bd

bufdo führt den Befehl für alle Puffer aus

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

gayavat
quelle
Dadurch wird der NERDTree-Puffer nicht geschlossen.
Uri
NERDTree ist geschlossen, wenn der Fokus im Nerd-Baum-Panel liegt
gayavat
2
Möglicherweise möchten Sie NERDTree schließen, bevor Sie dies tun, um zu verhindern, dass der bdBefehl das vim selbst schließt. nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
lvarayut
11
Die Dokumentation warnt davor, dass das Argument :bufdo"Puffer dürfen nicht gelöscht oder Puffer zur Pufferliste hinzugefügt werden" darf. Wenn diese Lösung funktioniert, funktioniert sie aus Versehen… und bei mir funktioniert sie oft nicht (wechselt zu einem anderen Puffer).
glitzert
10
Dies schließt alle Puffer für mich, was in den Fragen nicht gestellt wird. (MacVim Version 8.0.1207)
Michael Leonard
143

Ich konnte das ziemlich einfach so machen:

:%bd|e#
OldTimeGuitarGuy
quelle
4
Das ist eine schöne Antwort. Dadurch fühlt sich BufOnly etwas übertrieben an (ich meine, ein ganzes Plugin?), Es sei denn, Sie verwenden die Funktion zum Übergeben von Argumenten von BufOnly. Alles, was ich jemals wirklich tun möchte, ist:%bd|e#
shmup
41
@jorgeh %bd= Alle Puffer löschen. e#= Öffne den letzten Puffer zur Bearbeitung. Die Pipe dazwischen führt nur einen Befehl nach dem anderen aus.
OldTimeGuitarGuy
20
@Jared Mit können Sie %bd|e#|bd#den [No Name]Puffer löschen , der erstellt wird.
Kshenoy
12
Wunderbar. Dann haben Sie hier das einzige, wofür ich jemals das BufOnly-Plugin verwendet habe, das auf einen einzigen Befehl destilliert wurde:command! BufOnly silent! execute "%bd|e#|bd#"
shmup
4
@Finn müssen Sie entkommen |:map <leader>o :%bd\|e#<cr>
Halil Özgür
57

Wenn Sie sich nicht für die aktuelle interessieren, ist es einfacher, so etwas zu tun (kein Skript erforderlich):

1,100bd
Juananruiz
quelle
4
Es wird auch den Nerdtree-Puffer schließen.
Afshin Mehrabani
Ich hatte einige Probleme mit diesem Befehl, wenn NERDTree aktiviert ist. Ich empfehle die Verwendung des BufOnly.vim-Plugins, wie von @VoY erwähnt.
Moeabdol
1
Ich habe die folgende Zuordnung vorgenommen, die das Löschen des NERDTree-Puffers berücksichtigt:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri
5
Ich habe das lange benutzt, aber jetzt bekomme ich es, E16: Invalid rangeweil einige der Puffer im Bereich nicht wirklich existieren. Das wurde bis vor kurzem ignoriert.
Jon
3
@Jon Überprüfen Sie :ls, ob der größte Puffer tatsächlich geöffnet ist, und stellen Sie Ihren Bereich auf diesen Wert ein (dh wenn Ihr höchster Puffer 22 ist, dann :1,22bd). Ich habe den gleichen Fehler bekommen, bis ich das getan habe.
Nairou
51

Ich mache das

:w | %bd | e#

Mein Favorit, wenn ich nur möchte, dass mein aktueller Puffer alle anderen öffnet und schließt.

So funktioniert es: Schreiben Sie zuerst die Änderungen des aktuellen Puffers, schließen Sie dann alle geöffneten Puffer und öffnen Sie dann den Puffer, in dem ich mich gerade befand. In Vim verkettet das |die Ausführung von Befehlen miteinander. Wenn Ihr Puffer auf dem neuesten Stand ist, kann das oben Gesagte auf gekürzt werden:%bd | e#

iamnotsam
quelle
Es funktioniert meistens gut. aber manchmal %kann nicht als alle Selektor arbeiten. Könnten Sie etwas erraten?
Jinyoung Kim
@JinyoungKim (von [1]) Im Befehl ":% bd" wird der Bereich '%' durch die Start- und Endzeilennummern im aktuellen Puffer ersetzt. Anstatt '%' als Bereich zu verwenden, sollten Sie Zahlen für den Bereich angeben. Um beispielsweise alle Puffer zu löschen, können Sie den Befehl ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam
Ich habe gerade das Dokument ausgecheckt. Der Bereich '%' hängt also von einer Reihe aktueller Dateizeilen ab?
Jinyoung Kim
2
Ich habe eine integrierte Funktion gefunden bufnr("$"), die die letzte Puffernummer zurückgibt. Aber ich habe keine Ahnung, ob ich in einen String interpolieren soll, wenn ich ihn so benutze :1,bufnr("$")bd. Vielleicht ... wäre die beste Lösung :1,9999bd.
Jinyoung Kim
2
:help :bdzeigt :%bdelete " delete all buffers. So %ist genau das, was Sie wollen. Ich verwende eine Variante Ihrer Lösung: :%bd<CR><C-O>:bd#<CR>Dadurch werden alle Puffer gelöscht und anschließend <C-O>die Position in der aktuellen Datei wiederhergestellt und anschließend :bd#der unbenannte Puffer entfernt. Dadurch werden alle Puffer geschlossen und Sie befinden sich an derselben Stelle in der Datei.
Alejandro
25

Aufbauend auf Juananruiz 'Antwort.

Nehmen Sie dann eine kleine Änderung an dem Puffer vor, den Sie behalten möchten

:1,1000bd

Der Befehl bd(Buffer Delete) löscht keine Puffer mit nicht gespeicherten Änderungen. Auf diese Weise können Sie die aktuelle (geänderte) Datei in der Pufferliste behalten.

Bearbeiten: Bitte beachten Sie, dass dadurch auch Ihr NERDTreeBuffer gelöscht wird. Sie können es zurückbekommen mit: NERDTree

Cutemachine
quelle
Perfekt, kurz und einfach! :)
Arkod
49
:% bd ist eigentlich "all" statt 1-1000.
John Tyree
Muss dies set nohiddeneingestellt werden?
Felipe Alvarez
15

Durch die Nutzung

:on[ly][!]

und

:h only
klokop
quelle
27
Dies schließt Fenster, keine Puffer.
ZyX
13
Immer noch nützlich, da die Leute möglicherweise nach dem falschen Begriff googeln und dies finden werden. Also danke an euch beide. :)
Archgoon
1
@archgoon ja, sollte aber in der Antwort angegeben werden.
Andho
10

Schließen aller offenen Puffer:

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

Schließen aller offenen Puffer mit Ausnahme des aktuellen :

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

Fügen Sie diese Funktion hinzu .vimrcund rufen Sie sie mit auf :call CloseAllBuffersButCurrent().

Komfortkarte:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
Mynyml
quelle
Ich habe festgestellt, dass ich beim Fortsetzen von vim-Sitzungen, bei denen Puffer wiederhergestellt werden, keine Puffer mehr mit den oben genannten entfernen konnte. Stattdessen musste ich:%bd|e#|bd#
shmup
Beste Lösung. Ich habe einen Befehl zum erneuten Öffnen von NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa
5

Ich habe dies in meine .vimrc-Datei eingefügt

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

dann schließen Sie leader + ca(alle schließen) alle Puffer außer dem aktuellen.

Was es tut ist

: w - aktuellen Puffer speichern

% bd - Alle Puffer schließen

e # - zuletzt bearbeitete Datei öffnen

bd # - Schließen Sie den unbenannten Puffer

Yulin
quelle
4

Es gibt ein Plugin , das genau das und noch ein bisschen mehr macht!

Schauen Sie sich close-buffers.vim an

Niko Bellic
quelle
1

Folgendes mache ich Daher möchte ich meine Cursorposition beibehalten, nachdem ich alle Puffer entfernt habe, und die meisten der oben genannten Lösungen ignorieren diese Tatsache einfach. Ich denke auch, dass es besser ist, den Befehl neu zuzuordnen, als ihn einzugeben. Hier <leader>bdentferne ich alle Puffer und springe zurück zu meiner ursprünglichen Cursorposition.

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

%bd = alle Puffer löschen.

e# = öffne den letzten Puffer zum Bearbeiten (an welchem ​​Puffer ich arbeite).

bd#um den [No Name] -Puffer zu löschen, der bei Verwendung erstellt wird %bd.

Die Pipe dazwischen führt nur einen Befehl nach dem anderen aus. Du musst ihm entkommen, obwohl du es benutzt\|

'" = Behalte meine Cursorposition.

0xMH
quelle
0

Ich mag 1,100bd( vorgeschlagen von Juananruiz ), was für mich zu funktionieren scheint.

Ich quit!habe meinem Mapping ein hinzugefügt , um es mir zu geben

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

Dies tötet alle Puffer und schaltet Vim aus, wonach ich am meisten gesucht habe.

LazyRiverYogi
quelle
1
Es gibt wirklich keinen Grund für Sie, das bdqMapping zu haben , das alle Puffer schließt und vim mit beendet :q!, wenn Sie stattdessen nur verwenden können :qa!. Es sei denn, ich übersehen etwas
shmup