Vim: cierra todos los buffers menos este

196

¿Cómo puedo cerrar todos los buffers en Vim excepto el que estoy editando actualmente?

Rafid
fuente
1
Busco este enlace
klokop

Respuestas:

171

Prueba esto

bufdo bd

bufdo ejecuta el comando para todos los buffers

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

gayavat
fuente
Esto no cierra el búfer NERDTree.
Uri
NERDTree está cerrado si el foco está en el panel del árbol nerd
gayavat
2
Es posible que desee cerrar NERDTree antes de hacer esto para evitar que el bdcomando cierre el vim mismo; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
lvarayut
11
La documentación advierte que el argumento de :bufdo'no debe eliminar buffers o agregar buffers a la lista de buffer'. Entonces, si esta solución funciona, funciona por accidente ... y a menudo no funciona para mí (cambia a un búfer diferente).
glts
10
Esto cierra todos los búferes para mí, que no es lo que hacen las preguntas. (MacVim versión 8.0.1207)
Michael Leonard
143

Pude hacer esto fácilmente así:

:%bd|e#
OldTimeGuitarGuy
fuente
44
Esta es una buena respuesta. Hace que BufOnly se sienta un poco exagerado (quiero decir, ¿un complemento completo?) A menos que esté usando la función de pasar argumentos de BufOnly. Todo lo que realmente quiero hacer es:%bd|e#
shmup
41
@jorgeh %bd= eliminar todos los búferes. e#= abre el último búfer para editar. La tubería intermedia solo ejecuta un comando tras otro.
OldTimeGuitarGuy
20
@Jared Puede usar %bd|e#|bd#para eliminar el [No Name]búfer que se crea.
kshenoy
12
Maravilloso. Entonces aquí tienes lo único para lo que he usado el complemento BufOnly, destilado a un solo comando:command! BufOnly silent! execute "%bd|e#|bd#"
shmup
44
@Finn necesitas escapar |:map <leader>o :%bd\|e#<cr>
Halil Özgür
57

Si no te importa el actual, es más simple hacer algo como (sin necesidad de script):

1,100bd
juananruiz
fuente
44
También cerrará el búfer nerdtree.
Afshin Mehrabani
Enfrenté algunos problemas al usar este comando cuando NERDTree está habilitado. Recomiendo usar el complemento BufOnly.vim como lo menciona @VoY.
moeabdol
1
Hice el siguiente mapeo que explica la eliminación del búfer NERDTree:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri
55
Utilicé esto durante mucho tiempo, pero ahora lo tengo E16: Invalid rangeporque algunos de los buffers en el rango no existen. Estaba ignorando eso hasta hace poco.
Jon
3
@ Jon Verifique :lspara ver el búfer más grande que realmente tiene abierto, y establezca su rango en eso (es decir, si su búfer más alto es 22, entonces :1,22bd). Recibí el mismo error hasta que hice eso.
Nairou
51

hago esto

:w | %bd | e#

Mi favorito si solo quiero que mi búfer actual se abra y cierre todos los demás.

Cómo funciona: primero escriba los cambios actuales del búfer, luego cierre todos los búferes abiertos, luego vuelva a abrir el búfer en el que estaba actualmente. En Vim, las |cadenas unen la ejecución de comandos. Si su búfer está actualizado, lo anterior se puede acortar a:%bd | e#

