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

धन्यवाद! यही वही है जो मैं ढूंढ रहा था। –

संबंधित मुद्दे

 संबंधित मुद्दे