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/plugin
katalogu, a następnie użyj :BufOnly
polecenia, 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
bd
zamknię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 range
ponieważ niektóre bufory z tego zakresu faktycznie nie istnieją. Do niedawna to ignorowało.
:ls
najwię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 :bd
pokazuje :%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 nohidden
ustawienia?
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ę .vimrc
i 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>bd
do 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.
bdq
mapowanie, 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 )