Jak przekonwertować słowa na camelCase w makrze?

14

Mam listę słów, takich jak to:

these are
some
words that I want
to convert to
camel case

Potrzebuję sposobu, aby na przykład zamienić camel casesię camelCasew makro (lub sposób, aby zmienić każdą linię zaznaczenia linii wizualnej w obudowę wielbłąda).

Mógłbym użyć czegoś wgUlhxtyle razy, ile to konieczne, ale problem polega na tym, że nie działa to na słowa o różnej długości (więc na przykład wgUlhxwgUlhxdziałałoby dla, convert this pleaseale nie dla convert these pretty please).

Pożądane wyjście dla powyższych linii byłoby

theseAre
some
wordsThatIWant
toConvertTo
camelCase

Czy jest jakiś sposób na zautomatyzowanie tego?

Klamka
źródło

Odpowiedzi:

16

One Liner

Znalazłem prostą zamianę wyrażeń regularnych (zakładając, że ustawiono „magię”):

:s/ \([a-zA-Z]\)/\u\1/g

Dopasowuje każdą pojedynczą literę po spacji, oszczędzając literę. Następnie zastępuje go zapisaną wielką literą ( \u= wielkie litery, \1= pierwsze zapisane dopasowanie) dla każdego dopasowania w linii.

Zastosuj do całego pliku, wstawiając %pomiędzy :i s.

Wadą tego rozwiązania jest to, że jest ono liniowe (co działa w przypadku twoich przykładów), ale byłoby nieskuteczne, gdybyś chciał tylko wyodrębnić kilka słów z wielu w linii.

Pełniejsze rozwiązanie

map <leader>g~ :set opfunc=MyCamelCase<CR>g@
function! MyCamelCase(type, ...)
  let searchsave=@/
    silent s/\%>'\[ \([a-zA-Z]\)\%<']/\u\1/g
  let @/=searchsave
 endfunction

Tworzy to nowego operatora, który może operować ruchem. Jeśli <leader>tak \, to podaj następujący tekst (z |kursorem):

This is some |example text to work with.

Pisanie \g~3wdaje

This is some exampleTextTo work with.

Oznacza to, że wielbłąd składa się z 3 słów.

Opis tego zastąpienia:

