(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)))
El uso de (interactive "r")
significa que los parámetros beginning
y end
recibirán automáticamente los valores del comienzo de la región y el final de la región, respectivamente, cuando se invoca la función. (También puede obtener esos valores en cualquier momento utilizando las funciones region-beginning
y region-end
, respectivamente).
La región siempre está presente (si hay una marca en el búfer actual), pero es posible que no piense que es así. La región está activa cuando está resaltada (el texto está seleccionado). Puede probar si la región está activa utilizando predicado region-active-p
. Pero la mejor prueba suele ser use-region-p
, porque (por defecto) devuelve verdadero (no nil
) solo cuando la región está activa y no vacía (el punto y la marca son diferentes).
Originalmente, no se destacaba la región. Y durante mucho tiempo, aunque el resaltado estaba disponible, no era el comportamiento predeterminado. Para que se resalte, debe haber transient-mark-mode
activado (o activado al menos temporalmente). Por defecto, transient-mark-mode
está activado en versiones recientes de Emacs.
Es útil mirar la definición 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
es una opción de usuario, cuyo valor predeterminado es nil
(verdadero), lo que significa que, por defecto use-region-p
, no devolverá verdadero si la región está vacía. En ese caso, para que regrese verdadero, el final de la región debe ser mayor que el principio (el comportamiento que describí anteriormente).
Y si miramos la definición de region-active-p
:
(defun region-active-p ()
(and transient-mark-mode
mark-active
(mark)))
Vemos que devuelve verdadero (no nil
) cuando todos estos son verdaderos:
transient-mark-mode
está prendido.
- La marca está activa (
mark-active
).
- Hay una marca en el búfer actual.
La marca de estar activo es realmente de lo que se trata la región de estar activo. Cuando está activo, suponiendo que está activado transient-mark-mode
y hay una marca en el búfer actual, la región se resalta.
C-SPC
M-: mark-active
=> t. Definitivamente puede tener una región vacía que, sin embargo, está activa.