2012-02-05 14 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

相关问题