Як я можу перетворити слова на 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.