um [C#

2011-07-27 9 views
11

um ile m hareketi çok yararlı hareket bir yöntemin bir sonraki başlangıç ​​/ sonuna atlamak için komutlar içerir].um [C#

Java ya da benzer yapılandırılmış dil için bu çalışır. (de anlatıldığı gibi yardımcı] m: 29,3 yardımcı)

sınıf beyan ve yöntem bildirimleri kıvırcık parantez bir sonraki seviyesine kadar küme ayraçları en dış çifti dikkate iş gibi görünüyor.

Sınıf hareketinin etrafında küme parantezinin dış çifti olduğunda bu hareket komutları çalışmaz, bu da C# dillerinde biraz yaygındır.

([V m] M operatör, örneğin y öneki, tek başına ve ) bu kod üzerinde çalışmak

bu komutları yapmak için bazı hile olup olmadığını merak:

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

içinde (bu soruya başka bir cevap alınmıştır) bu eşleştirmeleri kullanıyorum. Belki de bu komutu kullanabilecek ve beklendiği gibi çalışacak bir Visual Studio eklentisi vardır. Hangi IDE kullanıyorsunuz? Yoksa sadece Vim'i komut satırından mı kullanıyorsunuz? –

+0

@Gweebz - Ben kodunu düzenlemek için GVIM kullanıyorum, bu yüzden daha çok bir Vim eklentisi :) – mMontu

cevap

4

I do not ]m eşleme ailesinin özelleştirilebileceğini düşünün. Bu gibi durumlarda, alışılmış uygulama, özel mantıkla geçersiz kılmaktır. Ben açıkladığınız şeyi yapmalısınız bazı vimscript ile geldi. Temel olarak, kaşlı ayraçlarla atlar ve ne yapacağına karar vermek için ilgili çizgiye bakar. Bu durumda, sadece "sınıf" ve "ad alanı" bildirimlerini yok sayar.

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 

Ayı bunun her durumda düzgün çalışmayabilir bu yüzden gerçekten, C# çok bilmiyorum, ama bana kırmak örnekler vermek eğer, bir şey anlamaya mümkün olabilir aklında.

siz "cs.vim" olarak, bir yere senin vimfiles dizinde "ftplugin" altına koymak gerekir, bunu deneyin. Eğer "cs" ile başlayan ve ".vim" ile biten başka bir dosya adı zaten var, eğer zaten bir "cs.vim" dosyasına sahipseniz.

+0

Ben de C# çoğunu bilmiyor tercih ediyorum, ama ben çalışıyorum kodu test ettik ve onu iyi çalıştı görünüyordu, hariç içinde yöntemleri/özellikleri tanımı olan küme parantez çiftleri atlamıyor. Soruyu bu kodu eklemek için güncelledim.Yardımınız için teşekkürler – mMontu

+0

Bu nedenle ctags gereksinimi ... Kontrol ifadelerine karşı test yapmak kolay olurdu, ancak C# izole edilmiş {} -blokları kabul ediyorsa (bir alanı kısıtlamak için C veya C++ gibi), kodu ayrıştırmak oldukça hantal hale gelir elle viml olarak, yorumlarınızı dikkate alın, vb. –

+0

Durumu biraz düzenledim ve yeni örneğiniz için çalışıyor gibi görünüyor. @ luc-hermitte genellikle doğrudur, ancak, yöntemleri ile çalışmak için yalnızca tam olarak emin yol ctags yoluyladır. Bununla birlikte, daha fazla kurulum ve güncelleme sorunları anlamına gelir. Scriptim, benim için hala tamamen iyi olacak birkaç kenarlık için başarısız olabilir, ancak iyi bir ctags kurulumunuz varsa, eklentilerini de denemekten faydalanabilirsiniz. –

1

Birkaç hafta önce, benzer bir soru ++ vim posta listesinde istedi, ama C için olmuştur. İşte the solution I came up with.

Bu ctags ve benim bir kaç başka eklentileri dayanıyor

: lh-dev, lh-etiketi ve lh-vim-lib. lh-dev'i vim-addon-manager ile kurabilirsiniz, bu da lh-tag ve lh-vim-lib komutunu da kuracaktır.

HTH,

0

9]} 'ı kullanabilirsiniz. Biraz zorlanmış ama hey, işe yarıyor.

+0

Anladığım kadarıyla, 9]} sadece bir sonraki/önceki yöntemin başlatılmaması ya da bitmemesi için aşağıdaki 9. '' '' a atlayacaktır. – mMontu

+0

Genel olarak geçerli yöntemin sonu olan 9. bölüme} geçer. Bir sonraki yöntemin başlangıcı değil, ama benim için "yeterince yakın". –

+3

9'uncu} sınıf/ad alanının da sonu olabilir. OP sorusunu çözmeyecek. –

2

OmniSharp şimdi :OmniSharpNavigateUp ve :OmniSharpNavigateDown sahiptir. Her zaman "başlangıç" yapar (bu nedenle ]m ve [m eşleştirmeleri içindir). IDE'nizde Vim gibi stil komutları, Intellij ve diğer IDE bu komutları sunuyoruz Vim eklentileri varsa, Java geliştirme için 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

OmniSharp yazarı burada. Ben bile bilmiyordum] M (ya da m). Bir yöntemin sonuna atlama için destek ekleyeceğim. – jasoni