(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)))
Zastosowanie (interactive "r")
oznacza, że parametry beginning
i end
automatycznie otrzymają wartości początku regionu i końca regionu, odpowiednio po wywołaniu funkcji. (Możesz również uzyskać te wartości w dowolnym momencie, używając odpowiednio funkcji region-beginning
i region-end
.)
Region jest zawsze obecny (jeśli w bieżącym buforze znajduje się znak), ale możesz nie myśleć, że tak jest. Region jest aktywny, gdy jest podświetlony (zaznaczony jest tekst). Możesz sprawdzić, czy region jest aktywny, używając predykatu region-active-p
. Ale zwykle lepszy jest test use-region-p
, ponieważ (domyślnie) zwraca true (nie nil
) tylko wtedy, gdy region jest zarówno aktywny, jak i niepusty (punkt i znak są różne).
Pierwotnie nie było wyróżnienia regionu. I przez długi czas, mimo że podświetlanie było dostępne, nie było to zachowanie domyślne. Aby nastąpiło wyróżnienie, musisz transient-mark-mode
włączyć (lub włączyć przynajmniej tymczasowo). Domyślnie transient-mark-mode
jest włączony w najnowszych wersjach Emacsa.
Warto przyjrzeć się definicji predykatu use-region-p
:
(defun use-region-p ()
(and (region-active-p)
(or use-empty-active-region
(> (region-end) (region-beginning)))))
use-empty-active-region
to opcja użytkownika, której wartością domyślną jest nil
(prawda), co oznacza, że domyślnie use-region-p
nie zwróci wartości prawda, jeśli region jest pusty. W takim przypadku, aby zwrócił wartość true, koniec regionu musi być większy niż początek (zachowanie, które opisałem powyżej).
A jeśli spojrzymy na definicję region-active-p
:
(defun region-active-p ()
(and transient-mark-mode
mark-active
(mark)))
Widzimy, że zwraca true (nie nil
), gdy wszystkie z nich są prawdziwe:
transient-mark-mode
jest włączony.
- Znak jest aktywny (
mark-active
).
- W bieżącym buforze znajduje się znak.
Aktywny znak jest naprawdę tym, na czym polega aktywny region. Gdy jest aktywny, zakładając, że transient-mark-mode
jest włączony i w bieżącym buforze znajduje się znak, region jest podświetlony.
C-SPC
M-: mark-active
=> t. Zdecydowanie możesz mieć pusty region, który jest jednak aktywny.