Привет, коллеги! Вим использует систему регистров для копирования и вставки текста. Регистров много, некоторые (буквы) доступны для записи, то есть в них можно копировать и вырезать текст, другие Вим наполняет для нас сам и мы можем вставлять из них. Есть регистр "черная дыра" _, в который можно записывать, а он всегда пуст.
А есть регистр-выражение. Это знак равенства: =. Когда вы попытаетесь вставить его содержимое, откроется командная строка и в ней можно ввести любое выражение. Оно будет вычислено и результат вставлен в текст. Для выражений ведется отдельная история, так что они не смешиваются с поиском и командами.
Выражение должно давать строковый результат. Число (целое) автоматически превращается в строку. При использовании команд вставки вроде p в строку превратится и вещественное число.
Если результат список, то все его элементы превращаются в строки и склеиваются в одну строку, разделяясь символом конца строки.
Словари и вещественные числа автоматически не преобразуются в строку, но функция string к вашим услугам.
Зачем это может быть нужно?
Это удобно, если вам надо часто делать какие-то расчеты и вставлять результат в текст. Например, вы пишете
Синус 42 градусов приближенно равен
Далее нажимаете <C-R>= и появляется командная строка. Вы пишете в ней
sin(pi/180*42)
и нажимаете ввод. В текст вставляется 0.669131.
Помните только, что переменную pi я заранее определил:
:let pi=acos(-1,0)
Можете даже так:
printf("%.3f", sin(pi/180*42))
и получить 0.669.
Можно вставлять значения переменных, переменных окружения, опций Вим, регистров и любых их комбинаций. Можно же просто выполнить
"=pi<CR>p
Переменную приготовили заранее. "= обращается к регистру и позволяет ввести выражение. Оно состоит из имени переменной. Ввод вычисляет выражение. Команда p вставляет результат.
Вся эта техника работает не только в тексте, а и в командной строке тоже. Сочетание <C-R> позволяет вставить регистр, в том числе и этот. То есть вы можете вычислить часть выражения и вставить уже его результат. Или вставить результат в команду или выражение поиска.
Ещё это удобно, если вы умеете писать функции. Вы можете приготовить функцию для чего угодно и вставить ее значение. Это, конечно, уже гроссмейстерские трюки. Но полезно знать, что такая возможность у вас имеется! Например, можно заранее приготовить функцию Sind, вычисляющую синус угла в градусах.
Последнее. Если вы никакого выражения не указали, то используется последнее использованное. Вы можете задать регистр через let:
:let @= = 6*7
и потом использовать вычисленное значение.
Можно даже просто в нормальном режиме нажать @= и ввести выражение. Оно будет вычислено. Это и в привязках можно использовать, например
:map <F3> 3w
прыгает на три слова по нажатию F3, но с повторителем это работает неинтуитивно: 5 и потом F3 приведет к прыжку на 53 слова, а не на 15, как хотелось бы. Лучше так:
:map <F3> @='3w'<CR>
Теперь в регистр-выражение помещается результат "вычисления" выражения 3w.
Реально удобная вещь, особенно для таких, как я.
Удачи, коллеги.