(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)))
L'uso di (interactive "r")
significa che i parametri beginning
e end
riceveranno automaticamente i valori dell'inizio e della fine della regione, rispettivamente, quando viene invocata la funzione. (Puoi anche ottenere quei valori in qualsiasi momento usando le funzioni region-beginning
e region-end
, rispettivamente.)
La regione è sempre presente (se è presente un segno nel buffer corrente), ma potresti non pensare che lo sia. La regione è attiva quando è evidenziata (il testo è selezionato). È possibile verificare se la regione è attiva utilizzando predicato region-active-p
. Ma il test migliore è di solito use-region-p
, perché (per impostazione predefinita) restituisce true (non- nil
) solo quando la regione è attiva e non vuota (punto e segno sono diversi).
Inizialmente, non vi era alcun evidenziamento della regione. E per molto tempo, anche se l'evidenziazione era disponibile, non era il comportamento predefinito. Perché si verifichi l'evidenziazione, è necessario aver transient-mark-mode
attivato (o attivato almeno temporaneamente). Per impostazione predefinita, transient-mark-mode
è attivato nelle versioni recenti di Emacs.
È utile esaminare la definizione di predicato use-region-p
:
(defun use-region-p ()
(and (region-active-p)
(or use-empty-active-region
(> (region-end) (region-beginning)))))
use-empty-active-region
è un'opzione utente, il cui valore predefinito è nil
(true), il che significa che per impostazione predefinita use-region-p
non restituirà true se l'area è vuota. In tal caso, affinché ritorni vero, la fine della regione deve essere maggiore dell'inizio (il comportamento che ho descritto sopra).
E se guardiamo alla definizione di region-active-p
:
(defun region-active-p ()
(and transient-mark-mode
mark-active
(mark)))
Vediamo che restituisce true (non- nil
) quando tutti questi sono true:
transient-mark-mode
è acceso.
- Il segno è attivo (
mark-active
).
- C'è un segno nel buffer corrente.
Il marchio attivo è proprio ciò che riguarda la regione attiva. Quando è attivo, supponendo che sia attivo e che transient-mark-mode
sia presente un segno nel buffer corrente, l'area viene evidenziata.