1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Add duplicate-region-final-position (bug#64185)

* lisp/misc.el (duplicate-region-final-position): New defcustom.
(duplicate-dwim): Use it.
* lisp/rect.el (rectangle--duplicate-right): Add displacement
argument.
* test/lisp/misc-tests.el (misc--duplicate-dwim): Extend test.
This commit is contained in:
Mattias Engdegård 2023-06-30 18:34:10 +02:00
parent 3ba9f9657f
commit 2195935870
3 changed files with 111 additions and 46 deletions

View file

@ -24,6 +24,7 @@
;;; Code:
(require 'ert)
(require 'misc)
(defmacro with-misc-test (original result &rest body)
(declare (indent 2))
@ -113,40 +114,70 @@
(require 'rect)
(ert-deftest misc--duplicate-dwim ()
;; Duplicate a line.
(with-temp-buffer
(insert "abc\ndefg\nh\n")
(goto-char 7)
(duplicate-dwim 2)
(should (equal (buffer-string) "abc\ndefg\ndefg\ndefg\nh\n"))
(should (equal (point) 7)))
(let ((duplicate-line-final-position 0)
(duplicate-region-final-position 0))
;; Duplicate a line.
(dolist (final-pos '(0 -1 1))
(ert-info ((prin1-to-string final-pos) :prefix "final-pos: ")
(with-temp-buffer
(insert "abc\ndefg\nh\n")
(goto-char 7)
(let ((duplicate-line-final-position final-pos))
(duplicate-dwim 3))
(should (equal (buffer-string) "abc\ndefg\ndefg\ndefg\ndefg\nh\n"))
(let ((delta (* 5 (if (< final-pos 0) 3 final-pos))))
(should (equal (point) (+ 7 delta)))))))
;; Duplicate a region.
(with-temp-buffer
(insert "abc\ndef\n")
(set-mark 2)
(goto-char 7)
(transient-mark-mode)
(should (use-region-p))
(duplicate-dwim)
(should (equal (buffer-string) "abc\ndebc\ndef\n"))
(should (equal (point) 7))
(should (region-active-p))
(should (equal (mark) 2)))
;; Duplicate a region.
(dolist (final-pos '(0 -1 1))
(ert-info ((prin1-to-string final-pos) :prefix "final-pos: ")
(with-temp-buffer
(insert "abCDEFghi")
(set-mark 3)
(goto-char 7)
(transient-mark-mode)
(should (use-region-p))
(let ((duplicate-region-final-position final-pos))
(duplicate-dwim 3))
(should (equal (buffer-string) "abCDEFCDEFCDEFCDEFghi"))
(should (region-active-p))
(let ((delta (* 4 (if (< final-pos 0) 3 final-pos))))
(should (equal (point) (+ 7 delta)))
(should (equal (mark) (+ 3 delta)))))))
;; Duplicate a rectangular region (sparse).
(with-temp-buffer
(insert "x\n>a\n>bcde\n>fg\nyz\n")
(goto-char 4)
(rectangle-mark-mode)
(goto-char 15)
(rectangle-forward-char 1)
(duplicate-dwim)
(should (equal (buffer-string) "x\n>a a \n>bcdbcde\n>fg fg \nyz\n"))
(should (equal (point) 24))
(should (region-active-p))
(should rectangle-mark-mode)
(should (equal (mark) 4)))
;; Idem (dense).
(dolist (final-pos '(0 -1 1))
(ert-info ((prin1-to-string final-pos) :prefix "final-pos: ")
(with-temp-buffer
(insert "aBCd\neFGh\niJKl\n")
(goto-char 2)
(rectangle-mark-mode)
(goto-char 14)
(let ((duplicate-region-final-position final-pos))
(duplicate-dwim 3))
(should (equal (buffer-string)
"aBCBCBCBCd\neFGFGFGFGh\niJKJKJKJKl\n"))
(should (region-active-p))
(should rectangle-mark-mode)
(let ((hdelta (* 2 (if (< final-pos 0) 3 final-pos)))
(vdelta 12))
(should (equal (point) (+ 14 vdelta hdelta)))
(should (equal (mark) (+ 2 hdelta)))))))))
;; Duplicate a rectangular region.
(with-temp-buffer
(insert "x\n>a\n>bcde\n>fg\nyz\n")
(goto-char 4)
(rectangle-mark-mode)
(goto-char 15)
(rectangle-forward-char 1)
(duplicate-dwim)
(should (equal (buffer-string) "x\n>a a \n>bcdbcde\n>fg fg \nyz\n"))
(should (equal (point) 24))
(should (region-active-p))
(should rectangle-mark-mode)
(should (equal (mark) 4))))
(provide 'misc-tests)
;;; misc-tests.el ends here