Vim: Zamknij wszystkie bufory oprócz tego

198

Jak mogę zamknąć wszystkie bufory w Vimie oprócz tego, który aktualnie edytuję?

Rafid
źródło
1
I Fount ten link
klokop

Odpowiedzi:

171

Spróbuj tego

bufdo bd

bufdo uruchamia polecenie dla wszystkich buforów

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

gayavat
źródło
To nie zamyka bufora NERDTree.
Uri,
2
Możesz chcieć zamknąć NERDTree przed zrobieniem tego, aby zapobiec bdzamknięciu samego polecenia vim; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
lvarayut
11
Dokumentacja ostrzega, że ​​argument :bufdo„nie wolno usuwać buforów ani dodawać buforów do listy buforów”. Więc jeśli to rozwiązanie działa, działa przez przypadek… i często nie działa dla mnie (przełącza się na inny bufor).
wtapia się w kwietniu
10
To zamyka dla mnie wszystkie bufory, czego nie zadają pytania. (MacVim wersja 8.0.1207)
Michael Leonard,
1
To polecenie zamyka wszystkie bufory. Jak mogę pozostawić bieżącą otwartą?
h-rai,
143

Byłem w stanie zrobić to tak łatwo:

:%bd|e#
OldTimeGuitarGuy
źródło
4
To miła odpowiedź. Sprawia, że ​​BufOnly czuje się trochę przesadnie (mam na myśli całą wtyczkę?), Chyba że używasz funkcji przekazywania argumentów BufOnly. Wszystko, co chcę naprawdę zrobić, to:%bd|e#
shmup
41
@jorgeh %bd= usuń wszystkie bufory. e#= otwórz ostatni bufor do edycji. Rura pomiędzy wykonuje tylko jedno polecenie po drugim.
OldTimeGuitarGuy
20
@Jared Możesz użyć, %bd|e#|bd#aby usunąć utworzony [No Name]bufor.
kshenoy
12
Wspaniale. Tutaj masz jedyną rzecz, dla której kiedykolwiek użyłem wtyczki BufOnly, destylowaną do jednego polecenia:command! BufOnly silent! execute "%bd|e#|bd#"
shmup
4
@Finn musisz uciec |:map <leader>o :%bd\|e#<cr>
Halil Özgür
57

Jeśli nie obchodzi Cię obecna, łatwiej jest zrobić coś takiego (nie wymaga skryptu):

1,100bd
juananruiz
źródło
4
Zamknie także bufor nerdtree.
Afshin Mehrabani
Podczas korzystania z tego polecenia napotkałem problemy z włączeniem NERDTree. Polecam za pomocą wtyczki BufOnly.vim, jak wspomniano w @VoY.
moeabdol
1
Zrobiłem następujące mapowanie, które odpowiada za usunięcie bufora NERDTree:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri
5
Używałem tego przez długi czas, ale teraz dostaję, E16: Invalid rangeponieważ niektóre bufory z tego zakresu faktycznie nie istnieją. Do niedawna to ignorowało.
Jon
3
@Jon Sprawdź :lsnajwiększy bufor, który faktycznie masz otwarty, i ustaw na niego swój zakres (tzn. Jeśli twój najwyższy bufor wynosi 22, to :1,22bd). Dostałem ten sam błąd, dopóki tego nie zrobiłem.
Nairou,
51

robię to

:w | %bd | e#

Moje ulubione, jeśli chcę tylko, aby mój bieżący bufor otwierał i zamykał wszystkie pozostałe.

Jak to działa: najpierw napisz zmiany w bieżącym buforze, następnie zamknij wszystkie otwarte bufory, a następnie ponownie otwórz bufor, w którym aktualnie byłem. W Vimie |łączy wykonywanie poleceń. Jeśli twój bufor jest aktualny, powyższe można skrócić:%bd | e#

