Wie kann ich einen Puffer schließen, ohne das Fenster zu schließen?

120

Vims mehrschichtige Ansichten (Windows, Puffer und Tabs) haben mich ein wenig verwirrt. Angenommen, ich teile die Anzeige (: sp) und wähle dann einen anderen Puffer aus, der in jedem Fenster angezeigt werden soll. Jetzt möchte ich einen der Puffer schließen, aber ich möchte nicht, dass das Fenster geschlossen wird (nach dem Schließen kann der nächste Puffer in der Liste oder ein leerer Puffer angezeigt werden, es spielt keine Rolle). Wie kann ich das machen?

Vielen Dank.

Mosh
quelle
Gibt es einen Grund, warum Sie den Puffer schließen möchten, anstatt ihn dort einfach nicht mehr zu sehen?
Rampion
9
Ich habe mich auch darüber gewundert. Es ist ärgerlich, einen Puffer zu löschen und anschließend den Teil meiner Splits neu erstellen zu müssen, der dabei zerstört wurde.
brettkelly
3
Bisher 29 Stimmen. Ich denke, dies ist ein ziemlich häufiger Anwendungsfall. Ich brauche das, wenn ich mit vielen Puffern arbeite. Manchmal benutze ich 2 Fenster und möchte einen Puffer schließen. Ich möchte nicht, dass das Fenster verschwindet. Ich möchte nur, dass der nächste Puffer dort angezeigt wird.
Wilson Freitas
Mögliches Duplikat von Vim: Puffer löschen, ohne das geteilte Fenster zu verlieren
George Hilliard

Antworten:

145

Ich habe ein bisschen damit rumgespielt und mir schließlich Folgendes ausgedacht:

:bp | sp | bn | bd

Hier ist die Version zum Kopieren / Einfügen für die Schlüsselzuordnung:

:bp<bar>sp<bar>bn<bar>bd<CR>

Ich habe es ein bisschen getestet und es funktioniert konstant unter verschiedenen Bedingungen. Bei Verwendung für den letzten Puffer wird ein neuer leerer Puffer angezeigt.

Wirf dies in deine .vimrc:

map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>

Starten Sie Vim neu oder nur, :source ~/.vimrcdamit die Änderungen wirksam werden. \qWenn Sie das nächste Mal einen Puffer schließen möchten, geben Sie einfach Folgendes ein: (Wenn dies \Ihr Führungsschlüssel ist)

Jonah Braun
quelle
1
Danke dir! Schön und einfach, im Gegensatz zu fast jeder anderen Lösung, die ich gesehen habe.
JWD
15
Für den Anfänger werfen Sie dies in Ihre .vimrc : map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>. Starten Sie VIM neu, wenn Sie das nächste Mal einen Puffer schließen möchten, geben Sie einfach \q
Folgendes
5
Dies hat ein unerwartetes Ergebnis, wenn Sie ein vertikal geteiltes Fenster hatten. Tatsächlich jede andere Fensterteilungskonfiguration als die Standardkonfiguration (erstellt von sp).
Hitzg
2
Ich denke, der Ausschnitt aus dem, was in .vimrc eingefügt werden soll, sollte den Punkt am Ende nicht enthalten. Davon abgesehen großartig! Dies sollte die akzeptierte Antwort sein.
Ernesto
3
das ist elegant. Wie andere Leute gesagt haben, wenn Sie meistens vertikale Teilungen verwenden, wechseln Sie spmit vsp. Mein .vimrc-Eintrag sieht folgendermaßen aus:cnoremap bd bp<bar>vsp<bar>bn<bar>bd
Connor
38

Ich habe heute danach gesucht und mir etwas ausgedacht

:b#|bd#

Dadurch wird das aktuelle Fenster in den zuvor geöffneten Puffer geändert und der gerade gelöschte Puffer gelöscht / ausgeblendet.

Dies erfordert mindestens zwei bekannte Puffer.

Wenn ein anderes Fenster, aber der Strom den gleichen Puffer anzeigt, wird die Aufteilung trotzdem zerstört. Sie können alle Fenster in den zuvor geöffneten Puffer mit ändern

:windo b#

In einer Antwort auf eine ähnliche Frage habe ich weitere Details zu dem früheren Befehl hinzugefügt, in dem eine Zuordnung (und einige Fallstricke) besprochen wurde .

