回答:
(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ます。)
リージョンは常に存在します(現在のバッファーにマークがある場合)が、そうではないと思うかもしれません。リージョンは、強調表示されている(テキストが選択されている)ときにアクティブになります。predicateを使用して、リージョンがアクティブかどうかをテストできregion-active-pます。ただし、領域がアクティブで空でない(ポイントとマークが異なる)場合にのみuse-region-p(デフォルトで)true(非nil)を返すため、より良いテストは通常です。
もともと、地域のハイライトはありませんでした。そして、長い間、強調表示が利用可能であったとしても、それはデフォルトの動作ではありませんでした。強調表示を行うには、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これらすべてが真の場合、真(非)を返すことがわかります。
transient-mark-mode オンになっています。mark-active)。アクティブなマークは、実際にアクティブな領域がすべてであるものです。それがアクティブで、それtransient-mark-modeがオンで、現在のバッファにマークがあると仮定すると、領域は強調表示されます。
C-SPC M-: mark-active=> t。それにもかかわらず、アクティブな空の領域を確実に持つことができます。