(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)))
O uso de (interactive "r")
significa que os parâmetros beginning
e end
receberão automaticamente os valores da região inicial e final da região, respectivamente, quando a função for chamada. (Você também pode obter esses valores a qualquer momento usando as funções region-beginning
e region-end
, respectivamente.)
A região está sempre presente (se houver uma marca no buffer atual), mas você pode achar que não. A região está ativa quando é destacada (o texto é selecionado). Você pode testar se a região está ativa usando o predicado region-active-p
. Mas o melhor teste geralmente é use-region-p
porque (por padrão) ele retorna verdadeiro (não nil
) somente quando a região está ativa e não vazia (ponto e marca são diferentes).
Originalmente, não havia destaque na região. E por um longo tempo, embora o destaque estivesse disponível, esse não era o comportamento padrão. Para que ocorra o realce, você deve ter transient-mark-mode
ativado (ou pelo menos temporariamente). Por padrão, transient-mark-mode
está ativado nas versões recentes do Emacs.
É útil examinar a definição de predicado use-region-p
:
(defun use-region-p ()
(and (region-active-p)
(or use-empty-active-region
(> (region-end) (region-beginning)))))
use-empty-active-region
é uma opção do usuário, cujo valor padrão é nil
(true), o que significa que, por padrão use-region-p
, não retornará true se a região estiver vazia. Nesse caso, para retornar verdadeiro, o final da região deve ser maior que o início (o comportamento que descrevi acima).
E se olharmos para a definição de region-active-p
:
(defun region-active-p ()
(and transient-mark-mode
mark-active
(mark)))
Vemos que ele retorna verdadeiro (não nil
) quando tudo isso é verdadeiro:
transient-mark-mode
está ligado.
- A marca está ativa (
mark-active
).
- Há uma marca no buffer atual.
A marca de estar ativo é realmente o objetivo da região. Quando está ativo, assumindo que está ativado transient-mark-mode
e há uma marca no buffer atual, a região é destacada.
C-SPC
M-: mark-active
=> t. Você pode definitivamente ter uma região vazia que, no entanto, está ativa.