2011-07-27 8 views
11

विम के साथ एम गति विधि के प्रारंभ/समाप्ति पर कूदने के लिए बहुत उपयोगी गति आदेश प्रदान करता है:] एम,] एम, [एम और] एम।विम [सी #

ये जावा या इसी तरह की संरचित भाषा के लिए काम करता है। (में वर्णित हैं: मदद] मीटर और: मदद 29.3)

यह रूप में वर्ग घोषणा और विधि घोषणाओं के रूप में घुंघराले ब्रेसिज़ के अगले स्तर घुंघराले ब्रेसिज़ की सबसे बाहरी जोड़ी पर विचार काम करने के लिए लगता है।

ये गति आदेश काम नहीं करते हैं जब घुमावदार ब्रेसिज़ की बाहरी जोड़ी कक्षा परिभाषा के आसपास है, जो सी # के रूप में भाषाओं पर कुछ आम है।

अगर वहाँ उन आदेशों बनाने के लिए कुछ चाल है मैं सोच रहा था (अकेले और ऑपरेटरों, जैसे, वाई के साथ उपसर्ग [मी, V] एम) इस कोड पर काम:

namespace ABC.DEF 
{ 
    class A 
    { 
     protected string strID; 
     public string PortID { get { return strID; } set { strID = value; } } 

     protected MyType x; 
     public MyType X 
     { 
      get { return x; } 
      set { x = value; if (x != null) func1(); } 
     } 


     int func1() 
     { 
      return 1; 
     } 

     int func2(int flag) 
     { 
      if (flag == 0) 
       return flag; 


      if (flag > 3) 
      { 
       return flag; 
      } 
      return 2; 
     } 

     int func3() 
     { 
      return 3; 
     } 
    } 
} 
+0

में इन मैपिंग (एक और जवाब से इस सवाल का लिया गया) का उपयोग कर रहा जावा विकास के लिए, अपने आईडीई में आप विम की तरह शैली आदेश, इंटेलीजे और अन्य IDEs विम प्लगइन्स जो इन आदेशों की पेशकश है। शायद एक विजुअल स्टूडियो प्लगइन है जिसमें यह आदेश उपलब्ध होगा और उम्मीद के अनुसार काम करेगा। आप किस आईडीई का उपयोग कर रहे हैं? या आप कमांड लाइन से विम का उपयोग करते हैं? –

+0

@Gweebz - मैं कोड संपादित करने के लिए जीवीआईएम का उपयोग कर रहा हूं, इसलिए मैं एक वीम प्लगइन पसंद करूंगा :) – mMontu

उत्तर

4

मुझे नहीं पता लगता है कि ]m मैपिंग के परिवार को अनुकूलित किया जा सकता है। ऐसे मामलों में, सामान्य अभ्यास कस्टम तर्क के साथ इसे ओवरराइड करना है। मैं कुछ vimscript के साथ आया कि क्या आप वर्णन करते हैं। असल में, यह घुंघराले ब्रेसिज़ के माध्यम से कूदता है और यह तय करने के लिए प्रासंगिक रेखा को देखता है कि क्या करना है। इस मामले में, यह सिर्फ "वर्ग" और "नेमस्पेस" घोषणाओं को अनदेखा करता है।

