| ч23. операторы сравнения >,<, ==, ==?, ==# | Содержание | ч25. Аргументы функции |
Как и в большинстве языков программирования, в Vimscript есть функции. Давайте посмотрим, как их создавать, а затем поговорим о некоторых их особенностях.
Выполните следующую команду:
:function meow()
Вы можете подумать, что это приведет к определению функции с именем meow. К сожалению, это не так, мы уже столкивались с одной из причуд Vimscript, вот вам ещё одна.
Функции Vimscript должны начинаться с заглавной буквы, если только они не являются частью другой функции.
Даже если ваша функция находится в области видимости другой функции (мы поговорим об этом позже), вы все равно можете использовать заглавные буквы в имени функции. Большинство программистов Vimscript, делают именно так, поэтому не нарушайте традицию.
Хорошо, давайте на этот раз определим функцию по правилам. Выполните следующие команды:
:function Meow()
: echom "мяу!"
:endfunction
На этот раз Vim с радостью определит функцию. Давайте попробуем запустить его:
:call Meow()
Vim выведет: [ мяу! ] так, как ожидалось.
Давайте попробуем вернуть значение из функции. Выполните следующие команды:
:function GetMeow()
: return "Строка мяу!"
:endfunction
Теперь попробуйте, выполнив эту команду:
:echom GetMeow()
Vim вызовет функцию и выдаст результат для echom, который выведет строку [ Строка мяу! ]
Вызов функций
Мы уже видели, что в Vimscript есть два разных способа вызова функций.
Когда вы хотите вызвать функцию напрямую, вы используете команду [call] Выполните следующие команды:
:call Meow()
:call GetMeow()
Первая функция выведет [ мяу! ], а вторая ничего не отобразит, так как при использовании call возвращаемое значение отбрасывается, это может быть полезно только тогда, когда функция имеет побочные эффекты.
Второй способ вызова функций это в выражениях. В этом случае вам не нужно использовать call, вы можете просто назвать функцию. Выполните следующую команду:
:echom GetMeow()
Как мы видели ранее, это вызовет GetMeow и передаст возвращаемое значение в echom.
Неявный возврат
Выполните следующую команду:
:echom Meow()
При таком вызове Vim выведет : [ мяу! ] и [ 0 ]. Первый вывод это очевидно вывод echom и он выводиться из тела функции Meow(). Второй вывод [ 0 ] показывает нам, что если функция Vimscript не возвращает значение, она возвращает неявно 0. Давайте используем это. Выполните следующие команды:
:function TextwidthIsTooWide()
: if &l:textwidth ># 80
: return 1
: endif
:endfunction
Эта часть [ if &l:textwidth ># 80 ] использует множество важных концепций, которые мы раньше изучали:
- Инструкции if
- Обработка параметров как переменных
- Локализация этих переменных параметров
- Сравнение с учетом регистра
Если что-то из этого вам кажется незнакомым, вам следует прочитать мои предыдущие статьи где каждую часть мы разбирали.
Мы определили функцию, которая сообщает нам, является ли значение textwidth в текущем буфере "слишком широким" .
Давайте потестируем её. Выполните следующие команды:
set textwidth=80
:if TextwidthIsTooWide()
: echom "WARNING: Wide text!"
:endif
Что мы здесь сделали?
- Вначале мы устанавливаем глобальное значение 80 для textwidth.
- Затем мы выполнили оператор if, который проверил, возвращает ли функция TextwidthIsTooWide() истину (1) или ложь (0).
- В данном случаи функция вернула ложь, поэтому тело if не было выполнено.
Поскольку мы явно не возвращали значение из функции TextwidthIsTooWide(), а Vim по умолчанию возвращает 0 то есть ложь, то оператор if не будет выполнен. Давайте попробуем это изменить. Выполните следующие команды:
:setlocal textwidth=100
:if TextwidthIsTooWide()
: echom "WARNING: Wide text!"
:endif
На этот раз оператор if выполнит свое тело, так как функция TextwidthIsTooWide() вернет 1.
Упражнения
Прочти :help :call. Сколько аргументов вы можете передать функции? Вас это удивило?
Прочитайте :help E124 и узнайте, какие символы вам разрешено использовать в именах функций. Можно ли использовать символы подчеркивания? Тире? Символы с ударением? Символы Юникода? Если не можете разобраться, просто попробуйте объявить функцию с этими символами.
Прочти: help return. Какая "краткая форма" этой команды? ( Помните я вам говорил никогда не использовать краткие команды?) Вы ожидали краткую формы return именно это? Вот поэтому не ленитесь и набирайте команды полностью.
| ч23. операторы сравнения >,<, ==, ==?, ==# | Содержание | ч25. Аргументы функции |