Answers:
(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
,因为(默认情况下)(nil
仅当区域同时处于活动状态和非空状态(点和标记不同)时,它才返回true(非))。
最初,该区域没有突出显示。长期以来,即使突出显示可用,也不是默认行为。为了突出显示,您必须已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)))
我们看到,nil
当所有这些都为真时,它将返回true(非):
transient-mark-mode
已开启。mark-active
)。激活标记实际上就是激活区域的全部含义。当它处于活动状态时,假设它transient-mark-mode
已打开并且当前缓冲区中有一个标记,则该区域将突出显示。
C-SPC
M-: mark-active
=> t。您肯定可以有一个仍然活跃的空白区域。