[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/paredit fac925d 125/224: Tweak safe region deletion.
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/paredit fac925d 125/224: Tweak safe region deletion. |
Date: |
Sat, 7 Aug 2021 09:22:33 -0400 (EDT) |
branch: elpa/paredit
commit fac925d3f9c7daf472239260217414e696b8cd10
Author: Taylor R Campbell <campbell@mumble.net>
Commit: Taylor R Campbell <campbell@mumble.net>
Tweak safe region deletion.
Ignore-this: 51d8b01dc3a61efe5b0e0c651bf3a812
New command `paredit-delete-region' is to `delete-region' as
`paredit-kill-region' is to `kill-region'.
Deleting a region that starts or ends in a comment works a little
better now.
`paredit-kill-ring-save' is no more: paredit doesn't (and shouldn't)
keep you from putting unbalanced text into the kill ring. What it
should (but doesn't yet) do is keep you from yanking unbalanced text
into the buffer.
darcs-hash:20110411184530-00fcc-e20733f7a36482041cb9279030d66a9419fa4e9b
---
paredit.el | 135 ++++++++++++++++++++++++++++++-------------------------------
1 file changed, 66 insertions(+), 69 deletions(-)
diff --git a/paredit.el b/paredit.el
index 0541382..6d902f5 100644
--- a/paredit.el
+++ b/paredit.el
@@ -1662,104 +1662,101 @@ With a numeric prefix argument N, do `kill-line' that
many times."
(t
(point))))))))
-;;;; Safe Region Killing/Copying
-
-;;; This is an experiment. It's not enough: `paredit-kill-ring-save'
-;;; is always safe; it's `yank' that's not safe, but even trickier to
-;;; implement than `paredit-kill-region'. Also, the heuristics for
-;;; `paredit-kill-region' are slightly too conservative -- they will
-;;; sometimes reject killing regions that would be safe to kill.
-;;; (Consider, e,g., a region that starts in a comment and ends in the
-;;; middle of a symbol at the end of a line: that's safe to kill, but
-;;; `paredit-kill-region' won't allow it.) I don't know whether they
-;;; are too liberal: I haven't constructed a region that is unsafe to
-;;; kill but which `paredit-kill-region' will kill, but I haven't ruled
-;;; out the possibility either.
-
-(defun paredit-kill-ring-save (beginning end)
- "Save the balanced region, but don't kill it, like `kill-ring-save'.
-If the text of the region is unbalanced, signal an error instead.
-With a prefix argument, disregard any imbalance."
+;;;; Deleting Regions
+
+(defun paredit-delete-region (start end)
+ "Delete the text between point and mark, like `delete-region'.
+If that text is unbalanced, signal an error instead.
+With a prefix argument, skip the balance check."
(interactive "r")
- (if (not current-prefix-arg)
- (paredit-check-region beginning end))
- (setq this-command 'kill-ring-save)
- (kill-ring-save beginning end))
-
-(defun paredit-kill-region (beginning end)
- "Kill balanced text between point and mark, like `kill-region'.
-If that text is unbalanced, signal an error instead."
+ (if (and start end (not current-prefix-arg))
+ (paredit-check-region-for-delete start end))
+ (setq this-command 'delete-region)
+ (delete-region start end))
+
+(defun paredit-kill-region (start end)
+ "Kill the text between point and mark, like `kill-region'.
+If that text is unbalanced, signal an error instead.
+With a prefix argument, skip the balance check."
(interactive "r")
- (if (and beginning end)
- ;; Check that region begins and ends in a sufficiently similar
- ;; state, so that deleting it will leave the buffer balanced.
- (save-excursion
- (goto-char beginning)
- (let* ((state (paredit-current-parse-state))
- (state* (parse-partial-sexp beginning end nil nil state)))
- (paredit-check-region-state state state*))))
+ (if (and start end (not current-prefix-arg))
+ (paredit-check-region-for-delete start end))
(setq this-command 'kill-region)
- (kill-region beginning end))
-
-(defun paredit-check-region-state (beginning-state end-state)
- "Signal an error if the two parse-partial-sexp states differ.
-This guarantees that excising the text between the two states'
- points from the buffer will leave the buffer balanced."
- (paredit-check-region-state-depth beginning-state end-state)
- (paredit-check-region-state-string beginning-state end-state)
- (paredit-check-region-state-comment beginning-state end-state)
- (paredit-check-region-state-char-quote beginning-state end-state))
-
-(defun paredit-check-region-state-depth (beginning-state end-state)
- (let ((beginning-depth (nth 0 beginning-state))
+ (kill-region start end))
+
+(defun paredit-check-region-for-delete (start end)
+ "Signal an error deleting text between `start' and `end' is unsafe."
+ (save-excursion
+ (goto-char start)
+ (let* ((start-state (paredit-current-parse-state))
+ (end-state (parse-partial-sexp start end nil nil start-state)))
+ (paredit-check-region-for-delete:depth start start-state end end-state)
+ (paredit-check-region-for-delete:string start start-state end end-state)
+ (paredit-check-region-for-delete:comment start start-state end end-state)
+ (paredit-check-region-for-delete:char-quote start start-state
+ end end-state))))
+
+(defun paredit-check-region-for-delete:depth (start start-state end end-state)
+ (let ((start-depth (nth 0 start-state))
(end-depth (nth 0 end-state)))
- (if (not (= beginning-depth end-depth))
+ (if (not (= start-depth end-depth))
(error "Mismatched parenthesis depth: %S at start, %S at end."
- beginning-depth
+ start-depth
end-depth))))
-(defun paredit-check-region-state-string (beginning-state end-state)
- (let ((beginning-string-p (nth 3 beginning-state))
+(defun paredit-check-region-for-delete:string (start start-state end end-state)
+ (let ((start-string-p (nth 3 start-state))
(end-string-p (nth 3 end-state)))
- (if (not (eq beginning-string-p end-string-p))
+ (if (not (eq start-string-p end-string-p))
(error "Mismatched string state: start %sin string, end %sin string."
- (if beginning-string-p "" "not ")
+ (if start-string-p "" "not ")
(if end-string-p "" "not ")))))
-
-(defun paredit-check-region-state-comment (beginning-state end-state)
- (let ((beginning-comment-state (nth 4 beginning-state))
+
+(defun paredit-check-region-for-delete:comment
+ (start start-state end end-state)
+ (let ((start-comment-state (nth 4 start-state))
(end-comment-state (nth 4 end-state)))
- (if (not (or (eq beginning-comment-state end-comment-state)
- (and (eq beginning-comment-state nil)
- (eq end-comment-state t)
- (eolp))))
+ (if (not (or (eq start-comment-state end-comment-state)
+ ;; If we are moving text into or out of a line
+ ;; comment, make sure that the text is balanced. (The
+ ;; comment state may be a number, not t or nil at all,
+ ;; for nestable comments, which are not handled by
+ ;; this heuristic (or any of paredit, really).)
+ (and (or (eq start-comment-state nil)
+ (eq end-comment-state t))
+ (or (eq start-comment-state t)
+ (eq end-comment-state nil))
+ (save-excursion
+ (goto-char end)
+ (paredit-region-ok-p (point) (point-at-eol))))))
(error "Mismatched comment state: %s"
- (cond ((and (integerp beginning-comment-state)
+ (cond ((and (integerp start-comment-state)
(integerp end-comment-state))
(format "depth %S at start, depth %S at end."
- beginning-comment-state
+ start-comment-state
end-comment-state))
- ((integerp beginning-comment-state)
+ ((integerp start-comment-state)
"start in nested comment, end otherwise.")
((integerp end-comment-state)
"end in nested comment, start otherwise.")
- (beginning-comment-state
+ (start-comment-state
"start in comment, end not in comment.")
(end-comment-state
"end in comment, start not in comment.")
(t
(format "start %S, end %S."
- beginning-comment-state
+ start-comment-state
end-comment-state)))))))
-(defun paredit-check-region-state-char-quote (beginning-state end-state)
- (let ((beginning-char-quote (nth 5 beginning-state))
+(defun paredit-check-region-for-delete:char-quote
+ (start start-state end end-state)
+ (let ((start-char-quote (nth 5 start-state))
(end-char-quote (nth 5 end-state)))
- (if (not (eq beginning-char-quote end-char-quote))
+ (if (not (eq start-char-quote end-char-quote))
(let ((phrase "character quotation"))
(error "Mismatched %s: start %sin %s, end %sin %s."
phrase
- (if beginning-char-quote "" "not ")
+ (if start-char-quote "" "not ")
phrase
(if end-char-quote "" "not ")
phrase)))))
- [nongnu] elpa/paredit 9cac6fa 106/224: Specify that paredit should work in XEmacs 21.5.28 or later., (continued)
- [nongnu] elpa/paredit 9cac6fa 106/224: Specify that paredit should work in XEmacs 21.5.28 or later., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 0bb4b62 110/224: Check for expected errors in `paredit-close-FOO'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 3c48233 122/224: Fix checks on deletion of comment boundaries., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 620c3a2 116/224: Break page in test.el before indentation regression tests., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit d681e3c 111/224: Check for expected errors in `paredit-forward-delete'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 5dc93f9 114/224: Omit redundant `paredit-forward-delete' test., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 0cd0011 109/224: Implement expected errors in test suite., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 8ee8f13 118/224: Fix `paredit-insert-pair' when buffer ends with no-newline comment., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit fc78011 121/224: Tweak `paredit-check-region' and `paredit-region-ok-p'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 621be23 124/224: Add some tests for recent changes to deletion and killing commands., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit fac925d 125/224: Tweak safe region deletion.,
ELPA Syncer <=
- [nongnu] elpa/paredit 8d87576 129/224: Fix logic in checking region deletion across comment boundaries., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 4723fb3 132/224: Add and fix some tests for `(' and `)' while in a character literal., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 5558fd0 137/224: Make `paredit-in-char-p' work recursively., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 88a5cf7 139/224: Be explicit about Transient Mark Mode in `paredit-wrap-*' tests., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit d80a9db 141/224: Fail early in `paredit-convolute-sexp'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 2ec6000 145/224: Fix error message in `paredit-test'., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 6f2677b 148/224: Tweak `paredit-convolute-sexp' a little and add some tests for it., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit d54ea28 149/224: Add a trivial shell script to generate paredit.html., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit 540bc9c 153/224: Remove unnecessarily nasty text about reporting bugs., ELPA Syncer, 2021/08/07
- [nongnu] elpa/paredit b02f509 156/224: New file NEWS from paredit.release., ELPA Syncer, 2021/08/07