2011-07-01 15 views
15

Tengo algo así como 120 búferes abiertos en Vim en este momento. Aproximadamente el 50% de estos almacenamientos intermedios son archivos vacíos. Me gustaría usar de alguna manera bufdo! para cerrar todos los buffers que están vacíos. ¿Hay una manera que puedo decir:Eliminando todos los búferes vacíos en VIM

bufdo! (something) 

Dónde (something) es un comando condicional que bdelete s el búfer si la longitud/tamaño de búfer que es cero?

+0

Tenga en cuenta que el comando ': bufdo'-argument no debe agregar o eliminar almacenamientos intermedios (vea': help: bufdo'). –

Respuesta

6

Lo único que se me ocurre es hacer una función que informe si el buffer está vacío o no. Algo como esto:

function! BufferIsEmpty() 
    if line('$') == 1 && getline(1) == '' 
     return 1 
    else 
     return 0 
    endif 
endfunction 

" Test it like this: 
echo BufferIsEmpty() 
+2

Condición similar: 'line2byte (línea (" $ ") + 1) <= 2'. – ZyX

+0

@ZyX: ¿Por qué no 'line2byte (line ('$')) <2'? –

+0

@ib 'vim -u NONE -N -c 'call setline (". "," Abc ") | echo line2byte (line ("$")) '' – ZyX

12

Dado que no se permite a afectar a la lista de buffers con un comando :bufdo -argumento (ver :help :bufdo), tenemos que utilizar más script de Vim prolijo todavía bastante sencillo.

Ésta función enumera todos los números de amortiguación existente y elimina aquellos que no tienen un nombre (aparece como [No Name] en la interfaz ) y los cambios no guardados. (Esto último está garantizado por el comando :bdelete que, sin el signo !, no elimina un búfer modificado).

function! DeleteEmptyBuffers() 
    let [i, n; empty] = [1, bufnr('$')] 
    while i <= n 
     if bufexists(i) && bufname(i) == '' 
      call add(empty, i) 
     endif 
     let i += 1 
    endwhile 
    if len(empty) > 0 
     exe 'bdelete' join(empty) 
    endif 
endfunction 

Si desea eliminar buffers vacíos por completo, incluyendo los descargadas, considere (con cuidado!) Reemplazando bdelete con bwipeout (ver :help :bd, :help :bw).

Para probar el contenido de un búfer para eliminar, use la función getbufline(). Por ejemplo, para estar absolutamente seguro de que el búfer no contiene texto, modifique la instrucción if dentro del bucle while de la siguiente manera.

if bufloaded(i) && bufname(i) == '' && getbufline(i, 1, 2) == [''] 

Tenga en cuenta que bufexists() se cambia a bufloaded() aquí. Es necesario porque es posible obtener el contenido solo de los almacenamientos intermedios que están cargados (para los almacenamientos intermedios descargados getbufline() devuelve lista vacía independientemente de su contenido).

9

He estado usando la siguiente función para hacer el trabajo:

function! s:CleanEmptyBuffers() 
    let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && empty(bufname(v:val)) && bufwinnr(v:val)<0 && !getbufvar(v:val, "&mod")') 
    if !empty(buffers) 
     exe 'bw ' . join(buffers, ' ') 
    endif 
endfunction 

Es muy similar a la de IB versión excepto que sale de la memoria intermedia quickfix solos (siempre que cualquier otro buffer vacío que se muestra en una ventana)

Cuestiones relacionadas