¿Cómo cierro un solo búfer (de muchos) en Vim?

445

Abro varios archivos en Vim, por ejemplo, ejecutando

vim a/*.php

que abre 23 archivos.

Luego hago mi edición y ejecuto lo siguiente dos veces

:q

que cierra todos mis tampones

¿Cómo puede cerrar solo un búfer en Vim?

Léo Léopold Hertz 준영
fuente
99
Tenga en cuenta que puede abrir los archivos en ventanas Vim separadas usando vim -o a/*.php(o -Opara usar ventanas verticales) y evitar la navegación del búfer: este es un excelente método para solo unos pocos archivos, pero con 23 archivos solo tendrán unas pocas líneas / columnas cada.
Cascabel el
1
@Jefromi: ¡Gracias por señalar eso! Nunca he usado la opción -o antes.
Léo Léopold Hertz 준영
Sobre el tema de las divisiones de ventanas. Si ya está en Vim y desea abrir otro archivo en una división: especialmente para horizontal: evsp para vertical.
Lanzafame

Respuestas:

558

Una palabra de precaución: "¡w en bw no significa escritura sino que borra!"

Más de manuales:

: bd

Descargar el búfer [N] (predeterminado: búfer actual) y eliminarlo de la lista de búfer. Si se cambió el búfer, esto falla, a menos que se especifique [!], En cuyo caso se pierden los cambios. El archivo no se ve afectado.

Si sabe lo que está haciendo, también puede usar: bw

: bw

Me gusta |: bdelete |, pero realmente elimina el búfer.

hhh
fuente
44
También la posibilidad de hacer ': M, Nbd' para cerrar los números de búfer M a N. O ': bd N1 N2 ...' donde N # es un número de búfer
nevado
61
El manual dice que solo se use :bwsi "sabes lo que estás haciendo", lo cual yo no, así que supongo que lo usaré :bd.
jberryman
1
Al principio estaba confundido: estaba abriendo una nueva pestaña para cerrar los búferes ... pero al cerrar el búfer en la pestaña (usando una línea recta :bd) también se cierra la pestaña. Lo que probablemente quiere es :bd n .. [m]o :n,mbdpara los números específicos o rango de números para cerrar, que se puede hacer sin mirar a los buffers
JonnyRaa
55
wes la abreviatura de writecomando de acuerdo con el manual de Vim, además, no se menciona ningún "borrado". La descripción del comando ( help write) comienza con "Escribir todo el búfer en el archivo actual".
amn
3
@amn También me confundí, pero quería decir que wen el bwcomando significa borrar que no está hablando sobre el wcomando. Se puso esta advertencia no para que la gente no creía que el bwcomando significaba buffer de escritura (que no significa aniquilación búfer.)
John
351

Si esto no se hace evidente por las respuestas anteriores:

: bd cerrará el búfer actual. Si no quieres tomar la lista de búfer.

RedBlueThing
fuente
44
Antes de encontrar: bd nunca tuvo ningún sentido para mí que la gente no tuviera problemas para hacer un: ls -> escanear en busca de número de documento -> descargar búfer por número. ¿Las personas realmente encuentran esto efectivo?
Svend
3
@Svend para un rango de buffers seguro, pero para uno solitario a: bd es probablemente más efectivo.
Pharaun
10
:bdsolo cierra el búfer mientras que (lo que sea que eso signifique) mientras :bwque también borrará todas las variables y REALMENTE lo eliminará del lsbúfer.
RedX
1
La respuesta de hhh a continuación es más detallada ...
103

Verifique su identificación de búfer usando: búferes

verá una lista de buffers como

1  a.php
2  b.php
3  c.php

si quieres eliminar b.php del buffer

:2bw

si desea eliminar / cerrar todo de los buffers

:1,3bw
ruiseñor2k1
fuente
44
También puede borrar todos los buffers con:% bw
cdleonard el
77
atajo para verificar la identificación del búfer: 2 CTRL-G
nevado
43

En lugar de examinar la salida del comando: ls y eliminar (descargar, borrar ...) un búfer especificando su número, encuentro que usar nombres de archivos es a menudo más efectivo.

Por ejemplo, después de abrir un par de archivos .txt para refrescar mis recuerdos de algún punto fino ... copie y pegue algunas líneas de texto para usar como una plantilla de tipo ... etc. Escribiría lo siguiente:

:bd txt <Tab>

Tenga en cuenta que la cadena coincidente no tiene que estar al comienzo del nombre del archivo.

Lo anterior muestra la lista de nombres de archivos que coinciden con 'txt' en la parte inferior de la pantalla y mantiene el comando: bd que escribí inicialmente intacto, listo para completar.

Aquí hay un ejemplo:

doc1.txt doc2.txt
:bd txt 

Podría retroceder el bit 'txt' y escribir el nombre del archivo que deseo eliminar, pero cuando esto sea realmente conveniente es que no tengo que hacerlo: si presiono la tecla Tab por segunda vez, Vim completa automáticamente mi comando con el primer partido:

:bd doc1.txt

Si quiero deshacerme de este búfer en particular, solo necesito presionar Enter.

Y si el búfer que quiero eliminar es la segunda (tercera ... etc.) coincidencia, solo necesito seguir presionando la tecla Tab para que mi comando: bd recorra la lista de coincidencias.

Naturalmente, este método también se puede usar para cambiar a un búfer dado mediante comandos como: b ..: sb .. etc.

Este enfoque es particularmente útil cuando la opción Vim 'oculta' está configurada, porque la lista de búferes puede volverse bastante grande, cubrir varias pantallas y dificultar la detección del búfer particular que estoy buscando.

Para aprovechar al máximo esta función, probablemente sea mejor leer el siguiente archivo de ayuda de Vim y ajustar el comportamiento de la finalización de la línea de comandos de Tab en consecuencia para que se adapte mejor a su flujo de trabajo:

:help wildmode

El comportamiento que describí anteriormente resulta de la siguiente configuración, que elegí por razones de coherencia para emular la finalización de bash:

:set wildmode=list:longest,full

A diferencia del uso de números de búfer, el mérito de este enfoque es que generalmente recuerdo al menos parte de un nombre de archivo dado que me permite apuntar directamente al búfer en lugar de tener que buscar primero su número a través del comando: ls.

jefe'
fuente
40

Utilizar:

  • :ls - para enumerar buffers
  • :bd#n- para cerrar el búfer donde #n es el número del búfer (use lspara obtenerlo)

Ejemplos:

  • para eliminar el búfer 2:

    :bd2
    
Shaun
fuente
16

También puede asignar las teclas de función siguiente y anterior, haciendo que recorrer los buffers sea muy fácil.

map <F2> :bprevious<CR>
map <F3> :bnext<CR>

de mi vimrc

Ravi
fuente
2

Qué tal si

vim -O a a

De esa manera, puede editar un solo archivo a su izquierda y navegar por todo el directorio a su derecha ... Solo un pensamiento, no la solución ...

Santi
fuente
2

[EDITAR: esta fue una sugerencia estúpida de un tiempo que no conocía a Vim lo suficientemente bien. Por favor, no use pestañas en lugar de tampones; las pestañas son los "diseños de ventana" de Vim]

Tal vez cambiar a usar pestañas?

vim -p a/*.php abre los mismos archivos en pestañas

gty gTcambiar pestañas de un lado a otro

:q cierra solo la pestaña actual

:qa cierra todo y sale

:tabo cierra todo menos la pestaña actual

Leonid Shevtsov
fuente
2
¿Por qué dices que usar pestañas es una sugerencia estúpida? Solo pregunto porque uso pestañas todo el tiempo ...: ^ /
Nate
2
@Nate: decidí dar más detalles sobre ese leonid.shevtsov.me/en/…
Leonid Shevtsov
1
Esa fue una gran publicación, me inspiró a profundizar aún más, ¿has mirado wildmenu? Es similar a lustyjuggler (aunque más simple) pero está integrado (lo cual fue bueno para mí, porque lustyjuggler necesita +ruby, y el vim predeterminado para las naves oneiric de ubuntu -ruby).
Nate
@Nate: sí, estoy usando wildmenu para abrir archivos, pero cuando tienes muchos archivos en el proyecto, simplemente no se escala. Además, el vim-noxpaquete de Ubuntu tiene soporte para Ruby.
Leonid Shevtsov
1

Aquellos que usan un búfer o un complemento de navegación de árbol, como Buffergator o NERDTree, deberán alternar estas divisiones antes de destruir el búfer actual; de lo contrario, enviarán sus divisiones a wonkyville

Yo suelo:

"" Buffer Navigation                                                                                                                                                                                        
" Toggle left sidebar: NERDTree and BufferGator                                                                                                                                                             
fu! UiToggle()                                                                                                                                                                                              
  let b = bufnr("%")                                                                                                                                                                                        
  execute "NERDTreeToggle | BuffergatorToggle"                                                                                                                                                              
  execute ( bufwinnr(b) . "wincmd w" )                                                                                                                                                                      
  execute ":set number!"                                                                                                                                                                                    
endf                                                                                                                                                                                                        
map  <silent> <Leader>w  <esc>:call UiToggle()<cr>   

Donde " NERDTreeToggle" en esa lista es lo mismo que escribir :NERDTreeToggle. Puede modificar esta función para integrarla con su propia configuración.

Nueva Alejandría
fuente
para esto, el complemento bbye es perfecto y conserva el diseño de su ventana cuando usa :bdeleteo :bwipeout. Mira mi respuesta .
Wolfson
0

Cerrar el búfer sin cerrar la ventana.

Si desea cerrar un búfer sin destruir el diseño de su ventana (diseño actual basado en divisiones), puede usar un complemento como bbye . En base a esto, solo puede usar

:Bdelete (instead of :bdelete)
:Bwipeout (instead of :bwipeout)

O simplemente cree una asignación en su .vimrcpara un acceso más fácil como

:nnoremap <Leader>q :Bdelete<CR>

Ventaja sobre vim's: bdelete y: bwipeout

De la documentación del complemento :

  • Cerrar y quitar el búfer.
  • Mostrar otro archivo en esa ventana.
  • Muestre un archivo vacío si no tiene otros archivos abiertos.
  • No deje buffers inútiles [sin archivo] si decide editar otro archivo en esa ventana.
  • Funciona incluso si un archivo está abierto en varias ventanas.
  • Trabaja bien con varios exploradores de buffer y tabbars.

: bdelete vs: bwipeout

De la documentación del complemento :

Vim tiene dos comandos para cerrar un búfer: :bdeletey :bwipeout. El primero elimina el archivo de la lista de búfer, borra sus opciones, variables y asignaciones. Sin embargo, permanece en el jumplist, por lo Ctrl-oque lo lleva de regreso y vuelve a abrir el archivo. Si eso no es lo que quieres, usa :bwipeoutel equivalente de Bbye :Bwipeoutdonde lo habrías usado :bdelete.

Wolfson
fuente