s/rozpoczyna podstawienie.
\%>'\[jest trochę bolesne. \%>'mMówi, aby dopasować się do prawa do znaku. Chcemy znaku [, ale to również musi być wymykane w tym wzorze. To zaczyna mecz po ruchu podanym operatorowi.
\([a-zA-Z\)jest taki sam jak w powyższej linijce.
\%<']to jest drugi koniec, pasujący przed końcem ruchu.
/\u\1/gjest zamiennikiem z powyższej liniówki.

John O'M.
źródło
W rzeczywistości nie jest to makro, ale jest to jedna linijka, ale można odwzorować je na kombinację klawiszy.
John O'M.
Dodano wersję operatora, aby to zrobić. Działa trochę lepiej.
John O'M.
Myślę, że jest w porządku, jeśli twoja odpowiedź nie używa makra; pytający przedstawił problem XY , moim zdaniem.
tommcdo
@tommcdo Tak, masz rację; to nie musi być faktyczne makro. To musi być jakaś zautomatyzowana metoda.
Klamka
12

Alternatywnie używam wtyczki vim-abolish, która oferuje funkcję przymusu:

Chcesz włączyć fooBarsię foo_bar? Naciśnij crs(przymus do skrzynki węża). MixedCase ( crm), camelCase ( crc), snake_case ( crs) i UPPER_CASE ( cru) to tylko 3 naciśnięcia klawiszy. Te polecenia obsługują repeat.vim .

Sukima
źródło
2
+1, ponieważ zawsze jest wtyczka Tima Pope'a, o której nie wiedziałam.
zool
5

Możesz utworzyć makro rekurencyjne, które robi to dla pojedynczej linii, za pomocą następujących naciśnięć klawiszy:

qqqqqf xgUl@qq

(Zauważ, że spacja między fi xto stuknięcie spacji, a nie pauza)

Szczegółowo:

  1. Wyczyść rejestr q. Jest to konieczne, ponieważ tworzymy makro rekurencyjne. (Patrz krok 5.):qqq

  2. Rozpocznij rejestrowanie makra w rejestrze q: qq

  3. Nie możesz wtutaj użyć ruchu, ponieważ chcesz, aby makro przerywało, gdy dotrze do końca linii, zamiast przeskakiwać do następnej linii. Zamiast tego przejdź do następnego znaku spacji w wierszu, naciskając fklawisz, a następnie spację:f<space>

  4. Usuń spację i wielkie litery następującą literę: xgUl

  5. Powtórz. Ponieważ wyczyściliśmy qrejestr w kroku 1, nie ma w nim jeszcze nic, więc nic to nie da:@q

  6. Zapisz makro: q

Następnie możesz zastosować to makro do wielu linii, używając zakresu:

Zastosuj makro do każdej linii w pliku:

:%normal @q

Zastosuj makro do linii 2–5 włącznie:

:2,5normal @q

Dokonaj wizualnego wyboru, a następnie wpisz :normal @q. Spowoduje to wstępne wypełnienie wiersza polecenia po naciśnięciu :klawisza, w wyniku czego polecenie zastosuje makro do każdej linii w zaznaczeniu:

:'<,'>normal @a
Bogaty
źródło
Usunięcie qrejestru qqnie jest konieczne , podobnie jak przed rozpoczęciem rejestrowania naciśnięć klawiszy. W rzeczywistości właśnie dlatego qqqdziała wyczyszczenie qrejestru :)
tommcdo
Oczywiście, jeśli robisz coś, co wymaga dołączenia do qrejestru (tj. Za pomocą qQ), najpierw wyczyszczenie go prawdopodobnie będzie konieczne.
tommcdo
2
@tommcdo To zdecydowanie nie jest prawda w mojej kopii Vima. (Vim 7.3.87, wywoływany z vim -u NONE). Istniejąca zawartość jest usuwana dopiero po zapisaniu rejestru, w kroku 6. Czyszczenie rejestru przed rozpoczęciem jest zatem konieczne, jeśli chcesz się powtórzyć.
Bogaty
@tommcdo Zaktualizowałem odpowiedź, aby wyjaśnić, dlaczego ten krok jest konieczny.
Bogaty
Mój błąd, w pewnym sensie rzuciłem tam broń. Doskonałe wyjaśnienie!
tommcdo
1

Zobacz http://vim.wikia.com/wiki/Changing_case_with_regular_expressions Wyjaśnia modyfikatory \ U, \ L, \ u, \ l dość jasno i zwięźle!

Jego istotą jest:

Są chwile, w których możesz chcieć przejrzeć plik i zmienić wielkość znaków spełniających dowolne kryteria. Jeśli dobrze rozumiesz wyrażenia regularne, możesz to zrobić dość łatwo.

Jest to tak proste, jak umieszczenie \ U lub \ L przed odniesieniami wstecznymi, dla których chcesz zmienić wielkość liter, i \ E na końcu. Vim sprawi, że tekst w odnośnikach wstecznych będzie pisany odpowiednio dużymi lub małymi literami. Użyj \ u i \ l (bez \ E na końcu), aby zmienić wielkość liter pierwszego znaku w odnośniku wstecznym.

(„Odwołanie wsteczne” jest częścią wyrażenia regularnego, które odnosi się do poprzedniej części wyrażenia regularnego. Najczęstsze odniesienia wsteczne to &, \ 1, \ 2, \ 3, ..., \ 9).

Kilka przykładów, które pokazują moc tej techniki:

Małe litery całego pliku

:% s /.*/ \ L & / g

(& jest przydatnym odsyłaczem wstecznym, który odnosi się do pełnego tekstu dopasowania).

Wielkie litery wszystkich słów poprzedzonych znakiem <(tzn. Otwierającymi nazwy znaczników HTML):

:%s/<\(\w*\)/<\U\1/g

Zwróć także uwagę na polecenia gu i gU.

Na przykład ggguG zmniejszy cały plik do małych liter. (gg = przejdź na górę, gu = małe litery, G = przejdź do EOF).

Używając ogólnego odnośnika zwrotnego \ 0 zamiast nazwanych (\ 1, \ 2 itd.), Możesz zaoszczędzić trochę na pisaniu przy zwrotce zwrotnej wyrażenia regularnego.

Wyrażenie regularne wielkie litery jawny zestaw słów na wielkie litery w pliku:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\0/g

Nie nauka o rakietach, ale w innym przypadku musiałbyś to zrobić:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g
Luke Kendall
źródło
1
Czy możesz streścić artykuł, o którym wspomniałeś w swojej odpowiedzi?
EvergreenTree,
Do zobaczenia? Bardzo ważne jest, aby odpowiedzi na pojedyncze linki były w porządku, kilka lat później ta strona będzie pełna usuniętych linków. Ale jeśli skopiujesz tylko ważną część odsyłacza, do którego się odwołujesz, i podasz również link, na którym OP może uzyskać dalsze informacje, to jest w porządku.
Peter - Przywróć Monikę