Risposte:
È possibile utilizzare questo script da vim.org:
http://www.vim.org/scripts/script.php?script_id=1071
Basta inserirlo nella .vim/plugin
directory e quindi utilizzare il :BufOnly
comando per chiudere tutti i buffer tranne quello attivo. Potresti anche mapparlo altrove nel tuo .vimrc
.
Fonte su Github (tramite mirror vim-scripts): https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim
Prova questo
bufdo bd
bufdo esegue il comando per tutti i buffer
bd
comando chiuda il vim stesso; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>
.
Sono stato in grado di farlo abbastanza facilmente in questo modo:
:%bd|e#
:%bd|e#
%bd
= elimina tutti i buffer. e#
= apre l'ultimo buffer per la modifica. La pipe in mezzo fa solo un comando dopo l'altro.
%bd|e#|bd#
per eliminare il [No Name]
buffer che viene creato.
command! BufOnly silent! execute "%bd|e#|bd#"
|
:map <leader>o :%bd\|e#<cr>
Se non ti interessa quello attuale, è più semplice fare qualcosa del genere (non è necessario alcun copione):
1,100bd
nnoremap <leader>bd :%bd | NERDTree<cr>
E16: Invalid range
perché alcuni dei buffer nell'intervallo in realtà non esistono. Lo ignorava fino a poco tempo fa.
:ls
per vedere il buffer più grande che hai effettivamente aperto, e imposta il tuo intervallo su quello (cioè se il tuo buffer più alto è 22, allora :1,22bd
). Ho avuto lo stesso errore fino a quando non l'ho fatto.
lo faccio
:w | %bd | e#
Il mio preferito se voglio solo aprire il mio buffer corrente e chiudere tutti gli altri.
Come funziona: prima scrivi le modifiche del buffer corrente, quindi chiudi tutti i buffer aperti, quindi riapri il buffer su cui mi trovavo attualmente. In Vim, le |
catene eseguono insieme i comandi. Se il buffer è aggiornato, è possibile abbreviare quanto sopra:%bd | e#
%
non può funzionare come tutti i selettori. Potresti indovinare qualcosa?
bufnr("$")
che restituisce l'ultimo numero di buffer. ma non ho idea di interpolare la stringa quando uso in questo modo :1,bufnr("$")bd
. Forse .. la migliore soluzione sarebbe :1,9999bd
.
:help :bd
spettacoli :%bdelete " delete all buffers
. Quindi %
è esattamente quello che vuoi. Uso una variante della tua soluzione: :%bd<CR><C-O>:bd#<CR>
questo eliminerà tutti i buffer, quindi userà <C-O>
per ripristinare la posizione nel file corrente, quindi :bd#
per rimuovere il buffer senza nome. Questo chiude tutti i buffer e ti lascia nella stessa posizione nel file.
Basandosi sulla risposta di juananruiz.
Apporta quindi una piccola modifica al buffer che desideri conservare
:1,1000bd
Il comando bd
(eliminazione buffer) non eliminerà alcun buffer con modifiche non salvate. In questo modo è possibile mantenere il file corrente (modificato) nell'elenco dei buffer.
Modifica: si noti che ciò eliminerà anche NERDTreeBuffer. Puoi riaverlo con: NERDTree
set nohidden
da essere impostato?
Chiusura di tutti i buffer aperti:
silent! execute "1,".bufnr("$")."bd"
Chiusura di tutti i buffer aperti ad eccezione di quello corrente :
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
Aggiungi questa funzione .vimrc
e chiamala usando :call CloseAllBuffersButCurrent()
.
Mappa della convenienza:
nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
:%bd|e#|bd#
nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
L'ho inserito nel mio file .vimrc
nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>
quindi il tuo leader + ca
(chiudi tutto) chiudi tutti i buffer tranne quello corrente.
Quello che fa è
: w - salva il buffer corrente
% bd - chiude tutti i buffer
e # - apre l'ultimo file modificato
bd # - chiude il buffer senza nome
C'è un plugin che fa esattamente questo e un po 'di più!
Dai un'occhiata a close-buffers.vim
Ecco cosa faccio. Quindi mi piace mantenere la posizione del cursore dopo aver rimosso tutti i buffer e la maggior parte delle soluzioni sopra ignora questo fatto. Penso anche che rimappare il comando sia meglio che digitarlo, quindi qui uso <leader>bd
per rimuovere tutti i buffer e tornare alla posizione del cursore originale.
noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"
%bd
= elimina tutti i buffer.
e#
= apri l'ultimo buffer per la modifica (qual è il buffer su cui sto lavorando).
bd#
per eliminare il buffer [Nessun nome] che viene creato durante l'utilizzo %bd
.
La pipe in mezzo fa solo un comando dopo l'altro. Devi scappare però usando\|
'"
= mantieni la posizione del cursore.
Mi piace 1,100bd
( suggerito da Juanuanruiz ) che sembra funzionare per me.
Ho aggiunto a quit!
alla mia mappatura per darmi
nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>
Questo uccide tutti i buffer e spegne Vim, che è quello che stavo cercando principalmente.
bdq
mappatura che chiude tutti i buffer ed esce da VIM :q!
, quando invece puoi semplicemente usare :qa!
. A meno che non stia trascurando qualcosa
Che ne dici di:
ctrl-w o
(grazie a https://thoughtbot.com/blog/vim-splits-move-faster-and-more-naturally )