Ответ 1
Это немного длиннее, но, похоже, выполняет эту работу:
:%s/\<\u\|\l\u/\=len(submatch(0)) == 1 ? tolower(submatch(0)) : submatch(0)[0].'_'.tolower(submatch(0)[1])/gc
Если по какой-то причине я хочу выборочно преобразовать camelCase с именами в подчеркивание, разделенное в vim, как я могу это сделать?
В настоящее время я обнаружил, что могу выполнить поиск /s[a-z][A-Z]
и записать макрос, чтобы добавить символ подчеркивания и преобразовать в нижний регистр, но мне любопытно, могу ли я сделать это с чем-то вроде:
%s/([a-z])([A-Z])/\1\u\2/gc
Спасибо заранее!
EDIT: Я выяснил ответ для camelCase (это то, что мне действительно нужно), но может ли кто-нибудь еще ответить, как изменить CamelCase на camel_case?
Это немного длиннее, но, похоже, выполняет эту работу:
:%s/\<\u\|\l\u/\=len(submatch(0)) == 1 ? tolower(submatch(0)) : submatch(0)[0].'_'.tolower(submatch(0)[1])/gc
Возможно, вы захотите попробовать Abolish плагин Тима Папы. Он предоставляет несколько ярлыков для принуждения от одного стиля к другому. Например, начиная с:
MixedCase
Ввод crc
[мнемоника: CoeRce to Camelcase] даст вам:
MixedCase
Ввод crs
[мнемоника: CoeRce to Snake_case] даст вам:
mixed_case
И набрав crm
[mnemonic: CoeRce to MixedCase], вы вернетесь к:
MixedCase
Если вы также установите repeat.vim, вы можете повторить команды принуждения, нажав клавишу точки.
Полагаю, я должен был продолжать пробовать еще около 5 минут. Ну... если кому-то интересно:
%s/\(\l\)\(\u\)/\1\_\l\2/gc
делает трюк.
Собственно, я понял, что это работает для camelCase, но не CamelCase, который также может быть полезен для кого-то.
Я взломал плагин, который делает это. https://github.com/chiedojohn/vim-case-convert
Чтобы преобразовать случай, выберите блок текста в визуальном режиме и введите одно из следующих (самостоятельно объяснительное):
:CamelToHyphen
:CamelToSnake
:HyphenToCamel
:HyphenToSnake
:SnakeToCamel
:SnakeToHyphen
Чтобы преобразовать все происшествия в ваш документ, выполните одну из следующих команд:
:CamelToHyphenAll
:CamelToSnakeAll
:HyphenToCamelAll
:HyphenToSnakeAll
:SnakeToCamelAll
:SnakeToHyphen
Добавьте сообщение об ошибке (например: CamelToHyphen!) в любую из приведенных выше команд, чтобы обойти подсказки перед каждым преобразованием. Возможно, вы не захотите это сделать, поскольку плагин не будет знать разницу между переменными или другим текстом в вашем файле.
Для случая CamelCase:
%s#(\<\u\|\l)(\l+)(\u)#\l\1\2_\l\3#gc
Совет. Ограничения регулярного выражения могут быть изменены, как в моем примере, чтобы сделать его (несколько) более разборчивым.
У меня есть API для различных ориентированных на развитие обработки. Помимо прочего, он предоставляет несколько функций для преобразования имен между (настраиваемыми) соглашениями (переменная ↔ attribute ↔ getter ↔ setter ↔ constant ↔ parameter ↔ ..) и стилей (верблюд (низкий/высокий) ↔ подчеркивание). Эти функции преобразования были перенесены в плагин.
Плагин + API можно получить здесь: https://github.com/LucHermitte/lh-dev, для этой задачи преобразования имен требуется lh-vim-lib
Его можно использовать следующим образом:
:NameConvert
+ тип конверсии, который вы хотите (здесь: underscore
). NB: эта команда поддерживает автозаполнение.