2012-02-05 6 views
5

Estoy buscando escribir una función a la que pueda llamar desde un mapa. La idea es redimensionar una ventana para que se ajuste al contenido del buffer. Esto no es demasiado difícil:¿Cómo cambiar el tamaño de una ventana para que encaje, teniendo en cuenta solo las líneas lógicas?

fu! ResizeWindow(vert) "{{{ 
    if a:vert 
     let longest = max(map(range(1, line('$')), "virtcol([v:val, '$'])")) 
     exec "vertical resize " . (longest+4) 
    else 
     exec 'resize ' . line('$') 
     1 
    endif 
endfu "}}} 

Quisiera, sin embargo, al igual que la función de tomar las líneas lógicas en cuenta al calcular la altura (no estoy demasiado preocupado por la anchura).

Por ejemplo, una línea que se ha envuelto (debido a :set wrap) se contará como dos o más líneas. Un bloque de 37 líneas que están dobladas solo contaría como una.

¿Alguien sabe de una forma conveniente de obtener este 'recuento de líneas lógicas' sin tener que intentar calcularlo manualmente? Si necesito hacer esto manualmente, ¿hay algún otro caso que me falta que pueda representar una línea con un número potencialmente diferente de líneas?

Respuesta

2

Para cualquier persona interesada, dejé de intentar encontrar una solución simple para esto. A continuación está el código con el que terminé. Tiene en cuenta un par de casos obvios; Estoy seguro de que otros se quedan. Sugerencias para mejorar son bienvenidas.

fu! Sum(vals) "{{{ 
    let acc = 0 
    for val in a:vals 
     let acc += val 
    endfor 
    return acc 
endfu "}}} 
fu! LogicalLineCounts() "{{{ 
    if &wrap 
     let width = winwidth(0) 
     let line_counts = map(range(1, line('$')), "foldclosed(v:val)==v:val?1:(virtcol([v:val, '$'])/width)+1") 
    else 
     let line_counts = [line('$')] 
    endif 
    return line_counts 
endfu "}}} 
fu! LinesHiddenByFoldsCount() "{{{ 
    let lines = range(1, line('$')) 
    call filter(lines, "foldclosed(v:val) > 0 && foldclosed(v:val) != v:val") 
    return len(lines) 
endfu "}}} 
fu! AutoResizeWindow(vert) "{{{ 
    if a:vert 
     let longest = max(map(range(1, line('$')), "virtcol([v:val, '$'])")) 
     exec "vertical resize " . (longest+4) 
    else 
     let line_counts = LogicalLineCounts() 
     let folded_lines = LinesHiddenByFoldsCount() 
     let lines  = Sum(line_counts) - folded_lines 
     exec 'resize ' . lines 
     1 
    endif 
endfu "}}} 
+0

Gracias! Eso es exactamente lo que estaba buscando. –

Cuestiones relacionadas