2012-02-05 11 views
5

Sto cercando di scrivere una funzione che posso chiamare da una mappa. L'idea è di ridimensionare una finestra per adattarla al contenuto del buffer. Questo non è troppo difficile:Come ridimensionare una finestra per adattarla, prendendo in considerazione solo le linee logiche?

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 "}}} 

Vorrei, tuttavia, come la funzione di prendere linee logiche in considerazione nel calcolo l'altezza (io non sono eccessivamente preoccupato di larghezza).

Ad esempio, una linea che ha spostato (a causa di :set wrap) conterà come due o più righe. Un blocco di 37 linee che sono piegate conterebbe solo come uno.

Qualcuno sa di un modo conveniente per ottenere questo "conteggio logico" senza dover provare a calcolarlo manualmente? Se devo farlo manualmente, ci sono altri casi che mi mancano che potrebbero far rappresentare una linea con un numero potenzialmente diverso di linee?

risposta

2

Per chiunque fosse interessato, ho rinunciato a cercare di trovare una soluzione semplice a questo. Di seguito è riportato il codice con cui ho finito. Prende in considerazione un paio di casi limite evidenti; Sono sicuro che restano gli altri. Suggerimenti per il miglioramento sono molto graditi.

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

Grazie! Questo è esattamente quello che stavo cercando. –

Problemi correlati