Как я могу преобразовать слова в 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

Один лайнер

Я нашел простую замену регулярного выражения (при условии, что установлено 'magic'):

: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 Да, ты прав; это не обязательно должен быть настоящий макрос. Это просто должен быть какой-то автоматизированный метод.
дверная ручка
12

В качестве альтернативы я использую плагин vim- abolish, который предлагает функцию принуждения:

Хотите превратиться fooBarв foo_bar? Нажмите crs(приведите к snake_case). MixedCase ( crm), camelCase ( crc), snake_case ( crs) и UPPER_CASE ( cru) находятся всего в 3 нажатиях клавиш. Эти команды поддерживают repeat.vim .

Sukima
источник
2
+1 потому что всегда есть плагин Тима Папы, о котором я не знал.
zool
5

Вы можете создать рекурсивный макрос, который делает это для одной строки со следующими нажатиями клавиш:

qqqqqf xgUl@qq

(Обратите внимание, что пробел между fи x- это пробел, а не пауза)

В деталях:

  1. Очистите регистр q. Это необходимо, потому что мы создаем рекурсивный макрос. (См. Шаг 5.):qqq

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

  3. Вы не можете использовать wдвижение здесь, потому что вы хотите, чтобы макрос прерывался при достижении конца строки, а не переходил к следующей строке. Вместо этого перейдите к следующему пробелу в строке, нажав fклавишу, а затем пробел:f<space>

  4. Удалите пробел и заглавные буквы следующей буквы: xgUl

  5. Recurse. Поскольку мы очистили 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 /.*/ \ л & / г

(& это удобная обратная ссылка, которая ссылается на полный текст матча.)

Прописные буквы всех слов, которым предшествует <(то есть открываются имена тегов HTML):

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

Обратите внимание также на команды gu и gU.

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

Используя \ 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
Увидимся? Очень важно, если бы ответы с одной ссылкой были бы нормальными, через несколько лет этот сайт был бы заполнен удаленными ссылками. Но если вы только скопируете важную часть ссылки, на которую ссылаетесь, и даете также ссылку, по которой ОП может получить дополнительную информацию, это нормально.
Петер - Восстановить Монику