Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Новые возможности для строк

Привет, друзья. Вим развивается, и в новых версиях появились новые возможности для строковых литералов. Есть строки в одинарных кавычках: в них все символы означают сами себя, кроме одинарной кавычки, которую надо удваивать, чтобы получить этот символ в строке. Например, '\n' означает именно \n, то есть два символа, а '''' (четыре апострофа) означает строку из одного апострофа. Такие строки удобно использовать для регулярных выражений, передаваемых в функции вроде substitute. Есть строки в двойных кавычках: в них обратный слеш меняет смысл символа. После слеша может идти от одной до трех цифр (это трактуется как восьмеричный(!) код символа); символ x или X и потом одна или две шестнадцатеричные цифры (код символа); символ u и затем до четырех шестнадцатеричных цифр (это тоже код символа, обычно в Юникоде); то же для U, цифр до восьми (если вам нужны символы с длинными кодами). Еще могут быть символы \b (это символ <BS>, который обычно удаляет предыдущий символ), \e (<ESC>), \n (перево

Привет, друзья. Вим развивается, и в новых версиях появились новые возможности для строковых литералов.

Ну вот так это увидела сеть Problembo
Ну вот так это увидела сеть Problembo

Есть строки в одинарных кавычках: в них все символы означают сами себя, кроме одинарной кавычки, которую надо удваивать, чтобы получить этот символ в строке. Например, '\n' означает именно \n, то есть два символа, а '''' (четыре апострофа) означает строку из одного апострофа. Такие строки удобно использовать для регулярных выражений, передаваемых в функции вроде substitute.

Есть строки в двойных кавычках: в них обратный слеш меняет смысл символа. После слеша может идти от одной до трех цифр (это трактуется как восьмеричный(!) код символа); символ x или X и потом одна или две шестнадцатеричные цифры (код символа); символ u и затем до четырех шестнадцатеричных цифр (это тоже код символа, обычно в Юникоде); то же для U, цифр до восьми (если вам нужны символы с длинными кодами). Еще могут быть символы \b (это символ <BS>, который обычно удаляет предыдущий символ), \e (<ESC>), \n (перевод строки), \t (табуляция), \\ (обратный слеш), \" (кавычка) и ряд других. Ещё допускаются спецклавиши в уголковой нотации: \<C-W>, \<ESC>, и так далее.

Приятное новшество - это интерполяция строк. Перед открывающей кавычкой, одинарной или двойной, ставим символ $, и тогда внутри строки выражение в фигурных скобках будет вычислено, результат преобразован в строку и подставлен. Например,

echo $"6*7={6*7}"

выведет текст 6*7=42

В остальном различие между одинарными и двойными кавычками то же самое.

Помимо выражений, можно интерполировать регистры @q, опции &textwidth и переменные окружения $PATH.

Напомню, что в Перл интерполяция переменных всегда была:

print "A=$A"

а вычисляемая интерполяция доступна через "идиому":

print "6*7=@{[6*7]}"

Здесь выражение 6*7 вычисляется внутри квадратных скобок, который создают ссылку на массив (из одного элемента), символ @{} превращает это ссылку в список (из одного элемента), и этот список-элемент вставляется в текст.

В Ruby есть вычисляемая интерполяция, а в Питоне почти такая же конструкция, как в Вим: f-строки.

Для конкатенации строк используется точка ЛИБО две точки:

"VIM" . " hacker"

это то же самое, что

"VIM" .. " hacker"

Предпочтительнее пара точек, так как одна точка используется для много чего другого: доступа к элементам словарей или как десятичная точка. Использование точки вообще недоступно в vim9 и может не быть доступно в скриптах "классического" языка Вим, если выставить версию 2 и выше командой :scriptversion.

Конкатенация имеет тот же приоритет, что и сложение с вычитанием. Учитывая автоматическое приведение типов для целых чисел, имеем:

4 .. 2 - 18 даст 24, тогда как 4 .. 2 / 6 даст 40 (целочисленное 2/6 есть нуль).

А вот 4 .. 2.0 / 6 даст совсем неожиданные 420. Дело в том, что вещественные числа в Вим 8 не конвертируются в строку автоматически, так что точка между 2 и 0 трактуется как конкатенация (вот потому ее и отменяют потихоньку!) Получаем сначала 0/6=0, потом 2 . 0 = 20, потом 4 .. 20 = 420.

Лучше вообще с вещественными числами не заигрывать в таком стиле, это вам не Перл. Да и нужды обычно нет: используйте string или, лучше, printf.