Функция может вызываться в интерактивном или неинтерактивном режиме (на самом деле это немного сложнее, но это достаточно хорошее приближение). Режим интерактивного вызова используется для привязки некоторых аргументов функции из текущей среды или путем взаимодействия с пользователем. Неинтерактивный режим - это обычный режим вызова, когда вы пишете в Emacs Lisp.
Как правило, интерактивное поведение объявляется с использованием формы (interactive ...)
после строки документации, но в конкретном случае flush-lines
поведение частично автоматизировано с помощью спецификации interactive
и частично жестко закодировано (для части региона ). Вы можете спросить Emacs, выполняется ли текущий код в интерактивном режиме, вызвав called-interactively-p
, но, как говорят в документе, рекомендуется иметь другой необязательный аргумент, который указывает, является ли вызов интерактивным.
Сигнатура функции:
(flush-lines REGEXP &optional RSTART REND INTERACTIVE)
RSTART
и REND
- начальная и конечная позиции текущей области в виде целых чисел. Они также могут быть nil
. Последний параметр указывает, является ли вызов интерактивным.
Когда вы вызываете flush-lines
из своей анонимной функции, вы вызываете ее неинтерактивно, что означает, что вам нужно явно передавать аргументы в функции.
Для этой функции вы можете просто вызвать ее следующим образом:
(flush-lines "^[[:space:]]*$" nil nil t)
Это заставляет функцию вести себя так, как будто она вызывается в интерактивном режиме, и в этом случае область вычисляется автоматически, поскольку аргументы start и end равны нулю.
В общем случае вам нужно иметь собственное объявление (interactive "r")
и добавить два параметра в анонимную функцию. Например, в буфере *scratch*
вы можете оценить это выражение:
(call-interactively
(lambda (beg end)
(interactive "r")
(list beg end)))
Затем, результатом является список позиций курсора, который представляет ваш регион.
В вашем случае вы бы позвонили, например, (flush-lines "^[[:space:]]*$" beg end)
.