2011-07-01 14 views
5

इंटेलिज आइडिया में, एक सुविधा है। मान लें कि मैंने अपने कोड में कहीं भी एक चर myCamelCase का उपयोग किया है। फिर यदि मैं mCC टाइप करता हूं और Ctrl - या कुछ ऐसे महत्वपूर्ण संयोजन दर्ज करें, तो यह myCamelCase तक फैलता है। क्या विम में कुछ समान है?विम में कैमलकेस विस्तार इंटेलिज आइडिया की तरह?

उत्तर

8

ठीक है, मुझे दो बार जवाब देने के लिए क्षमा करें, लेकिन चूंकि मेरा पहला प्रयास बिंदु से चूक गया, तो मुझे एक और जाना होगा। यह मैंने सोचा जितना जटिल है, लेकिन संभवतः उतना ही जटिल नहीं है जितना मैंने इसे बनाया है (!)।

अब यह सभी मिलान करने वाले चर नामों का सुझाव देने के लिए संशोधित किया गया है।

सबसे पहले, यहाँ 'myCamelCase' स्ट्रिंग से 'एमसीसी' संक्षिप्त नाम उत्पन्न करने के लिए एक समारोह है:

function! Camel_Initials(camel) 
    let first_char = matchstr(a:camel,"^.") 
    let other_char = substitute(a:camel,"\\U","","g") 
    return first_char . other_char 
endfunction 

अब, यहाँ एक समारोह है कि एक संक्षिप्त नाम ('एमसीसी') लेता है और स्कैन करता है मौजूदा बफर (वर्तमान पंक्ति से पीछे) "शब्द" के लिए जो इस संक्षेप में है। सभी मैचों की एक सूची लौटा दिया जाता है:

function! Expand_Camel_Initials(abbrev) 
    let winview=winsaveview() 
    let candidate=a:abbrev 
    let matches=[] 
    try 
     let resline = line(".") 
     while resline >= 1 
      let sstr = '\<' . matchstr(a:abbrev,"^.") . '[a-zA-Z]*\>' 
      keepjumps let resline=search(sstr,"bW") 
      let candidate=expand("<cword>") 
      if candidate != a:abbrev && Camel_Initials(candidate) == a:abbrev 
       call add(matches, candidate) 
      endif 
     endwhile 
    finally 
     call winrestview(winview) 
     if len(matches) == 0 
      echo "No expansion found" 
     endif 
     return sort(candidate) 
    endtry 
endfunction 

इसके बाद, यहाँ एक कस्टम-पूरा होने के समारोह है कि कर्सर के तहत शब्द पढ़ता है और मैचों ऊपर कार्यों द्वारा दिया पता चलता है:

function! Camel_Complete(findstart, base) 
    if a:findstart 
     let line = getline('.') 
     let start = col('.') - 1 
     while start > 0 && line[start - 1] =~ '[A-Za-z_]' 
      let start -= 1 
     endwhile 
     return start 
    else 
     return Expand_Camel_Initials(a:base) 
    endif 
endfunction 

setlocal completefunc=Camel_Complete 

का उपयोग करें: इस का उपयोग करने के लिए, आप "completefunc" को परिभाषित करना होगा सम्मिलित मोड पूरा होने, प्रकार Ctrl-Xctrl-U, लेकिन मैं आम तौर पर करने के लिए CTRL-एल इस नक्शा:

inoremap <c-l> <c-x><c-u> 

अपने vimrc में इस कोड के साथ आप खोजना चाहिए जो लिखने से mCC द्वारा पीछा किया CTRL-L अपेक्षित प्रतिस्थापन करेगा। यदि कोई मिलान विस्तार नहीं मिलता है, तो संक्षेप अपरिवर्तित है।

कोड पानी-तंग नहीं है, लेकिन यह परीक्षण किए गए सभी साधारण मामलों में काम करता है। आशा करता हूँ की ये काम करेगा। अगर मुझे कुछ भी स्पष्ट करने की ज़रूरत है तो मुझे बताएं।

+0

कमाल! मेरे द्वारा यही कहा जा सकता है। फिर भी मैं आपको और अधिक पूछने के लिए लालची/आलसी हूं। यदि एक से अधिक संभावित विस्तार हैं: उदा। myCamelCase myCamelCart, आखिरी एक चुना जाता है। इसके बजाय, क्या इसे विम में Ctrl-P कीवर्ड पूर्णता की तरह व्यवहार करने के लिए बनाया जा सकता है? फिर, कमाल! – dharm0us

+0

मुझे खुशी है कि यह काम किया! एकाधिक मैचों को संभालना केवल समाधानों की एक सूची वापस करने के लिए Expand_Camel_Initials() प्राप्त करने का विषय होना चाहिए और उसके बाद आप 'fullfunc' को सेट करने के लिए सेट करना होगा ताकि आप तब तक चुन सकें। मैं कोशिश करूंगा और इस सप्ताह के अंत में इसे देख लूंगा। –

+0

ठीक है, यह दर्दनाक नहीं था जैसा मैंने सोचा था ... मैंने अपना जवाब संपादित कर लिया है और अब यह आपकी इच्छा के अनुसार काम करना चाहिए। अगर आपको कोई समस्या है तो मुझे बताएं (मुझे इसका परीक्षण करने का मौका नहीं मिला है)। –

0

विम में vim-abolish नामक एक प्लगइन है। ऊंट मामले में विस्तार के लिए मानचित्र crc का उपयोग करें।

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