2012-02-05 16 views
5

Tôi đang tìm cách viết một chức năng mà tôi có thể gọi từ bản đồ. Ý tưởng là để thay đổi kích thước một cửa sổ để phù hợp với nội dung bộ đệm. Điều này không quá khó khăn:Làm cách nào để thay đổi kích thước cửa sổ cho vừa, chỉ tính đến các đường logic?

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

Tuy nhiên, tôi muốn tính các đường logic khi tính chiều cao (Tôi không quá lo lắng về chiều rộng). Ví dụ, một dòng đã bọc (do :set wrap) sẽ được tính là hai hoặc nhiều dòng. Một khối gồm 37 dòng được gấp lại sẽ chỉ được tính là một.

Có ai biết cách thuận tiện để nhận 'số dòng logic' này mà không phải thử và tính toán thủ công không? Nếu tôi cần phải làm điều này bằng tay là có bất kỳ trường hợp nào khác mà tôi đang thiếu mà có thể gây ra một dòng được đại diện với một số dòng khác nhau tiềm năng?

Trả lời

2

Đối với bất kỳ ai quan tâm, tôi đã từ bỏ việc cố gắng tìm một giải pháp đơn giản cho điều này. Dưới đây là mã tôi đã kết thúc với. Nó đưa vào tài khoản một vài trường hợp cạnh rõ ràng; Tôi chắc rằng những người khác vẫn còn. Đề xuất cải tiến rất được hoan nghênh.

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

Cảm ơn! Đó chính xác là những gì tôi đang tìm kiếm. –

Các vấn đề liên quan