(defun some-function (beginning end)
(interactive "r")
(if (use-region-p)
(message "The region is active, and is from %d to %d" beginning end)
(message "The region is still there (from % d to %d), but it is inactive"
beginning end)))
Использование (interactive "r")
означает, что параметры beginning
и end
автоматически получат значения начала области и конца области соответственно при вызове функции. (Вы также можете получить эти значения в любое время, используя функции region-beginning
и region-end
, соответственно.)
Регион всегда присутствует (если в текущем буфере есть метка), но вы можете об этом не думать. Регион активен, когда он выделен (выделен текст). Вы можете проверить, активен ли регион, используя предикат region-active-p
. Но лучшим тестом обычно является то use-region-p
, что (по умолчанию) он возвращает значение true (не nil
) только тогда, когда область является активной и непустой (точка и метка различаются).
Первоначально не было никакого выделения региона. И в течение долгого времени, хотя выделение было доступно, это не было поведением по умолчанию. Чтобы подсветка произошла, вы должны были transient-mark-mode
включить (или включить хотя бы временно). По умолчанию transient-mark-mode
включен в последних версиях Emacs.
Полезно взглянуть на определение предиката use-region-p
:
(defun use-region-p ()
(and (region-active-p)
(or use-empty-active-region
(> (region-end) (region-beginning)))))
use-empty-active-region
это пользовательский параметр, значение по умолчанию nil
(true), означающее, что по умолчанию use-region-p
не будет возвращать true, если область пуста. В этом случае, чтобы он возвращал значение true, конец области должен быть больше начала (поведение, которое я описал выше).
И если мы посмотрим на определение region-active-p
:
(defun region-active-p ()
(and transient-mark-mode
mark-active
(mark)))
Мы видим, что он возвращает true (не nil
), когда все они верны:
transient-mark-mode
включен
- Знак активен (
mark-active
).
- В текущем буфере есть отметка.
Активный знак - это действительно то, что представляет собой активный регион. Когда он активен, при условии, что transient-mark-mode
он включен и в текущем буфере есть метка, область подсвечивается.