camelCase, чтобы подчеркнуть в vi (m) - PullRequest
25 голосов
/ 03 марта 2011

Если по какой-то причине я хочу выборочно преобразовать именованные объекты camelCase в символы подчеркивания, разделенные в vim, как я могу это сделать?

В настоящее время я обнаружил, что могу выполнить поиск /s[a-z][A-Z] и записать макрос, чтобы добавить подчеркивание и преобразовать в нижний регистр, но мне интересно, могу ли я сделать это с чем-то вроде:

%s/([a-z])([A-Z])/\1\u\2/gc

Заранее спасибо!

РЕДАКТИРОВАТЬ: Я разобрался с ответом для camelCase (что мне действительно нужно), но может кто-нибудь еще ответить, как изменить CamelCase на camel_case?

Ответы [ 6 ]

40 голосов
/ 03 марта 2011

Возможно, вы захотите попробовать плагин Abolish от Tim Pope. Он предоставляет несколько сочетаний клавиш для принуждения от одного стиля к другому. Например, начиная с:

MixedCase

Набрав crc [мнемоника: CoeRce to Camelcase] даст вам:

mixedCase

Набрав crs [мнемоника: CoeRce to Snake_case] даст вам:

mixed_case

И, набрав crm [мнемоника: CoeRce to MixedCase] ​​вернет вас к:

MixedCase

Если вы также установите repeat.vim , то вы можете повторить команды принуждения, нажав клавишу с точкой.

22 голосов
/ 03 марта 2011

Это немного долго, но, кажется, делает работу:

:%s/\<\u\|\l\u/\= join(split(tolower(submatch(0)), '\zs'), '_')/gc

10 голосов
/ 03 марта 2011

Полагаю, мне следовало еще пять минут пытаться.Ну ... если кому-то любопытно:

%s/\(\l\)\(\u\)/\1\_\l\2/gc делает свое дело.

На самом деле, я понял, что это работает для camelCase, но не для CamelCase, который также может быть полезен для кого-то.

5 голосов
/ 30 марта 2015

Я поднял плагин, который делает это.https://github.com/chiedojohn/vim-case-convert

Чтобы преобразовать регистр, выберите блок текста в визуальном режиме и введите одно из следующих значений (не требует пояснений):

:CamelToHyphen :CamelToSnake :HyphenToCamel :HyphenToSnake :SnakeToCamel :SnakeToHyphen

Комупреобразуйте все вхождения в вашем документе, затем выполните одну из следующих команд:

:CamelToHyphenAll :CamelToSnakeAll :HyphenToCamelAll :HyphenToSnakeAll :SnakeToCamelAll :SnakeToHyphen

Добавьте удар (например, CamelToHyphen!) в любую из вышеприведенных команд, чтобы обойти запросы передкаждое преобразование.Возможно, вы не захотите этого делать, так как плагин не будет знать разницу между переменными или другим текстом в вашем файле.

1 голос
/ 03 марта 2011

Для случая CamelCase:

%s#(\<\u\|\l)(\l+)(\u)#\l\1\2_\l\3#gc

Совет: разделители регулярных выражений можно изменить, как в моем примере, чтобы сделать его (несколько) более разборчивым.

0 голосов
/ 04 марта 2011

У меня есть API для обработки, ориентированной на различные разработки. Среди прочего, он предоставляет несколько функций для преобразования имен между (настраиваемыми) соглашениями (переменная <-> атрибут <-> getter <-> setter <-> константа <-> параметр <-> ...) и стилями (camelcase (низкий / высокий) <-> подчеркивания). Эти функции преобразования были заключены в плагин.

Плагин + API можно получить здесь: https://github.com/LucHermitte/lh-dev, для этой задачи преобразования имен, требуется lh-vim-lib

Может использоваться следующим образом:

  • наведите курсор на символ, который вы хотите переименовать
  • введите :NameConvert + желаемый тип конверсии (здесь: underscore). Примечание: эта команда поддерживает автозаполнение.
  • et voilà!
...