2011-07-01 16 views
5

W Intellij Idea dostępna jest funkcja. Powiedzmy, że użyłem zmiennej myCamelCase gdzieś w moim kodzie. Następnie, jeśli wpiszę: mCC i naciśnij Ctrl - Wpisz lub taką kombinację klawiszy, która rozwija się do myCamelCase. Czy jest coś podobnego w Vimie?Rozszerzenie CamelCase w Vimie jak Intellij Idea?

Odpowiedz

8

Dobra, wybacz mi, że odpowiadam dwa razy, ale ponieważ moja pierwsza próba nie dotarła do celu, będę miał jeszcze jedną szansę. Jest to bardziej skomplikowane, niż myślałem, ale być może nie tak skomplikowane, jak to zrobiłem (!).

Zostało to zmienione tak, aby sugerować wszystkie pasujące nazwy zmiennych.

Przede wszystkim, oto funkcja wygenerować skrót „MCC” ze sznurkiem do „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 

Teraz tutaj jest to funkcja, która bierze skrót („MCC”) i skanuje bieżący bufor (wstecz od bieżącego wiersza) dla "słów", które mają ten skrót. Lista wszystkich meczów jest zwracany:

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 

Następnie oto funkcja zwyczaj uzupełniania że czyta słowo pod kursorem i sugeruje mecze zwracanych przez powyższych funkcji:

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 

aby skorzystać z tego, należy zdefiniować „completefunc”:

setlocal completefunc=Camel_Complete 

do korzystania Zakończenie wstawić-mode, typ CTRL-XCTRL-U, ale zazwyczaj na mapie, aby CTRL-L:

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

Z tego kodu w swojej vimrc należy znaleźć, że wpisanie mCC następnie CTRL-L spowoduje oczekiwaną wymianę. Jeśli nie zostanie znalezione pasujące rozszerzenie, skrót pozostaje niezmieniony.

Kod nie jest wodoszczelny, ale działa we wszystkich prostych przypadkach, które testowałem. Mam nadzieję, że to pomoże. Daj mi znać, jeśli coś potrzebuje wyjaśnienia.

+0

Amazing! To wszystko co mogę powiedzieć. Nadal jestem chciwy/leniwy, żeby prosić o więcej. Jeśli istnieje więcej niż jedno możliwe rozwinięcie: np. myCamelCase myCamelCart, wybrana jest ostatnia. Zamiast tego, czy można go zachować tak, jak w przypadku vima, jak kończenie słowa kluczowego Ctrl-P? Ponownie, niesamowite! – dharm0us

+0

Cieszę się, że zadziałało! Obsługa wielokrotnych dopasowań powinna być kwestią uzyskania Expand_Camel_Initials() w celu zwrócenia listy rozwiązań, a następnie ustawienia 'completefunc', aby umożliwić ci wybór pomiędzy. Spróbuję obejrzeć to jeszcze w tym tygodniu. –

+0

Dobra, to nie było tak bolesne, jak myślałem ... Poprawiłem odpowiedź i teraz powinno działać tak, jak sobie życzysz. Daj mi znać, jeśli masz jakiekolwiek problemy (nie miałem okazji przetestować go prawidłowo). –

0

Istnieje wtyczka do tego w Vimie o nazwie vim-abolish. Użyj mapy crc, aby rozwinąć do wielbłąda.