22

Emacs バッファー内の選択にアクセスする必要があります。この記事を見つけましたEmacs Lispで現在の領域のコンテンツにアクセスするにはどうすればよいですか? そしてそれは私を大いに助けます。

しかし問題がある。初めてリージョンを選択 (強調表示) したときは問題なく動作しましたが、Cg を押して、文字を強調表示せずに通常どおりカーソルを別の場所に移動すると、最後のマークから現在のポイントまでの文字列を取得しましたが、空のマークが期待されます。 .

実際には、現在の選択 (強調表示) を文字列として返す関数、または何も強調表示されていない場合は空の文字列を返す関数を実装する必要があります。次のコードは、私をより明確に表現しているかもしれません。


(defun get-search-term ()
  (interactive)
  (let (
        (selection (buffer-substring-no-properties (region-beginning) (region-end))))
    (if (= (length selection) 0)
        (message "empty string")
      (message selection))))

助言がありますか?どうもありがとう!

4

2 に答える 2

31

interactive の "r" 仕様はばかげています。あなたはその理由を見ています。

(defun get-search-term (beg end)
  "message region or \"empty string\" if none highlighted"
  (interactive (if (use-region-p)
                   (list (region-beginning) (region-end))
                 (list (point-min) (point-min))))
  (let ((selection (buffer-substring-no-properties beg end)))
    (if (= (length selection) 0)
        (message "empty string")
      (message selection))))

愚かで役に立たないという意味ではありません。マークがアクティブかどうかは気にしないというだけです。私はそれがtransient-mark-modeよりも前にあると思います。

EDIT(point-min)上記を2回使用すると、コードを読み直すときにコードが理解しにくくなります。より良い実装は次のとおりです。

(defun get-search-term (beg end)
  "message region or \"empty string\" if none highlighted"
  (interactive (if (use-region-p)
                   (list (region-beginning) (region-end))
                 (list nil nil)))
  (message "%s" (if (and beg end)
                    (buffer-substring-no-properties beg end)
                  "empty string")))
于 2012-05-15T06:21:25.423 に答える
1

変数 mark-active を確認してください。Ch v マークアクティブ

==> mark-active は「C ソース コード」で定義されている変数です。その値はバッファApr​​oposの nil Localです。グローバル値はゼロです

何らかの方法で設定すると、自動的にバッファーローカルになります。

ドキュメンテーション: 非 nil は、マークとリージョンが現在このバッファでアクティブであることを意味します。

(defun get-search-term ()
  (interactive)
  (if mark-active
      (let (
        (selection (buffer-substring-no-properties (region-beginning) (region-end))))
    (if (= (length selection) 0)
        (message "empty string")
      (message selection))
    )
    (error "mark not active"))
  )
于 2012-05-15T16:22:27.003 に答える