Как передать аргументы в функцию Elisp? - PullRequest
2 голосов
/ 07 марта 2019

У меня есть эта раскладка клавиш для очистки пустых строк, например:

(global-set-key (kbd "M-T") (lambda () (interactive) (flush-lines "^[[:space:]]*$")))

Но это не работает в регионе.Несвязанные линии вне региона сливаются.Но когда я выбираю регион и вручную пробую Mx flush-lines RET ^ [[: space:]] * $ RET, все работает как положено.Что я делаю не так?

1 Ответ

5 голосов
/ 07 марта 2019

Функция может вызываться в интерактивном или неинтерактивном режиме (на самом деле это немного сложнее, но это достаточно хорошее приближение). Режим интерактивного вызова используется для привязки некоторых аргументов функции из текущей среды или путем взаимодействия с пользователем. Неинтерактивный режим - это обычный режим вызова, когда вы пишете в 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...