2012-02-05 13 views
5

我正在尋找一個函數,我可以從地圖中調用。這個想法是調整窗口大小以適應緩衝區內容。這是不是太困難:如何調整窗口大小以適應只考慮邏輯線?

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

我會,但是,像函數來計算高度時,採取合理的線路考慮(我並不過於擔心寬度)。

例如,已包裝的行(由於:set wrap)會計爲兩行或更多行。一條37條摺疊的線路只能算作一條線路。

有沒有人知道一個方便的方法來獲得這個'邏輯行數'而不必手動計算它?如果我確實需要手動執行此操作,是否還有其他任何我錯過的情況會導致線條被表示爲可能不同數量的線條?

回答

2

對於任何有興趣的人,我放棄了試圖找到一個簡單的解決方案。以下是我結束的代碼。它考慮了一些明顯的邊緣案例;我相信其他人仍然存在。改進建議非常受歡迎。

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

謝謝!這正是我所期待的。 – 2013-05-18 14:16:16

相關問題