Делать вычисления с регистром выражений
Вы можете делать расчеты как в обычном режиме, так и в режиме вставки.
Нормальный режим
В обычном режиме, если вы печатаете @=
курсор переместится в командную строку, где вы можете ввести любое выражение. Когда вы нажмете ввод, результат выражения будет выполнен как команды нормального режима.
Например, предположим, что вы хотите перейти к среднему столбцу текущей строки. Вызов функции 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
.