Jak zamknąć pojedynczy bufor (spośród wielu) w Vimie?

445

Otwieram kilka plików w Vimie, na przykład przez uruchomienie

vim a/*.php

który otwiera 23 pliki.

Następnie dokonuję edycji i uruchamiam dwa razy następujące

:q

który zamyka wszystkie moje bufory.

Jak możesz zamknąć tylko jeden bufor w Vimie?

Léo Léopold Hertz 준영
źródło
9
Zauważ, że możesz otwierać pliki w osobnych oknach Vima za pomocą vim -o a/*.php(lub w -Ocelu korzystania z okien pionowych) i unikać nawigacji w buforze - jest to świetna metoda tylko dla kilku plików, ale przy 23 plikach będą miały tylko kilka linii / kolumn każdy.
Cascabel,
1
@Jefromi: Dziękujemy za zwrócenie na to uwagi! Nigdy wcześniej nie korzystałem z opcji -o.
Léo Léopold Hertz -
Na temat podziału okna. Jeśli jesteś już w Vimie i chcesz otworzyć kolejny plik w podziale: esp for horizontal: evsp for vertical.
Lanzafame,

Odpowiedzi:

558

Słowo ostrzeżenia: „ww w mc nie oznacza zapisu, ale wymazywania!”

Więcej z instrukcji:

: bd

Zwolnij bufor [N] (domyślnie: bieżący bufor) i usuń go z listy buforów. Jeśli bufor został zmieniony, nie powiedzie się, chyba że podano [!], W którym to przypadku zmiany zostaną utracone. Plik pozostaje niezmieniony.

Jeśli wiesz, co robisz, możesz także użyć: bw

: bw

Jak |: bdelete |, ale tak naprawdę usuwa bufor.

hhh
źródło
4
Również możliwość wykonania „: M, Nbd”, aby zamknąć numery buforów M na N. Lub „: bd N1 N2 ...”, gdzie N # to numer bufora
ośnieżony
61
Podręcznik mówi, aby używać tylko :bwwtedy, gdy „wiesz, co robisz”, czego ja nie wiem, więc chyba użyję :bd.
jberryman
1
Na początku byłem tym zdezorientowany - otwierałem nową kartę, aby zamknąć bufory ... ale zamknięcie bufora na karcie (za pomocą prostej :bd) również zamyka kartę. Prawdopodobnie chcesz :bd n .. [m]lub żeby :n,mbdkonkretne liczby lub zakres liczb zostały zamknięte, co możesz zrobić bez patrzenia na bufory
JonnyRaa
5
wjest skrótem od writepolecenia zgodnie z instrukcją Vima, ponadto nie ma wzmianki o żadnym „wymazaniu”. Opis polecenia ( help write) zaczyna się od „Zapisz cały bufor do bieżącego pliku”.
AMN
3
@amn Ja też się zdezorientowałem, ale miał na myśli, wże bwpolecenie oznacza usunięcie, że nie mówi o wpoleceniu. Umieścił to ostrzeżenie, aby ludzie nie sądzili, że bwpolecenie oznaczało zapis bufora (co nie znaczy, że wyczyszczenie bufora.)
John,
351

Jeśli nie wynika to z poprzednich odpowiedzi:

: bd zamknie bieżący bufor. Jeśli nie chcesz pobrać listy buforów.

RedBlueThing
źródło
4
Przed znalezieniem: bd, nigdy nie miało dla mnie sensu, że ludzie nie mieli problemów z: a. Ls -> skanuj w poszukiwaniu numeru dokumentu -> zwalniaj bufor według numeru. Czy ludzie faktycznie uważają to za skuteczne?
Svend,
3
@svend dla szeregu buforów na pewno, ale dla pojedynczego a: bd jest prawdopodobnie bardziej skuteczny.
Pharaun,
1
@Svend Trzymam „otwarty” podział z listą buforów
New Alexandria
10
:bdzamyka tylko bufor, podczas gdy (cokolwiek to znaczy), a :bwjednocześnie usuwa wszystkie zmienne i NAPRAWDĘ eliminuje je z lsbufora.
RedX
1
hhh poniżej odpowiedź jest bardziej
103

Sprawdź swój identyfikator bufora za pomocą: buforów

zobaczysz tam listę buforów takich jak

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

jeśli chcesz usunąć b.php z bufora

:2bw

jeśli chcesz usunąć / zamknąć wszystko z buforów

:1,3bw
nightingale2k1
źródło
4
Możesz także wyczyścić wszystkie bufory za pomocą:% bw
cdleonard
7
skrót do sprawdzenia identyfikatora bufora: 2 CTRL-G
ośnieżony
43

Zamiast przeglądać wyjście polecenia: ls i usuwać (zwalniać, czyścić ...) bufor, określając jego numer, uważam, że używanie nazw plików jest często bardziej skuteczne.

Na przykład po otwarciu kilku plików .txt w celu odświeżenia moich wspomnień z jakiegoś drobnego punktu .. skopiuj i wklej kilka wierszy tekstu, aby użyć go jako pewnego rodzaju szablonu .. itd., Napisałbym:

:bd txt <Tab>

Pamiętaj, że pasujący ciąg nie musi znajdować się na początku nazwy pliku.

Powyżej wyświetla listę nazw plików pasujących do „txt” u dołu ekranu i utrzymuje polecenie: bd, które początkowo wpisałem nietknięte, gotowe do ukończenia.

Oto przykład:

doc1.txt doc2.txt
:bd txt 

Mógłbym cofnąć się do bitu „txt” i wpisać nazwę pliku, który chcę usunąć, ale tam, gdzie staje się to naprawdę wygodne, nie muszę: jeśli po raz drugi uderzę w klawisz Tab, Vim automatycznie wykonuje polecenie z pierwszym dopasowaniem:

:bd doc1.txt

Jeśli chcę pozbyć się tego konkretnego bufora, wystarczy nacisnąć Enter.

A jeśli bufor, który chcę usunąć, zdarza się być drugim (trzecim ... itd.) Dopasowaniem, muszę tylko naciskać klawisz Tab, aby polecenie: bd przechodziło przez listę dopasowań.

Oczywiście, tej metody można również użyć do przełączenia do danego bufora za pomocą takich poleceń jak: b ..: sb .. itp.

To podejście jest szczególnie przydatne, gdy ustawiona jest opcja „ukrytego” Vima, ponieważ lista buforów może szybko stać się dość duża, obejmując kilka ekranów i utrudniając zlokalizowanie konkretnego bufora, którego szukam.

Aby w pełni wykorzystać tę funkcję, prawdopodobnie najlepiej jest przeczytać następujący plik pomocy Vima i odpowiednio dostosować działanie wiersza poleceń Tab, aby najlepiej pasował do Twojego przepływu pracy:

:help wildmode

Zachowanie, które opisałem powyżej, wynika z następującego ustawienia, które wybrałem dla zachowania spójności w celu emulacji zakończenia bash:

:set wildmode=list:longest,full

W przeciwieństwie do używania numerów buforów, zaletą tego podejścia jest to, że zwykle pamiętam przynajmniej część podanej nazwy pliku, co pozwala mi bezpośrednio celować w bufor, zamiast konieczności wcześniejszego wyszukiwania jego numeru za pomocą polecenia: ls.

szef'
źródło
40

Posługiwać się:

  • :ls - aby wyświetlić listę buforów
  • :bd#n- aby zamknąć bufor, gdzie #n jest numerem bufora (użyj, lsaby go uzyskać)

Przykłady:

  • aby usunąć bufor 2:

    :bd2
    
Shaun
źródło
16

Możesz mapować następny i poprzedni również na klawisze funkcyjne, dzięki czemu cykliczne przechodzenie między buforami jest dziecinnie proste

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

z mojego vimrc

Ravi
źródło
2

Co powiesz na

vim -O a a

W ten sposób możesz edytować pojedynczy plik po lewej stronie i poruszać się po całym katalogu po prawej stronie ... Tylko myśl, a nie rozwiązanie ...

Santi
źródło
2

[EDYCJA: to była głupia sugestia z czasów, gdy nie znałem wystarczająco dobrze Vima. Nie używaj tabulatorów zamiast buforów; zakładki to „układy okien” Vima]

Może przełączysz się na używanie kart?

vim -p a/*.php otwiera te same pliki w zakładkach

gti gTprzełączaj zakładki tam iz powrotem

:q zamyka tylko bieżącą kartę

:qa zamyka wszystko i wychodzi

:tabo zamyka wszystko oprócz bieżącej karty

Leonid Szewcow
źródło
2
Dlaczego mówisz, że używanie kart to głupia sugestia? Pytam tylko dlatego, że cały czas używam tabulatorów ...: ^ /
Nate
2
@Nate: Zdecydowałem się rozwinąć na temat leonid.shevtsov.me/en/...
Leonid Shevtsov
1
To był świetny post - zainspirował mnie do głębszego kopania - czy spojrzałeś wildmenu? Jest podobny do lustyjuggler (choć prostszy), ale jest wbudowany (co było dla mnie dobre, ponieważ lustyjuggler potrzebuje +rubyi domyślnego vima dla statków z Oneiric Ubuntu -ruby).
Nate
@Nate: tak, używam wildmenu do otwierania plików, ale kiedy masz wiele plików w projekcie, to po prostu się nie skaluje. Ponadto vim-noxpakiet Ubuntu obsługuje Ruby.
Leonid Szewcow
1

Osoby używające bufora lub wtyczki do nawigacji po drzewie, takie jak Buffergator lub NERDTree, będą musiały przełączać te podziały przed zniszczeniem bieżącego bufora - w przeciwnym razie wyślesz podziały do ​​winkyville

Używam:

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

Gdzie „ NERDTreeToggle” na tej liście jest takie samo jak pisanie :NERDTreeToggle. Możesz zmodyfikować tę funkcję, aby zintegrować ją z własną konfiguracją.

Nowa Aleksandria
źródło
w tym celu idealna jest wtyczka bbye, która zachowuje układ okna podczas używania :bdeletelub :bwipeout. Zobacz moją odpowiedź .
Wolfson
0

Zamknij bufor bez zamykania okna

Jeśli chcesz zamknąć bufor bez niszczenia układu okna (aktualny układ oparty na podziale), możesz użyć wtyczki takiej jak bbye . Na tej podstawie możesz po prostu użyć

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

Lub po prostu utwórz mapowanie w .vimrccelu łatwiejszego dostępu

:nnoremap <Leader>q :Bdelete<CR>

Przewaga nad vim's: bdelete i: bwipeout

Z dokumentacji wtyczki :

  • Zamknij i usuń bufor.
  • Pokaż inny plik w tym oknie.
  • Pokaż pusty plik, jeśli nie masz otwartych innych plików.
  • Nie pozostawiaj bezużytecznych buforów [brak pliku], jeśli zdecydujesz się edytować inny plik w tym oknie.
  • Działa, nawet jeśli plik jest otwarty w wielu oknach.
  • Pracuj dobrze z różnymi przeglądarkami buforów i paskami.

: bdelete vs: bwipeout

Z dokumentacji wtyczki :

Vim ma dwa polecenia do zamknięcia bufora: :bdeletei :bwipeout. Pierwszy usuwa plik z listy buforów, usuwa jego opcje, zmienne i mapowania. Pozostaje jednak na liście szybkiego wyszukiwania, więc Ctrl-ozabiera cię z powrotem i ponownie otwiera plik. Jeśli nie tego chcesz, użyj :bwipeoutlub odpowiednika Bbye w :Bwipeoutmiejscu, w którym byś użył :bdelete.

Wolfson
źródło