iamnotsam
źródło
Przeważnie działa dobrze. ale czasami %nie może działać jak wszystkie selektory. Czy mógłbyś coś zgadnąć?
Jinyoung Kim,
@JinyoungKim (z [1]) W poleceniu „:% bd” zakres „%” zostanie zastąpiony początkowymi i końcowymi numerami wierszy w bieżącym buforze. Zamiast używać „%” jako zakresu, należy podać liczby dla zakresu. Na przykład, aby usunąć wszystkie bufory, możesz użyć polecenia „: 1,9999bd” [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam
Właśnie sprawdziłem dokument. Zatem zakres „%” zależy od wielu bieżących linii pliku?
Jinyoung Kim,
2
Znalazłem wbudowaną funkcję, bufnr("$")która zwraca ostatni numer bufora. ale nie mam pomysłu na interpolację ciągów znaków, gdy używam w ten sposób :1,bufnr("$")bd. Może .. najlepszym rozwiązaniem byłoby :1,9999bd.
Jinyoung Kim,
2
:help :bdpokazuje :%bdelete " delete all buffers. To %jest dokładnie to, czego chcesz. Używam wariantu twojego rozwiązania: :%bd<CR><C-O>:bd#<CR>spowoduje to usunięcie wszystkich buforów, następnie użyj, <C-O>aby przywrócić pozycję w bieżącym pliku, a następnie, :bd#aby usunąć nienazwany bufor. Spowoduje to zamknięcie wszystkich buforów i pozostanie w tej samej lokalizacji w pliku.
Alejandro
26

Opierając się na odpowiedzi juananruiz.

Następnie wprowadź niewielką zmianę w buforze, który chcesz zachować

:1,1000bd

Polecenie bd(usuwanie bufora) nie usuwa buforów z niezapisanymi zmianami. W ten sposób możesz zachować bieżący (zmieniony) plik na liście buforów.

Edycja: Zauważ, że spowoduje to również usunięcie Twojego NERDTreeBuffer. Możesz go odzyskać za pomocą: NERDTree

cutemachine
źródło
Idealne, krótkie i proste! :)
arkod
50
:% bd to tak naprawdę „wszystko” zamiast 1-1000.
John Tyree
Czy to zależy od set nohiddenustawienia?
Felipe Alvarez
15

Używając

:on[ly][!]

i

:h only
klokop
źródło
29
To zamyka okna, a nie bufory.
ZyX
13
Nadal jest przydatny, ponieważ ludzie mogą googlować w złym terminie i znajdą to. Dziękuję wam obojgu. :)
archgoon
1
@archgoon tak, ale należy podać w odpowiedzi.
andho
10

Zamykanie wszystkich otwartych buforów:

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

Zamykanie wszystkich otwartych buforów oprócz bieżącego :

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

Dodaj tę funkcję .vimrci wywołaj ją za pomocą :call CloseAllBuffersButCurrent().

Mapa wygody:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
mynyml
źródło
Zauważyłem, że wznawiając sesje vima, które przywracają bufory, nie byłem w stanie usunąć buforów przy użyciu powyższego. Zamiast tego musiałem użyć:%bd|e#|bd#
shmup
Najlepsze rozwiązanie Dodałem polecenie, aby ponownie otworzyć NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa
5

Umieszczam to w moim pliku .vimrc

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

następnie leader + ca(zamknij wszystko) zamknij wszystkie bufory oprócz bieżącego.

Co to robi

: w - zapisz bieżący bufor

% bd - zamknij wszystkie bufory

e # - otwórz ostatnio edytowany plik

bd # - zamknij nienazwany bufor

Yulin
źródło
4

Jest wtyczka, która robi dokładnie to i trochę więcej!

Sprawdź close-buffers.vim

Niko Bellic
źródło
1

Oto co robię. Lubię więc utrzymywać pozycję kursora po usunięciu wszystkich buforów, a większość powyższych rozwiązań po prostu ignoruje ten fakt. Myślę też, że ponowne mapowanie polecenia jest lepsze niż wpisanie go, więc tutaj używam <leader>bddo usuwania wszystkich buforów i powrotu do pierwotnej pozycji kursora.

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

%bd = usuń wszystkie bufory.

e# = otwórz ostatni bufor do edycji (który to bufor pracuję).

bd#aby usunąć bufor [Bez nazwy], który jest tworzony podczas używania %bd.

Rura pomiędzy wykonuje tylko jedno polecenie po drugim. Musisz go uciec, używając\|

'" = zachowaj moją pozycję kursora.

0xMH
źródło
0

Lubię 1,100bd( sugerowane przez juananruiz ), który wydaje się działać dla mnie.

Dodałem a quit!do mojego mapowania, aby mi dać

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

To zabija wszystkie bufory i wyłącza Vima, którego najbardziej szukałem.

LazyRiverYogi
źródło
1
Naprawdę nie ma powodu, aby mieć bdqmapowanie, które zamyka wszystkie bufory i wychodzi z vima :q!, kiedy zamiast tego możesz po prostu użyć :qa!. Chyba że coś
przeoczę