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

VimScript 24 [ Функции ]

Оглавление

| ч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. Аргументы функции |