選択した領域のみにコマンドを適用するためのElisp


18

たとえば、次のようなコードがあります。

(defun some-function ()
  (interactive)
  ;; do something
  )

今、私some-functionはバッファ内の選択された領域でのみ操作したいですか?どうやってやるの ?また、ある領域を選択した場合に何かを実行し、選択していない場合に別の何かを実行するための2つの個別のコードパスがあります。

回答:


22
(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がオンで、現在のバッファにマークがあると仮定すると、領域は強調表示されます。


AFAICSマークがポイントに設定されている場合、つまりリージョンが拡張されていない場合、mark-activeはnilです。したがって、これらのかなり冗長な機能に価値を追加するのは、マークアクティブモードとトランジェントマークモードだけです。
アンドレアスレーラー

1
@AndreasRöhler:いいえ。C-SPC M-: mark-active=> t。それにもかかわらず、アクティブな空の領域を確実に持つことができます。
ドリュー

わかった、ありがとう。それでも、mark-activeおよびregion-active-p-拡張ゼロとして定義-がすべて必要であると考えます。
アンドレアスレーラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.