我正在寻找一个可以从地图调用的函数.我们的想法是调整窗口大小以适应缓冲区内容.这不是太难:
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 "}}}
Run Code Online (Sandbox Code Playgroud)
但是,我会喜欢在计算高度时考虑逻辑线的功能(我并不过分担心宽度).
例如,已包装(由于: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, 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 "}}}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
441 次 |
最近记录: |