Vim: cierra todos los buffers menos este


196

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


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


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#

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

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#


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


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

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>

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



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.


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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.