2012-02-22 11 views
22

विम में, मैं अक्सर अपने आप को एक फ़ाइल में पिछले या अगले गुना के लिए कूद करने के लिए एक त्वरित zकश्मीर या zजे करना चाहते हैं। समस्या यह है कि, मैं अक्सर सभी खुले फ़ोल्डरों को छोड़ना चाहता हूं, और बस निकटतम बंद फ़ोल्डर पर जाएं।क्या विम में बंद फ़ोल्डरों पर कूदना संभव है?

क्या ऐसा करने का कोई तरीका है? मुझे मैन्युअल में कोई अंतर्निहित कीमैप नहीं दिखता है।

उत्तर

22

मुझे वर्णित व्यवहार को लागू करने वाले निम्नलिखित मैपिंग का प्रस्ताव दें।

nnoremap <silent> <leader>zj :call NextClosedFold('j')<cr> 
nnoremap <silent> <leader>zk :call NextClosedFold('k')<cr> 
function! NextClosedFold(dir) 
    let cmd = 'norm!z' . a:dir 
    let view = winsaveview() 
    let [l0, l, open] = [0, view.lnum, 1] 
    while l != l0 && open 
     exe cmd 
     let [l0, l] = [l, line('.')] 
     let open = foldclosed(l) < 0 
    endwhile 
    if open 
     call winrestview(view) 
    endif 
endfunction 
+0

उत्कृष्टता। एक जादू की तरह काम करता है। बहुत धन्यवाद! – David

+0

@ डेविड: धन्यवाद! मैंने जंपिंग लूप को सरल बनाने के लिए कोड पर एक रिफैक्टरिंग की है और वांछित दिशा में कोई बंद गुना नहीं होने पर कर्सर को जगह में रखना है। (बाद वाला व्यवहार 'zj'/'zk' आदेशों के अनुरूप होता है जब कोई गुना नीचे/ऊपर नहीं पाया जा सकता है।) –

+0

@ib। क्या आप कृपया बदली गई स्क्रिप्ट प्रदान कर सकते हैं? –

-1

नहीं, ऐसा करने के लिए विधि में एक बिल्ड (जहां तक ​​मुझे पता है) नहीं है। दिलचस्प विचार, यद्यपि।

अगर मैं इस समय कुछ समय के लिए किया था, मैं यह करने के लिए एक तरह से यह पता लगाने की कोशिश कर सकते हैं - Unfortunatelly, आजकल व्यस्त होने के सभी मेरा सुझाव कर सकते हैं Detecting a folded line or an incremental search सवाल (विशेष रूप से foldclosed समारोह) को देखने के लिए है और खुद को एक समारोह बनाने की कोशिश करें। प्रत्येक पंक्ति को जांचना, अगर गुना खुला है, तो छोड़ें ... उन पंक्तियों के साथ कुछ।

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