Итак, как мы обсуждали в комментариях, это был вопрос «вызова»
функция, добавив :call
.
Обычно функция будет оцениваться везде, где ожидается выражение,
однако это не означает, что они оцениваются непосредственно в вашем сценарии,
поскольку скрипт Vim - это просто цепочка команд ex (те, которые начинаются с
двоеточие). Функция не является командой ex.
Давайте перейдем к практической стороне, посмотрим, что написано в руководстве пользователя.
глава 41:
41,3 Выражения
Vim предлагает богатый, но простой способ обработки выражений. Вы можете прочитать
определение здесь: | выражение-синтаксис |. Здесь мы покажем самые распространенные
товар.
Указанные выше числа, строки и переменные являются выражениями
самих себя. Таким образом, везде, где ожидается выражение, вы можете использовать число,
строка или переменная. Другие основные элементы в выражении:
$NAME environment variable
&name option
@r register
Приведенные здесь выражения не являются командами ex. Большую часть времени
выражения оцениваются в аргументах команд. Это выражение Vim:
i+=1
Но вы не можете использовать его непосредственно в скрипте Vim, поскольку это не команда ex. Вы
нужно что-то вроде:
:let i+=1
Теперь проверьте справку для :let
:
:let {var-name} = {expr1} :let E18
Set internal variable {var-name} to the result of the
expression {expr1}. The variable will get the type
from the {expr}. If {var-name} didn't exist yet, it
is created.
Мы ищем {expr1}
. Это означает, что выражение ожидается - это
что вы должны проверить перед использованием команды ex.
Возвращаясь к функциям, обратите внимание, что команда :call
позволяет вам вызывать
функция в бывшем контексте.
Так что, если используемая команда ожидает аргумент выражения, продолжайте и
включить ваши функции и другие обычные вещи. Они будут оценены,
переменные будут иметь свое значение "уступлено" и так далее. :execute
приходит
удобно, если команда принимает текстовый аргумент. Например, если вам нужно переехать
текущая строка с номером строки, хранящейся в переменной, вы можете использовать :m
команда. Помощь:
:[range]m[ove] {address} :m :mo :move E134
Move the lines given by [range] to below the line
given by {address}.
Как видите, адрес ожидается непосредственно, а не выражение. если ты
иметь номер в переменной с именем line
и сделать это:
:m line
Это ошибка, потому что нет строки с номером line
. Тогда вам нужно
:exec
чтобы оценить выражение перед его выполнением - вот что оно делает,
принимает выражение в качестве аргумента, вычисляет его и выполняет как команду ex.
:exec "m " . line
" ^^^^^^^^^^^
" This expression evaluates to, say, "m 14" which is then executed