Як я можу перетворити слова на camelCase в макрос?


14

У мене є список таких слів:

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

Мені потрібен спосіб перетворити, наприклад, camel caseв camelCaseмакрос (або спосіб перетворити кожен рядок виділення візуальної лінії в корпус верблюда).

Я міг би використовувати щось на зразок wgUlhxстільки разів, скільки потрібно, але проблема полягає в тому, що це не працює для слів різної довжини (так, наприклад, wgUlhxwgUlhxпрацювало б, convert this pleaseале не для convert these pretty please).

Бажаний вихід для вищевказаних рядків буде

theseAre
some
wordsThatIWant
toConvertTo
camelCase

Чи є спосіб автоматизувати це?

Відповіді:


16

Один лайнер

Я знайшов просту заміну регулярних виразів (якщо "магія" встановлена):

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

Це збігається з будь-якою літерою після пробілу, зберігаючи букву. Потім він замінює його збереженою літерою, зробленою верхній регістр ( \u= верхній регістр, \1= перший збережений збіг), для кожного збігу в рядку.

Нанесіть на весь файл, поставивши %між :і s.

Недоліком цього рішення є те, що воно є лінійним (що працює для ваших прикладів), але буде невдалим, якби ви хотіли, щоб у верблюда вийшло кілька слів із багатьох у межах рядка.

Повніше рішення

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

Це створює нового оператора, який може працювати в русі. Якщо ви , <leader>як \, потім дав наступний текст (з , |як курсор):

This is some |example text to work with.

Введення тексту \g~3wдає

This is some exampleTextTo work with.

Тобто ми верблюда обмацували понад 3 слова.

Опис цієї заміни:

s/запускає заміну.
\%>'\[трохи боляче. \%>'mКаже , що потрібно праворуч від знака. Ми хочемо відзнаки [, але і цього слід уникати у цій схемі. Отже, це розпочинає збіг після руху, поданого оператору.
\([a-zA-Z\)те саме, що і з однолінійного верху.
\%<']це інший кінець, що відповідає до закінчення руху.
/\u\1/g- це заміна з одного вкладиша вище.


Насправді це не макрос настільки, скільки це один вкладиш, але ви можете зіставити його на комбінацію клавіш.
Джон О'М.

Для цього було додано версію оператора. Діє трохи краще.
Джон О'М.

Я думаю, що це нормально, якщо у вашій відповіді конкретно не використовується макрос; Аскеер представив проблему XY , на мій погляд.
tommcdo

@tommcdo Так, ти маєш рацію; це не повинно бути фактичним макросом. Це просто повинен бути якийсь автоматизований метод.
Doorknob

12

Для альтернативи я використовую плагін vim-Скасувати, який пропонує функцію примусу:

Хочете перетворитися fooBarна foo_bar? Натисніть crs(примушуйте до змії_випадок). MixedCase ( crm), camelCase ( crc), snake_case ( crs) та UPPER_CASE ( cru) - лише три натискання клавіш. Ці команди підтримують repe.vim .


2
+1, оскільки завжди є плагін Тіма Попа, про який я не знав.
zool

5

Ви можете створити рекурсивний макрос, який робить це для одного рядка за допомогою наступних натискань клавіш:

qqqqqf xgUl@qq

(Зауважте, що пробіл між і fта x- це натискання на пробіл, а не пауза)

Детально:

  1. Очистіть регістр q. Це необхідно, тому що ми створюємо рекурсивний макрос. (Див. Крок 5.):qqq

  2. Почніть запис макросу в регістр q: qq

  3. Тут ви не можете використовувати wрух, тому що ви хочете, щоб макрос перервав, коли він доходить до кінця рядка, а не перескакувати до наступного рядка. Натомість переходьте до наступного символу пробілу на лінії, натиснувши fклавішу, а потім пробіл:f<space>

  4. Видаліть пробіл і великі регістри наступного листа: xgUl

  5. Рекурсивні. Оскільки ми очистили qреєстр на кроці 1, у ньому ще нічого немає, тому це нічого не зробить:@q

  6. Збережіть макрос: q

Потім ви можете застосувати цей макрос до кількох рядків, використовуючи діапазон:

Застосувати макрос до кожного рядка у файлі:

:%normal @q

Застосувати макрос до рядків 2–5 включно:

:2,5normal @q

Зробіть візуальний вибір, а потім введіть :normal @q. Це буде попередньо заповнено командний рядок при натисканні :клавіші, в результаті чого буде команда, яка застосовує макрос до кожного рядка у виді:

:'<,'>normal @a

Не потрібно видаляти qреєстр, як qqце робиться саме перед тим, як він починає записувати натискання клавіш. Насправді саме тому qqqпрацює над очищенням qреєстру :)
tommcdo

Звичайно, якщо ви робили щось, що вимагало внесення до qреєстру (тобто використання qQ), тоді, перш за все, очистити його, можливо, буде потрібно.
tommcdo

2
@tommcdo Це точно не відповідає дійсності моєї копії Vim. (Vim 7.3.87, посилається на vim -u NONE). Існуючий вміст видаляється лише під час збереження реєстру на кроці 6. Отже, очищення реєстру перед його запуском необхідно, якщо ви хочете повторити.
Багатий

@tommcdo Я оновив відповідь, щоб зрозуміти, чому цей крок необхідний.
Багатий

Моя помилка, я наче стрибнув там пістолет. Відмінне уточнення!
tommcdo

1

Дивіться http://vim.wikia.com/wiki/Changing_case_with_regular_expressions Це пояснює модифікатори \ U, \ L, \ u, \ l досить чітко та стисло!

Суть її полягає в наступному:

Можливо, вам захочеться пройти файл і змінити регістр символів, які відповідають деяким довільним критеріям. Якщо ви добре розумієте регулярні вирази, ви можете це зробити досить легко.

Це так само просто, як розміщення \ U або \ L перед зворотними параметрами, для яких потрібно змінити регістр, і \ E в кінці. Vim зробить текст у верхньому або малому регістрі (відповідно). Використовуйте \ u і \ l (без \ E в кінці), щоб просто змінити регістр першого символу в зворотному режимі.

("Зворотний посилання" - це частина регулярного виразу, яка відноситься до попередньої частини регулярного виразу. Найпоширеніші зворотні посилання - &, \ 1, \ 2, \ 3, ..., \ 9).

Деякі приклади, які демонструють силу цієї техніки:

Малий регістр всього файлу

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

(& - це зручна зворотна посилання, що стосується повного тексту матчу.)

Пропишіть усі регістри слів, яким передує <(тобто відкриття імен HTML-тегів):

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

Зауважте також команди gu та gU.

Наприклад, ggguG видасть малий регістр всього файлу. (gg = перейти до вершини, gu = нижній регістр, G = перейти до EOF).

Використовуючи загальний backref \ 0 замість іменних (\ 1, \ 2 тощо), ви можете зберегти набравши для заміни строфи регулярного виразу.

Цей верхній регістр виражає явний набір слів у великі регістри у файлі:

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

Не ракетна наука, але в іншому випадку вам доведеться це зробити:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g

1
Чи можете ви підсумувати статтю, яку ви згадали у своїй відповіді?
EvergreenTree

Побачимося? Дуже важливо, якби відповіді на одне посилання були б нормальними, через кілька років цей сайт буде заповнений видаленими посиланнями. Але якщо ви скопіюєте лише важливу частину посилання, на яке ви посилаєтесь, і дасте також посилання, де ОП може отримати подальші відомості, це добре.
петерх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.