2011-08-15 18 views
8

मेरे विम सत्र में अक्सर मेरे पास कई बफर खुलते हैं। इसका मतलब है कि मेरा जम्प्लिस्ट कई बफर से स्थानों को स्टोर करता है। हालांकि, अक्सर जब मैं पिछले स्थान पर कूदने के लिए Ctrl-o का उपयोग करता हूं, तो मैं बफर छोड़ना नहीं चाहता हूं और वर्तमान बफर में "स्थानीय" पिछले स्थानों पर कूदना चाहता हूं। मैं यह कैसे करु?विम: वर्तमान बफर से कूद को कैसे रोकें?

उदाहरण: मेरी jumplist निम्न के जैसा दिखाई देता है:

4 10 1 ~/aaa.m 
3 20 1 ~/aaa.m 
2 12 2 ~/xxx.m 
1 15 1 ~/aaa.m 

मैं फ़ाइल aaa.m की लाइन से 15 पहली बार मैं Ctrl-ओ कूद करना चाहते हैं। महत्वपूर्ण बात यह है कि अगली बार जब मैं Ctrl-o दबाता हूं, तो मैं xxx.m फ़ाइल पर कूदना नहीं चाहता हूं। इसके बजाय, मैं फ़ाइल aaa.m की लाइन 20 पर कूदना चाहता हूं; वह है, मेरा वर्तमान स्थान "वर्तमान" बफर के भीतर है। विम का डिफ़ॉल्ट व्यवहार मुझे फाइल xxx.m की लाइन 12 पर ले जाना है। इस पर कोई विचार है कि मैं इसे कैसे प्राप्त कर सकता हूं?

+0

यह सुपरसियर, स्टैक ओवरफ्लो प्रश्न (और उत्तर) के लिए एक बेहतर सवाल हो सकता है जो सीधे कोडिंग से संबंधित होते हैं। superuser.com एक ही लोगों द्वारा चलाया जाता है लेकिन सॉफ्टवेयर का उपयोग करने पर केंद्रित है। –

+4

@ डेविड वाटर्स, नहीं। http://meta.stackexchange.com/q/25925/160504 – sidyll

+2

'चेंजलिस्ट' का उपयोग करना आपकी आवश्यकताओं के अनुरूप होगा? परिवर्तन सूची के बावजूद आप आगे बढ़ने के लिए 'जी;' और 'जी' का उपयोग कर सकते हैं। –

उत्तर

9

निम्नलिखित कूद-सूची ट्रैवर्सिंग फ़ंक्शन का प्रयास करें। यह एक और करने के लिए एक कूद-सूची स्थान से क्रमिक कदम (Ctrl +हे या Ctrl +मैं का उपयोग कर क्या अपनी back और forw तर्क है महत्व देता है के आधार पर) और यदि वर्तमान स्थान में है बंद हो जाता है के समान बफर जो कि बफर से शुरू हुआ है। यदि बफर से संबंधित स्थान जंप-सूची ढूंढना संभव नहीं है, तो फ़ंक्शन उस स्थिति पर वापस आ जाता है जो कूद-सूची शुरू होने से पहले है।

function! JumpInFile(back, forw) 
    let [n, i] = [bufnr('%'), 1] 
    let p = [n] + getpos('.')[1:] 
    sil! exe 'norm!1' . a:forw 
    while 1 
     let p1 = [bufnr('%')] + getpos('.')[1:] 
     if n == p1[0] | break | endif 
     if p == p1 
      sil! exe 'norm!' . (i-1) . a:back 
      break 
     endif 
     let [p, i] = [p1, i+1] 
     sil! exe 'norm!1' . a:forw 
    endwhile 
endfunction 

एक Ctrl +हे/Ctrl +मैं -replacement वर्तमान बफर करने के लिए बंद कर दिया के रूप में इस सुविधा का उपयोग करने के लिए, के रूप में यह नीचे दिखाया गया मैपिंग बनाएँ।

nnoremap <silent> <c-k> :call JumpInFile("\<c-i>", "\<c-o>")<cr> 
nnoremap <silent> <c-j> :call JumpInFile("\<c-o>", "\<c-i>")<cr> 
+0

ईक। वह बीमार है। और चालाक। धारा – sehe

+0

के खिलाफ तैराकी के लिए आपको अंक देने के लिए धन्यवाद, वास्तव में दिलचस्प समाधान लिखने के लिए धन्यवाद। यह _almost_ काम करता है, कुछ निगल्स के साथ। सबसे पहले, यदि कोई निर्देशिका मेरी कूद-सूची में है (यह मामला हो सकता है क्योंकि मैंने फ़ाइल खोलने के लिए एक निर्देशिका ब्राउज़ की है), यह वर्तमान बफर में netrw ब्राउज़र खोलता है और फिर वहां अटक जाता है। दूसरा, जब फ़ंक्शन जंप-सूची के अंत तक पहुंच जाता है, तो यह पिछले दो स्थानों (जब 'Ctrl + k' दबाया जाता है) के बीच कूदता रहता है। क्या यह संभव है कि यह या तो कूद-सूची के माध्यम से loops, या बस अंतिम स्थान पर रहता है? – vimgm

+0

@sehe: यह मेरे लिए अनाज के खिलाफ भी लगता है। (और व्यक्तिगत रूप से मैं डिफ़ॉल्ट कूद-सूची व्यवहार के कोनों को काटने की कोशिश नहीं करता।) लेकिन यह समस्या हल करने के तरीके को खोजने का प्रयास करने के लिए दिलचस्प (और थोड़ा हैकिश) है। –

0

शायद EnhancedJumps plugin मदद करेगा।

इस प्लगइन को स्थापित करने के साथ, एक और बफर पर कूद केवल तभी किया जाता है जब एक ही कूद कमांड तुरंत बाद में दोहराया जाता है।

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