Делать вычисления с регистром выражений
Вы можете делать расчеты как в обычном режиме, так и в режиме вставки.
Нормальный режим
В обычном режиме, если вы печатаете @= курсор переместится в командную строку, где вы можете ввести любое выражение. Когда вы нажмете ввод, результат выражения будет выполнен как команды нормального режима.
Например, предположим, что вы хотите перейти к среднему столбцу текущей строки. Вызов функции col('$')возвращает количество столбцов в строке, поэтому мы можем сделать это, набрав следующее:
@=col('$')/2<CR>|
Когда вы нажимаете ввод, курсор возвращается в буфер, и vim ждет оператора (например |), как будто вы только что ввели число. В качестве альтернативы, вы могли бы ввести это:
@=col('$')/2.'|'
... но, конечно, это больше байтов.
Режим вставки
Вы также можете использовать регистр выражений в режиме вставки, нажав <Ctrl-r>=вместо @=. Он работает так же в обычном режиме, за исключением того, что результат ввода выражения будет выполняться в режиме вставки. Например, если вы набрали<Ctrl-r>=col('$')<CR> , число столбцов в текущей строке будет вставлено в курсор, как если бы вы ввели его.
Для получения дополнительной информации о регистре выражений введите :help "=.
Повторное использование выражений
Последнее использованное вами выражение сохраняется в регистре выражений "=. Ввод @=<CR>в обычном режиме или <Ctrl-r>=<CR>в режиме вставки оценит выражение снова, что позволит вам использовать их так же, как макросы.
Делать расчеты в подстановках
Вы также можете оценивать выражения при выполнении подстановок регулярных выражений. Все, что вам нужно сделать, это начать замену \=. Например, предположим, что вы хотите пронумеровать строки в этом файле:
foo
bar
baz
Вызов функции line('.')возвращает текущий номер строки, поэтому задание легко. Ввод этого:
:s/^/\=line('.').' '/g<CR>
... дает желаемый результат:
1 foo
2 bar
3 baz
Чтобы использовать захваченные группы в таком выражении, вы можете использовать submatch()функцию, которая, например submatch(0), эквивалентна \0обычной замене, submatch(1)эквивалентна и \1т. Д. Это, к сожалению, израсходует много нажатий клавиш.
Для получения дополнительной информации о замене выражений введите :help sub-replace-expression.