iamnotsam
fuente
En su mayoría funciona bien. pero a veces %no puede funcionar como todo selector. ¿Puedes adivinar algo?
Jinyoung Kim
@JinyoungKim (de [1]) En el comando ":% bd", el rango '%' se reemplazará con los números de línea inicial y final en el búfer actual. En lugar de usar '%' como rango, debe especificar números para el rango. Por ejemplo, para eliminar todas las memorias intermedias, puede usar el comando ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam
Acabo de revisar el documento. Entonces, ¿el rango '%' depende de una serie de líneas de archivo actuales?
Jinyoung Kim
2
Encontré una función incorporada bufnr("$")que devuelve el último número de búfer. pero no tengo idea de interpolar en cadena cuando lo uso así :1,bufnr("$")bd. Quizás ... la mejor solución sería :1,9999bd.
Jinyoung Kim
2
:help :bdmuestra :%bdelete " delete all buffers. Entonces %es exactamente lo que quieres. Utilizo una variante de su solución: :%bd<CR><C-O>:bd#<CR>esto eliminará todos los búferes, luego los usaré <C-O>para restaurar la posición en el archivo actual, y luego :bd#eliminaré el búfer sin memoria. Esto cierra todos los búferes y lo deja en la misma ubicación en el archivo.
Alejandro
25

Sobre la base de la respuesta de juananruiz.

Haga un pequeño cambio en el búfer que desea mantener, luego

:1,1000bd

El comando bd(eliminar búfer) no eliminará ningún búfer con cambios no guardados. De esta manera, puede mantener el archivo actual (modificado) en la lista de búfer.

Editar: Tenga en cuenta que esto también eliminará su NERDTreeBuffer. Puede recuperarlo con: NERDTree

linda maquina
fuente
Perfecto, corto y simple! :)
arkod
49
:% bd es en realidad "todos" en lugar de 1-1000.
John Tyree
¿Esto depende de set nohiddenque se establezca?
Felipe Alvarez
15

Mediante el uso

:on[ly][!]

y

:h only
klokop
fuente
27
Esto cierra ventanas, no amortiguadores.
ZyX
13
Sigue siendo útil, ya que las personas pueden buscar en Google el término equivocado y encontrarán esto. Así que gracias a los dos. :)
archgoon
1
@archgoon, sí, pero debe especificarse en la respuesta.
andho
10

Cierre de todos los tampones abiertos:

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

Cerrar todos los buffers abiertos excepto el actual :

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

Agregue esta función .vimrcy llámela usando :call CloseAllBuffersButCurrent().

Mapa de conveniencia:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
mynyml
fuente
Me di cuenta de que al reanudar las sesiones de vim, que restaura los búferes, ya no podía eliminar los búferes con lo anterior. En cambio, tuve que usar:%bd|e#|bd#
shmup
Mejor solución. Agregué un comando para volver a abrir NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa
5

Puse esto en mi archivo .vimrc

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

entonces su leader + ca(cerrar todo) cierra todos los búferes excepto el actual.

Lo que hace es

: w - guardar el búfer actual

% bd: cierra todos los búferes

e # - abre el último archivo editado

bd #: cierra el búfer sin nombre

Yulin
fuente
4

¡Hay un complemento que hace exactamente esto y un poco más!

Echa un vistazo a close-buffers.vim

Niko Bellic
fuente
1

Esto es lo que hago. Por lo tanto, me gusta mantener la posición del cursor después de eliminar todos los búferes y la mayoría de las soluciones anteriores simplemente ignoran este hecho. También creo que reasignar el comando es mejor que escribirlo, así que aquí uso <leader>bdpara eliminar todos los búferes y volver a mi posición original del cursor.

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

%bd = eliminar todos los búferes.

e# = abre el último búfer para editar (¿Cuál es el búfer en el que estoy trabajando?).

bd#para eliminar el búfer [Sin nombre] que se crea cuando lo usa %bd.

La tubería intermedia solo ejecuta un comando tras otro. Tienes que escapar de eso usando\|

'" = mantener la posición de mi cursor.

0xMH
fuente
0

Me gusta 1,100bd( sugerido por juananruiz ) que parece funcionar para mí.

Agregué una quit!a mi mapeo para darme

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

Esto mata todos los amortiguadores y apaga a Vim, que es lo que estaba buscando principalmente.

LazyRiverYogi
fuente
1
Realmente no hay ninguna razón para que tenga el bdqmapeo que cierra todos los búferes y sale de vim :q!, cuando en su lugar puede usarlo :qa!. A menos que esté pasando por alto algo
shmup