gültig
quelle
Auch dies kann getan werden ... :#b|#bdVertauschen Sie einfach den Pufferbefehl und die Puffernummer oben.
Ashish
Ich habe das ein bisschen benutzt, aber ich ärgerte mich immer wieder darüber, dass es einen zuvor geschlossenen Puffer wieder öffnete.
Pean
@pean Das habe ich in der verknüpften Antwort erwähnt - siehe "Wichtige Hinweise". Ja, wäre schöner, wenn dies auf einen anderen offenen Puffer umgestellt würde.
gültig
1
Sie können auch :bn|bd#oder :bp|bd#stattdessen zum vorherigen bzw. nächsten offenen Puffer wechseln und nicht zum Puffer, auf den Sie zuletzt zugegriffen haben (b #).
Pavon
12
nmap <leader>d :bprevious<CR>:bdelete #<CR>

Funktioniert wie es sollte, bis ein Puffer in mehreren Fenstern geöffnet ist. Gut genug, es sei denn, Sie möchten die größeren Skripte verwenden.

Edit: das ist was ich gerade benutze:

function! BufferDelete()
    if &modified
        echohl ErrorMsg
        echomsg "No write since last change. Not closing buffer."
        echohl NONE
    else
        let s:total_nr_buffers = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))

        if s:total_nr_buffers == 1
            bdelete
            echo "Buffer deleted. Created new buffer."
        else
            bprevious
            bdelete #
            echo "Buffer deleted."
        endif
    endif
endfunction
ggustafsson
quelle
1
Ich habe es auf diese Weise versucht, aber es hat nicht sehr gut funktioniert, wenn mehrere geteilte Fenster verwendet wurden. Hier ist meine Lösung, wenn jemand das gleiche Problem hat:nmap <leader>d :ene<CR>:bd #<CR>
Caio
7

Ich denke, das ist was du suchst

http://www.vim.org/htmldoc/windows.html#window-moving

Versuche dies:

Schauen Sie sich Ihre Puffer-ID mit an

:buffers

Sie sehen dort eine Liste von Puffern wie

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

Wenn Sie b.py aus dem Puffer entfernen möchten

:2bw

Wenn Sie alle aus den Puffern entfernen / schließen möchten

:1,3bw
Nee
quelle
1
Ich möchte das Fenster nicht bewegen. Ich möchte den Puffer schließen, ohne die Position, Größe oder Existenz des Fensters zu berühren.
Mosh
5

Für diejenigen, die NERDTree verwenden.

Ich behebe dies mit diesem Plugin https://github.com/jistr/vim-nerdtree-tabs und jetzt kann ich den einzigen Buff / Datei / Tab schließen, ohne das Fenster zu schließen.

Nachdem Sie das obige Plugin installiert haben, geben Sie den folgenden Code in meine .vimrc ein:

let g:nerdtree_tabs_autoclose=0

Die Beschreibung für die obige Variable lautet: Aktuelle Registerkarte schließen, wenn nur ein Fenster vorhanden ist und es sich um NERDTree handelt (Standard 1).

Weitere Informationen finden Sie hier: https://github.com/jistr/vim-nerdtree-tabs#configuration

Lucas Serafim
quelle
2

Ich glaube nicht, dass es einen One-Shot-Weg gibt, dies zu tun, aber Sie könnten dies tun :enewoder :lsIhre Puffer auflisten und mit einem anderen tauschen :b [number].

Sobald Sie einen anderen Puffer im Fenster haben, :bd #wird der vorherige Puffer im Fenster gelöscht. Da der aktuelle Puffer noch vorhanden ist, wird das Fenster nicht geschlossen.

Andrew Khosravian
quelle
2

Vorher habe ich benutzt :

:bp<bar>sp<bar>bn<bar>bd<CR>

Aber ich fand bestimmte Gelegenheiten, in denen es mein Fenster schloss.

Kürzlich habe ich festgestellt, dass ich dies immer verwende, wenn ich an einem Projekt arbeite und es schnell öffnen muss, .tmux.conf .zshrcbevor ich wieder arbeiten kann.

Für diese Verwendung finde ich besser:

  • Wechseln Sie zurück zu dem Puffer, an dem ich zuvor gearbeitet habe C-6
  • Geben Sie :bd#den vorherigen Puffer zu löschen (ich habe es wie folgt abgebildet: nnoremap <leader>d :bd#<CR>)

Es ermöglicht mir, den Puffer zu kontrollieren, zu dem ich zurückkehre, und fühlt sich natürlicher an.

DaftWooly
quelle
1

Würde

:enew

