微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vim – 如何调整窗口大小以适应,仅考虑逻辑行?

我正在寻找一个可以从地图调用函数.我们的想法是调整窗口大小以适应缓冲区内容.这不是太难:

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行的块只计为一行.

有没有人知道一种方便的方法来获得这个’逻辑行计数’,而不必手动计算它?如果我确实需要手动执行此操作,是否还有其他任何我会丢失的情况会导致行以可能不同的行数表示?

解决方法

对于任何有兴趣的人,我放弃了试图找到一个简单的解决方案.下面是我最终得到的代码.它考虑了几个明显的边缘情况;我相信其他人仍然存在.我们非常欢迎提出改进建议.

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,"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,'$'])"))
        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 "}}}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