nnoremap <buffer> ]m :<c-u>call <SID>JumpMethod('{', 'W', 'n')<cr> 
nnoremap <buffer> [m :<c-u>call <SID>JumpMethod('{', 'Wb', 'n')<cr> 
nnoremap <buffer> ]M :<c-u>call <SID>JumpMethod('}', 'W', 'n')<cr> 
nnoremap <buffer> [M :<c-u>call <SID>JumpMethod('}', 'Wb', 'n')<cr> 

xnoremap <buffer> ]m :<c-u>call <SID>JumpMethod('{', 'W', 'v')<cr> 
xnoremap <buffer> [m :<c-u>call <SID>JumpMethod('{', 'Wb', 'v')<cr> 
xnoremap <buffer> ]M :<c-u>call <SID>JumpMethod('}', 'W', 'v')<cr> 
xnoremap <buffer> [M :<c-u>call <SID>JumpMethod('}', 'Wb', 'v')<cr> 

onoremap <buffer> ]m :<c-u>call <SID>JumpMethod('{', 'W', 'o')<cr> 
onoremap <buffer> [m :<c-u>call <SID>JumpMethod('{', 'Wb', 'o')<cr> 
onoremap <buffer> ]M :<c-u>call <SID>JumpMethod('}', 'W', 'o')<cr> 
onoremap <buffer> [M :<c-u>call <SID>JumpMethod('}', 'Wb', 'o')<cr> 

function! s:JumpMethod(char, flags, mode) 
    let original_cursor = getpos('.') 

    if a:mode == 'v' 
    normal! gv 
    elseif a:mode == 'o' 
    normal! v 
    endif 

    while search(a:char, a:flags) > 0 
    if a:char == '}' 
     " jump to the opening one to analyze the definition 
     normal! % 
    endif 

    let current_line = line('.') 

    if getline(current_line) =~ '^\s*{' 
     " it's alone on the line, check the above one 
     let method_line = current_line - 1 
    else 
     let method_line = current_line 
    endif 

    let method_line_body = getline(method_line) 

    if method_line_body =~ '\k\+\s*(.*)' && method_line_body !~ '\<\(for\|foreach\|if\|while\|switch\|using\|catch\|get\|set\)\>' 
     " it's probably a function call 

     if a:char == '}' 
     " we need to go back to the closing bracket 
     normal! % 
     endif 

     echo 
     return 
    else 
     if a:char == '}' 
     " we still need to go back to the closing bracket 
     normal! % 
     endif 
    endif 
    endwhile 

    " if we're here, the search has failed, restore cursor position 
    echo 
    call setpos('.', original_cursor) 
endfunction 

ध्यान रखें कि मैं वास्तव में, सी # का एक बहुत पता नहीं है, तो यह सभी मामलों में ठीक से काम नहीं हो सकता है, लेकिन अगर आप मुझे उस तोड़ने उदाहरण देना, मैं कुछ यह पता लगाने के लिए सक्षम हो सकता है में भालू।

इसे आजमाने के लिए, आपको इसे "vs.vim" के रूप में अपनी vimfiles निर्देशिका में "ftplugin" के नीचे कहीं भी रखना चाहिए। "Cs" से शुरू होने वाले किसी भी अन्य फ़ाइल नाम और ".vim" में समाप्त होता है, यदि आपके पास पहले से "cs.vim" फ़ाइल है।

+0

मुझे सी # के बारे में ज्यादा जानकारी नहीं है, लेकिन मैंने इसे कोड पर परीक्षण किया है और यह मैं काम कर रहा हूं ठीक काम करने लग रहा था, सिवाय इसके कि घुंघराले ब्रेसिज़ जोड़े को छोड़ना नहीं है जो विधियों/गुण परिभाषाओं के अंदर हैं। मैंने इस तरह के कोड को शामिल करने के लिए प्रश्न अद्यतन किया है।आपकी मदद के लिए धन्यवाद – mMontu

+0

इसलिए ctags आवश्यकता ... नियंत्रण कथन के खिलाफ परीक्षण करना आसान होगा, लेकिन यदि सी # पृथक {} -ब्लॉक्स स्वीकार करता है (जैसे सी या सी ++ में एक गुंजाइश को रोकने के लिए), यह कोड को पार्स करने के लिए काफी बोझिल हो जाएगा viml में हाथ से, टिप्पणियों को ध्यान में रखें, आदि –

+0

मैंने थोड़ी सी स्थिति संपादित की है, और ऐसा लगता है कि यह आपके नए उदाहरण के लिए काम करता है। @ ल्यूक-हेर्मेट आमतौर पर सही है, हालांकि, विधियों के साथ काम करने का एकमात्र _completely_ निश्चित तरीका ctags के माध्यम से है। इसका मतलब है कि, हालांकि, बहुत अधिक सेटअप और अद्यतन समस्याएं हैं। मेरी लिपि कुछ किनारे के मामलों में विफल हो सकती है, जो अभी भी मेरे लिए पूरी तरह से ठीक होगी, लेकिन यदि आपके पास एक अच्छा सीटीएजी सेटअप है, तो आप शायद अपने प्लगइन को आजमाने से भी लाभ उठा सकते हैं। –

1

कुछ हफ्ते पहले, विम मेलिंग सूची पर एक समान प्रश्न पूछा गया था, लेकिन सी ++ के लिए। यहां the solution I came up with है।

यह सीटीएजी और मेरे कुछ अन्य प्लगइन पर निर्भर करता है: lh-dev, lh-tag, और lh-vim-lib। आप vim-addon-manager के माध्यम से lh-dev इंस्टॉल कर सकते हैं, यह बदले में lh-tag और lh-vim-lib इंस्टॉल करेगा।

HTH,

0

आप उपयोग कर सकते हैं 9]}। यह थोड़ा मजबूर है, लेकिन हे, यह काम करता है।

+0

जहां तक ​​मैं समझता हूं, 9]} नीचे 9वीं '} तक कूद जाएगा, न कि अगली/पिछली विधि को शुरू या समाप्त करने के लिए। – mMontu

+0

यह 9वीं संलग्न} तक कूदता है, जो आम तौर पर वर्तमान विधि का अंत होता है। यह अगली विधि की शुरुआत नहीं है, लेकिन यह मेरे लिए "पर्याप्त करीब" है। –

+3

9वीं} कक्षा/नामस्थान का अंत भी हो सकता है। यह ओपी सवाल हल नहीं करेगा। –

2

ओमनीशर्प में अब :OmniSharpNavigateUp और :OmniSharpNavigateDown है। यह हमेशा "शुरूआत" पर जाता है (इसलिए यह ]m और [m मैपिंग के लिए है)। मैं ftplugin\cs.vim

nnoremap <buffer> ]m :OmniSharpNavigateDown<cr> 
nnoremap <buffer> [m :OmniSharpNavigateUp<cr> 
nnoremap <buffer> ]M :OmniSharpNavigateDown<cr> 
nnoremap <buffer> [M :OmniSharpNavigateUp<cr> 

xnoremap <buffer> ]m :OmniSharpNavigateDown<cr> 
xnoremap <buffer> [m :OmniSharpNavigateUp<cr> 
xnoremap <buffer> ]M :OmniSharpNavigateDown<cr> 
xnoremap <buffer> [M :OmniSharpNavigateUp<cr> 

onoremap <buffer> ]m :OmniSharpNavigateDown<cr> 
onoremap <buffer> [m :OmniSharpNavigateUp<cr> 
onoremap <buffer> ]M :OmniSharpNavigateDown<cr> 
onoremap <buffer> [M :OmniSharpNavigateUp<cr> 
+0

ओमनीशर्प लेखक यहां। मुझे इसके बारे में भी पता नहीं था] एम (या] एम)। मैं एक विधि के अंत में कूदने के लिए समर्थन जोड़ दूंगा। – jasoni