Tun Sie, was Sie wollen? Es wird ein neuer, unbenannter Puffer im aktuellen Fenster bearbeitet, wobei die vorhandene Datei in allen anderen Fenstern geöffnet bleibt.

mikej
quelle
Dadurch wird ein neuer leerer Puffer geöffnet. Ich möchte den aktuellen Puffer schließen, ohne das Fenster zu schließen.
Mosh
1

Meine Lieblingslösung dafür ist das bufkill.vim Plugin ( GitHub ). Es bietet alternative Versionen der verschiedenen :b-prefix-Befehle, die genauso funktionieren wie ihre Gegenstücke, aber das Fenster offen lassen. Sie zeigen an, was auch immer der letzte sichtbare Puffer enthielt, oder einen leeren / neuen Puffer, wenn kein vorheriger Puffer vorhanden war.

Aus der Dokumentation:

Wenn Sie einen Puffer entladen / löschen / löschen möchten, verwenden Sie:
  : bun /: bd /: bw, um auch das Fenster zu schließen (Befehl vim), oder
  : BUN /: BD /: BW, um die Fenster intakt zu lassen (dieses Skript).
Jim Stewart
quelle
1

Verwenden Sie zum Schließen einer Ansicht :hid[e]. Funktioniert, wenn Sie das Ansichtsfenster aufgeteilt oder mehrere Dateien geöffnet haben. Sie können den letzten angezeigten Puffer nicht ausblenden.

1 Ein weiterer Tipp, der mir geholfen hat: Verwenden Sie :e ./path/to/file.workdiese Option, um eine Datei im Ansichtsfenster zu öffnen, ohne das Fenster zu teilen.

PS Nach zwei Tagen habe ich immer noch Probleme, die genauen Hilfebefehle zu finden. Hoffentlich hilft dies jemand anderem, so lange weiterzuarbeiten, bis er wirklich Zeit hat, vim zu verstehen.

Sennekuyl
quelle
1

Hier ist eine sehr gut lesbare Vimscript-Funktion, die alle Fälle gut behandelt .

  • verhalten sich ähnlich wie eingebaut:bd (wenn nur ein Fenster, rufen Sie es einfach auf!),
    • Geben Sie eine Warnung aus und tun Sie nichts, wenn der Puffer geändert wurde.
    • Wenn kein anderer Puffer vorhanden ist, erstellen Sie einen über :enew .
    • Wenn ein alternativer Puffer vorhanden ist buffer-list, wechseln Sie zu diesem Puffer , andernfalls gehen Sie als nächstes über :bn.
  • vernünftigeres Verhalten für das Layout mit mehreren Fenstern
    • kein Fenster schließen,
    • Bleiben Sie immer im Originalfenster.
    • Gehen Sie für jedes Fenster, in dem der aktuelle Puffer angezeigt wird, wie oben aufgeführt vor und löschen Sie dann den alten aktuellen Puffer.
nnoremap <Leader> b: Rufen Sie DeleteCurBufferNotCloseWindow () <CR> auf

func! DeleteCurBufferNotCloseWindow () wird abgebrochen
    if & geändert
        echohl ErrorMsg
        echom "E89: kein Schreiben seit der letzten Änderung"
        echohl Keine
    elseif winnr ('$') == 1
        bd
    sonst "Mehrfachfenster
        let oldbuf = bufnr ('%')
        lass oldwin = winnr ()
        während 1 "bleiben alle Fenster, die oldbuf anzeigen, geöffnet
            wenn buflisted (bufnr ('#'))
                b #
            sonst
                bn
                let curbuf = bufnr ('%')
                wenn curbuf == oldbuf
                    neu "oldbuf ist der einzige Puffer, erstelle einen
                endif
            endif
            lass win = bufwinnr (oldbuf)
            wenn win == -1
                brechen
            sonst "gibt es andere Fenster, in denen oldbuf angezeigt wird
                exec win 'wincmd w'
            endif
        in der Zwischenzeit
        "lösche oldbuf und stelle das Fenster auf oldwin wieder her
        exec oldbuf 'bd'
        exec oldwin 'wincmd w'
    endif
endfunc
qeatzy
quelle
0

Wenn Sie wie ich sind und hierher gekommen sind, um das Gegenteil zu tun , schließen Sie das Fenster, ohne den Puffer zu schließen. Sie können dies tun über:

:close

xdhmoore
quelle
-5

Verwenden Sie ": bd" als Befehl.

Silvanus
quelle