branch: externals/compat
commit 2aa415a6fa0ab87802e79b119f09746080425bc6
Author: Daniel Mendler <[email protected]>
Commit: Daniel Mendler <[email protected]>
compat-29: Add use-region-noncontiguous-p
---
NEWS.org | 4 +++-
compat-25.el | 9 ++++++++-
compat-26.el | 13 +++++++++++++
compat-29.el | 4 ++++
compat-tests.el | 32 ++++++++++++++++++++++++++++++++
compat.texi | 20 ++++++++++++++++++++
6 files changed, 80 insertions(+), 2 deletions(-)
diff --git a/NEWS.org b/NEWS.org
index 0a370bbcd0..0cd51fbbe7 100644
--- a/NEWS.org
+++ b/NEWS.org
@@ -5,6 +5,8 @@
- compat-25: Add ~hash-table-empty-p~.
- compat-25: Add ~macroexp-parse-body~ and ~macroexp-quote~.
- compat-25: Add ~save-mark-and-excursion~.
+- compat-25: Add ~region-noncontiguous-p~.
+- compat-26: Add ~region-bounds~.
- compat-27: Add ~date-ordinal-to-time~.
- compat-27: Add ~make-decoded-time~.
- compat-27: Add ~ring-resize~.
@@ -19,7 +21,7 @@
- compat-29: Add ~delete-line~.
- compat-29: Add ~with-narrowing~.
- compat-29: Add ~buffer-local-set-state~ and ~buffer-local-restore-state~.
-- compat-29: Add ~use-region-beginning~ and ~use-region-end~.
+- compat-29: Add ~use-region-beginning~, ~use-region-end~ and
~use-region-noncontiguous-p~.
- compat-29: Add ~get-scratch-buffer-create~.
* Release of "Compat" Version 29.1.2.0
diff --git a/compat-25.el b/compat-25.el
index f0ac3acf4d..4a4aff9e06 100644
--- a/compat-25.el
+++ b/compat-25.el
@@ -73,7 +73,14 @@ usage: (bool-vector &rest OBJECTS)"
;;;; Defined in simple.el
;; `save-excursion' behaved like `save-mark-and-excursion' before 25.1.
-(compat-defalias save-mark-and-excursion save-excursion)
+(compat-defalias save-mark-and-excursion save-excursion) ;;
<compat-tests:save-mark-and-excursion>
+
+(declare-function region-bounds nil) ;; Defined in compat-26.el
+(compat-defun region-noncontiguous-p () ;;
<compat-tests:region-noncontiguous-p>
+ "Return non-nil if the region contains several pieces.
+An example is a rectangular region handled as a list of
+separate contiguous regions for each line."
+ (let ((bounds (region-bounds))) (and (cdr bounds) bounds)))
;;;; Defined in subr.el
diff --git a/compat-26.el b/compat-26.el
index a139251726..4340113dab 100644
--- a/compat-26.el
+++ b/compat-26.el
@@ -69,6 +69,19 @@ SEQUENCE may be a list, a vector, a boolean vector, or a
string."
(line-number-at-pos position))
(line-number-at-pos position)))
+;;;; Defined in simple.el
+
+(compat-defun region-bounds () ;; <compat-tests:region-bounds>
+ "Return the boundaries of the region.
+Value is a list of one or more cons cells of the form (START . END).
+It will have more than one cons cell when the region is non-contiguous,
+see `region-noncontiguous-p' and `extract-rectangle-bounds'."
+ (if (eval-when-compile (< emacs-major-version 25))
+ ;; FIXME: The `region-extract-function' of Emacs 24 has no support for
the
+ ;; bounds argument.
+ (list (cons (region-beginning) (region-end)))
+ (funcall region-extract-function 'bounds)))
+
;;;; Defined in subr.el
(compat-defun alist-get (key alist &optional default remove testfn) ;;
<compat-tests:alist-get>
diff --git a/compat-29.el b/compat-29.el
index 6315a07bb9..99fd3d5712 100644
--- a/compat-29.el
+++ b/compat-29.el
@@ -352,6 +352,10 @@ CONDITION."
;;;; Defined in simple.el
+(compat-defun use-region-noncontiguous-p () ;;
<compat-tests:region-noncontiguous-p>
+ "Return non-nil for a non-contiguous region if `use-region-p'."
+ (and (use-region-p) (region-noncontiguous-p)))
+
(compat-defun use-region-beginning () ;; <compat-tests:use-region>
"Return the start of the region if `use-region-p'."
(and (use-region-p) (region-beginning)))
diff --git a/compat-tests.el b/compat-tests.el
index fd324a96a0..9f6fcd50e7 100644
--- a/compat-tests.el
+++ b/compat-tests.el
@@ -2689,6 +2689,38 @@
(should-equal 2 (use-region-beginning))
(should-equal 7 (use-region-end))))
+(ert-deftest region-bounds ()
+ (should-error (region-bounds))
+ ;; FIXME: On Emacs 24 `region-bounds' always returns a continuous region.
+ (when (> emacs-major-version 24)
+ (let ((region-extract-function #'ignore))
+ (should-not (region-bounds)))
+ (let ((region-extract-function (lambda (_) '((2 . 3) (6 . 7)))))
+ (should-equal (region-bounds) '((2 . 3) (6 . 7)))))
+ (with-temp-buffer
+ (insert "abc\ndef\n")
+ (set-mark 2)
+ (goto-char 7)
+ (should-equal (region-bounds) '((2 . 7)))))
+
+(ert-deftest region-noncontiguous-p ()
+ (when (> emacs-major-version 24)
+ (let ((region-extract-function (lambda (_) '((2 . 3) (6 . 7)))))
+ (should (region-noncontiguous-p))))
+ (with-temp-buffer
+ (insert "abc\ndef\n")
+ (set-mark 2)
+ (goto-char 7)
+ (transient-mark-mode)
+ (should-not (region-noncontiguous-p))
+ (should-not (use-region-noncontiguous-p))
+ (should (use-region-p))
+ ;; FIXME: On Emacs 24 `region-bounds' always returns a continuous region.
+ (when (> emacs-major-version 24)
+ (let ((region-extract-function (lambda (_) '((2 . 3) (6 . 7)))))
+ (should (region-noncontiguous-p))
+ (should (use-region-noncontiguous-p))))))
+
(ert-deftest get-scratch-buffer-create ()
(should-equal "*scratch*" (buffer-name (get-scratch-buffer-create)))
(should-equal initial-major-mode (buffer-local-value 'major-mode
(get-scratch-buffer-create))))
diff --git a/compat.texi b/compat.texi
index 90184ef41a..2732ecced6 100644
--- a/compat.texi
+++ b/compat.texi
@@ -237,6 +237,21 @@ manage to provide for each Emacs version.
The following functions and macros implemented in 25.1, and are provided
by Compat:
+@c based on lisp/simple.el
+@defun region-bounds
+Return the boundaries of the region. Value is a list of one or more
+cons cells of the form @code{(start . end)}. It will have more than
+one cons cell when the region is non-contiguous, see
+@code{region-noncontiguous-p} and @code{extract-rectangle-bounds}.
+@end defun
+
+@c based on lisp/simple.el
+@defun region-noncontiguous-p
+Return non-nil if the region contains several pieces. An example is a
+rectangular region handled as a list of separate contiguous regions
+for each line.
+@end defun
+
@c copied from lispref/positions.texi
@defmac save-mark-and-excursion body@dots{}
This macro is like @code{save-excursion}, but also saves and restores
@@ -2050,6 +2065,11 @@ care.
Return the *scratch* buffer, creating a new one if needed.
@end defun
+@c based on lisp/simple.el
+@defun use-region-noncontiguous-p
+Return non-nil for a non-contiguous region if @code{use-region-p}.
+@end defun
+
@c based on lisp/simple.el
@defun use-region-end
Return the end of the region if @code{use-region-p}.