Найти в Дзене
Vim

VimScript 25 [ Арументы функции ]

| ч24. Функции | Содержание | ч26. Числа | Функции Vimscript могут принимать аргументы. Выполните следующие команды: :function DisplayName(name)
: echom "Привет! Меня зовут: "
: echom a:name
:endfunction Запустите функцию: :call DisplayName("Ваше Имя") Vim отобразит две строки: [ Привет! Меня зовут: ] и [ Ваше Имя ]. Обратите внимание на префикс [ a: ] в имени переменной, которую мы передали echom команде. Он представляет собой область видимости переменной, о которой мы говорили в предыдущей статье. Давайте попробуем удалить этот префикс и посмотрим, как на это отреагирует Vim. Выполните следующие команды: :function UnscopedDisplayName(name)
: echom "Привет! Меня зовут: "
: echom name
:endfunction
:call UnscopedDisplayName("Ваше Имя") На этот раз Vim жалуется, что не может найти переменную [ name ]. Когда вы пишете функцию Vimscript, которая принимает аргументы, вам всегда нужно ставить префикс [ a: ] перед теми аргументами которые вы используете, для того чтобы сообщить Vim, ч
Оглавление

| ч24. Функции | Содержание | ч26. Числа |

Функции Vimscript могут принимать аргументы. Выполните следующие команды:

:function DisplayName(name)
: echom "Привет! Меня зовут: "
: echom a:name
:endfunction

Запустите функцию:

:call DisplayName("Ваше Имя")

Vim отобразит две строки: [ Привет! Меня зовут: ] и [ Ваше Имя ].

Обратите внимание на префикс [ a: ] в имени переменной, которую мы передали echom команде. Он представляет собой область видимости переменной, о которой мы говорили в предыдущей статье.

Давайте попробуем удалить этот префикс и посмотрим, как на это отреагирует Vim. Выполните следующие команды:

:function UnscopedDisplayName(name)
: echom "
Привет! Меня зовут: "
: echom name
:endfunction
:call UnscopedDisplayName("
Ваше Имя")

На этот раз Vim жалуется, что не может найти переменную [ name ].

Когда вы пишете функцию Vimscript, которая принимает аргументы, вам всегда нужно ставить префикс [ a: ] перед теми аргументами которые вы используете, для того чтобы сообщить Vim, что они находятся в области видимости аргументов.

Переменные

Функции Vimscript могут принимать списки аргументов различной длины, так же как Javascript или Python. Выполните следующие команды:

:function Varg(...)
: echom a:0
: echom a:1
: echo a:000
:endfunction

:call Varg("a", "b")

Эта функция показывает нам несколько интересных вещей, поэтому давайте рассмотрим каждую из них по отдельности.

[ ... ] В определении функции означает, что эта функция может принимать любое количество аргументов. Это похоже на *args аргумент в функции Python.

[ a:0 ] выводит [ 2 ], это количество аргументов которые были переданы функции.

[ a:1 ] выводит [ а ], эта команда выводит первый переданный элемент. Для вывода второго элемента используем [ a:2 ]. Отсчёт идёт с единицы, так как ноль у нас хранит количество переданных аргументов (смотри выше)

[ a:000 ] выводит список [ 'a', 'b' ], так как [ echom ] не может использоваться со списком, мы использовали [ echo ] для этого списка.

Вы также можете использовать переменные вместе с обычными аргументами. Выполните следующие команды:

:function Varg2(foo, ...)
: echom a:foo
: echom a:0
: echom a:1
: echo a:000
:endfunction

:call Varg2("hello", "b", "c")

Как мы можем видеть, строка [ hello ] у нас помещается в именованный аргумент функции [ a:foo ], а остальные аргументы переменные передаются в виде списка так же как в предыдущем примере.

Присваивание

Попробуйте выполнить следующие команды:

:function Assign(foo)
: let a:foo = "Пустышка"
: echom a:foo
:endfunction

:call Assign("тест")

Vim выдаёт ошибку, так как мы не можем переопределить переменную аргумента. Теперь выполните эти команды:

:function AssignGood(foo)
: let foo_tmp = a:foo
: let foo_tmp = "ура"
: echom foo_tmp
:endfunction

:call AssignGood("тест")

На этот раз функция работает как надо. Вывод функции будет: ура.

Упражнения

Прочитайте первые два абзаца :help function-argument.

Прочитайте: help local-variables.

| ч24. Функции | Содержание | ч26. Числа |