Odpowiedzi:
Możesz użyć tego skryptu z vim.org:
http://www.vim.org/scripts/script.php?script_id=1071
Po prostu umieść go w swoim .vim/pluginkatalogu, a następnie użyj :BufOnlypolecenia, aby zamknąć wszystkie bufory oprócz aktywnego. Możesz również zmapować go w dowolnym miejscu w swoim .vimrc.
Źródło w Github (przez vim-scripts mirror): https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim
Spróbuj tego
bufdo bd
bufdo uruchamia polecenie dla wszystkich buforów
bdzamknięciu samego polecenia vim; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
: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).
Byłem w stanie zrobić to tak łatwo:
:%bd|e#
:%bd|e#
%bd= usuń wszystkie bufory. e#= otwórz ostatni bufor do edycji. Rura pomiędzy wykonuje tylko jedno polecenie po drugim.
%bd|e#|bd#aby usunąć utworzony [No Name]bufor.
command! BufOnly silent! execute "%bd|e#|bd#"
|:map <leader>o :%bd\|e#<cr>
Jeśli nie obchodzi Cię obecna, łatwiej jest zrobić coś takiego (nie wymaga skryptu):
1,100bd
nnoremap <leader>bd :%bd | NERDTree<cr>
E16: Invalid rangeponieważ niektóre bufory z tego zakresu faktycznie nie istnieją. Do niedawna to ignorowało.
: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.
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#
%nie może działać jak wszystkie selektory. Czy mógłbyś coś zgadnąć?
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.
: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.
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
set nohiddenustawienia?
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>
:%bd|e#|bd#
nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
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
Jest wtyczka, która robi dokładnie to i trochę więcej!
Sprawdź close-buffers.vim
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.
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.
bdqmapowanie, które zamyka wszystkie bufory i wychodzi z vima :q!, kiedy zamiast tego możesz po prostu użyć :qa!. Chyba że coś
A może po prostu:
ctrl-w o
(dzięki https://thoughtbot.com/blog/vim-splits-move-faster-and-more-naturally )