Приветствую, с вами рубрика про Вим! Сегодня поговорим о регистре букв.
Есть языки, в которых различаются строчные и прописные буквы. Таких алфавитов четыре: латиница, кириллица, греческий и армянский. В иврите, арабском, деванагари, японских канах и китайских иероглифах такого нет. С другой стороны, помимо нижнего и верхнего регистра, в ряде языков есть еще титульный регистр. Это когда заглавной становится лишь одна буква из двух, причем в одном символе их две. До 1994 года такая буква была в испанском алфавите, даже две: ch и ll, еще в каком-то варианте латиницы была буква dz. В норвежском вроде есть æ (Æ?). Еще бывают сюрпризы с обратимостью: немецкая буква ß (эсцет) в верхнем регистре дает SS, а переход обратно в нижний дает ss. Или греческая σ (сигма) пишется на конце слова как ς, а в верхнем регистре обе они Σ.
Впрочем, если вы работаете с соответствующим языком, то знаете его тонкости. А они описаны в такой вещи, как локаль.
Будем исходить из того, что мы работаем с латиницей (английской или какой-нибудь без особой экзотики, с диакритикой, например) и с русской кириллицей. Как обстоят дела с кириллицей национальных языков Российской Федерации — я не знаю, но, может быть, когда-нибудь узнаю и поделюсь.
Посмотрим же, что нам предлагает Вим в области смены регистра букв!
Прежде всего, это команда ~ (тильда). Если выключена опция tildeop (:set notildeop), то она меняет регистр буквы под курсором. Или выделенного (v, V или <C-V>) текста. Можно указать число перед командой, чтобы обработать данное число символов: 42~.
Если опция включена (:set tildeop), то это оператор, и после него дается команда движения. Например, ~l (один символ) или ~$ (до конца строки) или ~G (до конца файла). Для выделения все так же.
Опцию лучше не включать (по умолчанию она выключена), потому что есть команда g~ плюс движение, которая так и работает.
Для всей строки есть особые средства: g~~ и g~g~.
Тильда меняет регистр, переводя "А" в "а" и наоборот. Есть преобразования в одну сторону: в верхний регистр или в нижний. Так, можно применить команды U и u к выделению (без выделения это отмена действий!) для перевода выделенного текста в верхний или нижний регистр.
Для указания текста командой движения, используйте gU и gu. Например, gUE озаглавит буквы до конца слова. Пример из справки Вим:
:map! <C-F> <Esc>gUiw`]a
В режиме вставки сочетание <C-F> выйдет из режима вставки, переведет слово в верхний регистр, встанет на его конец и включит режим вставки. А так:
:map! <C-Q> <Esc>B~Ea
можно озаглавить только первую букву слова.
Для всей строки есть gUU, gUgU, guu и gugu. Первая пара синонимична и вторая тоже.
Кроме того, можно воспользоваться заменой. В выражении замены символы \U, \L, \u, \l означают переход в верхний регистр (\U и \u) и нижний регистр (\L, \l). Разница между \U и \u в том, что первая озаглавивает все до конца выражения замены или до символа \E, а вторая — только одну букву.
Так,
:s/\v<(.)(\w*)/\u\1\L\2/g
озаглавит все слова в строке: первая буква станет заглавной, а остальные строчными. То есть, строка "к вОпрОсУ о НекОТорыХ проБЛЕмах" перейдет в "К Вопросу О Некоторых Проблемах".
Можно перевести в верхний регистр все, что вы нашли, очень простым выражением замены: \U&. Например, озаглавить все слова можно так:
:s/\<\S/\u&/g
Изящно и красиво!
В заключение добавлю, что всё сказанное работает также и с буквами с диакритикой: á, à, â, ä, å, ç, û, ø и т.д. С нашей "ё" — тоже. Очаровательная буква æ переходит в Æ — ау, норвеги, это то, что вы ожидали? Эсцет у меня не меняет регистр, а греческие — меняют, причем сигма-концевая (ς) после двух тильд становится сигмой обычной (σ).
Это экзотика, вряд ли вам вот реально надо менять регистр греческих букв. А в целом, такие возможности бывают очень полезны: при редактировании текстов статей и особенно при программировании.
До встречи, коллеги!