2010-11-28 12 views
20

Si tengo 2 búferes divididos horizontal/verticalmente y quiero cerrar uno de ellos, pero no quiero cerrar una ventana. Quiero mantener los lugares de ventanas divididas son los mismos que antes de cerrar el búfer.Vim cerrar el búfer pero no dividir la ventana

Si presiono: bd, la ventana en la que se cerró el búfer también se cerró.

+0

posible duplicado de [Vim: Borrar búfer sin perder la ventana dividida] (http: // stackoverflow.com/questions/4465095/vim-delete-buffer-without-losing-the-split-window) – thirtythreeforty

Respuesta

24

Me gusta @RusAlex No me gustan los complementos. También me gusta saber qué código introduzco realmente.

nmap ,d :b#<bar>bd#<CR>

En resumen esto se suma una asignación de teclas a modo normal de vim espera de secuencia de teclas ,d. Cuando se ejecuta, cambia a un búfer abierto previamente e intenta eliminar el búfer al que se alejó.

Eliminar un búfer fuera de pantalla mantiene la pantalla dividida como está.

El comando consta de tres partes separadas por espacios:

  • nmap - añadir/cambiar asignación de teclas para el modo normal
  • ,d - secuencia de teclas para reaccionar a; primero , (coma), entonces d
  • :b#<bar>bd#<CR> - secuencia de teclas para ejecutar

El comando a ejecutar consta de cinco partes:

  • : - cambiar vim a modo de línea de comandos
  • b# - cambie la ventana al buffer previamente abierto
  • <bar> - espera un comando de seguimiento; representa | (carácter de tubería); utilizado para encadenar comandos
  • bd# - eliminar el búfer previamente abierta, es decir, la memoria intermedia acaba de cambiar lejos de
  • <CR> - ejecutar el comando (s); representa el retorno de carro, básicamente las teclas Return o Enter

El comando está en el formato que se utiliza en un archivo de configuración como ~/.vimrc.Si desea agregar la asignación de dentro de vim antepones : (colon) - la asignación a continuación, se perderá al salir de vim:

:nmap ,d :b#<bar>bd#<CR>

Cuando vim abierta por lo general es en modo normal a diferencia de los modos insertar (indicado en la parte inferior de la pantalla por -- INSERT -- después de presionar i), visual y así sucesivamente. El n en nmap especifica la asignación de teclas que se agregará solo al modo normal. Encuentra más información sobre las asignaciones de here

Notas importantes:

  • b# cambiará al búfer en uso si se trata de la memoria intermedia sólo se conoce.
  • b# puede cambiar a un búfer oculto/cerrado, p. el que acaba de cerrar presionando ,d.
  • bd# cerrará el búfer actual si es el único búfer conocido que no separe la pantalla y le deje un búfer vacío.
  • bd# fallará si el búfer desactivado es un búfer oculto/cerrado.
  • bd# aún no se dividirá si después de cambiar otra ventana muestra el búfer para cerrar.

Notas adicionales:

  • :windo b# cambiará todas las ventanas en el búfer previamente abierta. No estoy seguro de cómo combinar con bd.
  • <CR> se pueden omitir, en cuyo caso tiene que presionar manualmente Return o Enter para ejecutar.
  • :nmap , muestra todas las asignaciones de modo normal comenzando con ,.
  • :ls listas abren búferes.
2

¿Desea eliminar el almacenamiento intermedio pero mantener la división? Necesitará un nuevo búfer, entonces: new lo hará por usted, creando un búfer para un archivo nuevo/vacío, pero igual tendrá que eliminar el búfer/ventana anterior. En vim, una ventana es una ventana gráfica en un búfer, por lo que si quiere una ventana vacía, necesita un búfer vacío.

+0

he hecho una buena elección: – RusAlex

+0

nmap, d: b # bd # RusAlex

4

Tendré que verificar en mi computadora de trabajo, pero creo que el script que estoy usando para esto es BufClose.

+14

no me gustan los complementos. gustaría encontrar una solución dentro de vim. tengo un mínimo de un recuento de plugins y también he encontrado lo que necesito en: nmap, d: b # bd # RusAlex

+2

Rus, creo que debería haber contestado su propio puesto y luego elegido como correcta. De todos modos, su comando: b # bd # es exactamente lo que estoy buscando también. ¡Gracias por publicar! –

+0

Lo siento por la pregunta tonta, pero ¿qué significa ''? –

9

Es imposible tener una ventana vacía en vim, pero solo puede crear un nuevo archivo vacío en la ventana actual usando :enew.

+0

nmap, d: b # bd # RusAlex

0

Aquí es un poco de solución:

function! CloseSplitOrDeleteBuffer() 
    let curNr = winnr() 
    let curBuf = bufnr('%') 
    wincmd w     " try to move on next split 
    if winnr() == curNr   " there is no split" 
    exe 'bdelete' 
    elseif curBuf != bufnr('%') " there is split with another buffer 
    wincmd W     " move back" 
    exe 'bdelete' 
    else      " there is split with same buffer" 
    wincmd W 
    wincmd c 
    endif 
endfunction 


nnoremap <silent> Q :call CloseSplitOrDeleteBuffer()<CR> 
1

versión @RusAlex + activar el búfer al final necesita si búfer de borrado dos veces.

nmap ,d :b#<bar>bd#<bar>b<CR> 
1

Aquí hay una variación en la respuesta proporcionada @zenbro que mantiene todas sus ventanas y pestañas abiertas (split), incluso si el búfer se cierra es el último.

La función cambia todas las ventanas que apuntan al búfer en uso (que está cerrando) al siguiente búfer (o un nuevo búfer si el búfer actual es el último).

function! CloseBuffer() 
    let curBuf = bufnr('%') 
    let curTab = tabpagenr() 
    exe 'bnext' 

    " If in last buffer, create empty buffer 
    if curBuf == bufnr('%') 
     exe 'enew' 
    endif 

    " Loop through tabs 
    for i in range(tabpagenr('$')) 
     " Go to tab (is there a way with inactive tabs?) 
     exe 'tabnext ' . (i + 1) 
     " Store active window nr to restore later 
     let curWin = winnr() 
     " Loop through windows pointing to buffer 
     let winnr = bufwinnr(curBuf) 
     while (winnr >= 0) 
      " Go to window and switch to next buffer 
      exe winnr . 'wincmd w | bnext' 
      " Restore active window 
      exe curWin . 'wincmd w' 
      let winnr = bufwinnr(curBuf) 
     endwhile 
    endfor 

    " Close buffer, restore active tab 
    exe 'bd' . curBuf 
    exe 'tabnext ' . curTab 
endfunction 

Para trazarlo:

map <silent> <F4> :call CloseBuffer()<cr> 
Cuestiones relacionadas