vim – 如何调整窗口大小以适应,仅考虑逻辑行?
发布时间:2020-12-15 22:49:55 所属栏目:安全 来源:网络整理
导读:我正在寻找一个可以从地图调用的函数.我们的想法是调整窗口大小以适应缓冲区内容.这不是太难: fu! ResizeWindow(vert) "{{{ if a:vert let longest = max(map(range(1,line('$')),"virtcol([v:val,'$'])")) exec "vertical resize " . (longest+4) else exe
我正在寻找一个可以从地图调用的函数.我们的想法是调整窗口大小以适应缓冲区内容.这不是太难:
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 "}}} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |