回答:
(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。それにもかかわらず、アクティブな空の領域を確実に持つことができます。