vim для цикла "завершающие символы" ошибка - PullRequest
2 голосов
/ 12 января 2012

Почему эта чрезвычайно простая функция:

function! ParseAllEvents()
    let i = 1
    while i > 0 
        exec 'ParseEvent('.i.')'
        let i -= 1
    endwhile
endfunction

и / или:

function! ParseAllEvents()
    let i = 1
    while i > 0 
        ParseEvent(i)
        let i -= 1
    endwhile
endfunction

Сгенерировать эту ошибку?

E488: Конечные символы: ParseEvent (1)

Функция ParseEvent(i) прекрасно работает при вызове в командной строке

1 Ответ

1 голос
/ 13 января 2012

Итак, как мы обсуждали в комментариях, это был вопрос «вызова» функция, добавив :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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...