]> git.eshelyaron.com Git - emacs.git/commitdiff
Make delete-pair only delete pairs that are part of insert-pair-alist
authormartin rudalics <rudalics@gmx.at>
Tue, 22 Sep 2020 14:44:15 +0000 (16:44 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Tue, 22 Sep 2020 14:44:15 +0000 (16:44 +0200)
* lisp/emacs-lisp/lisp.el (delete-pair): Only delete pairs that
are part of `insert-pair-alist' (bug#4136).

lisp/emacs-lisp/lisp.el
test/lisp/emacs-lisp/lisp-tests.el

index 8c18557c79a498a88ec309d765019d388a4c364c..ac4ba788972c84e1521b9c4aa0bf6a49fe41c0e6 100644 (file)
@@ -735,12 +735,37 @@ This command assumes point is not in a string or comment."
   (insert-pair arg ?\( ?\)))
 
 (defun delete-pair (&optional arg)
-  "Delete a pair of characters enclosing ARG sexps following point.
-A negative ARG deletes a pair of characters around preceding ARG sexps."
-  (interactive "p")
-  (unless arg (setq arg 1))
-  (save-excursion (forward-sexp arg) (delete-char (if (> arg 0) -1 1)))
-  (delete-char (if (> arg 0) 1 -1)))
+  "Delete a pair of characters enclosing ARG sexps that follow point.
+A negative ARG deletes a pair around the preceding ARG sexps instead."
+  (interactive "P")
+  (if arg
+      (setq arg (prefix-numeric-value arg))
+    (setq arg 1))
+  (if (< arg 0)
+      (save-excursion
+       (skip-chars-backward " \t")
+       (save-excursion
+         (let ((close-char (char-before)))
+           (forward-sexp arg)
+           (unless (member (list (char-after) close-char)
+                           (mapcar (lambda (p)
+                                     (if (= (length p) 3) (cdr p) p))
+                                   insert-pair-alist))
+             (error "Not after matching pair"))
+           (delete-char 1)))
+       (delete-char -1))
+    (save-excursion
+      (skip-chars-forward " \t")
+      (save-excursion
+       (let ((open-char (char-after)))
+         (forward-sexp arg)
+         (unless (member (list open-char (char-before))
+                         (mapcar (lambda (p)
+                                   (if (= (length p) 3) (cdr p) p))
+                                 insert-pair-alist))
+           (error "Not before matching pair"))
+         (delete-char -1)))
+      (delete-char 1))))
 
 (defun raise-sexp (&optional arg)
   "Raise ARG sexps higher up the tree."
index a2b8304c96ac2f8541794eba6b21a74e7a2b324b..1476574552fe3f474a40d8e71e3f9c87397f9f55 100644 (file)
     (text-mode)
     (insert "\"foo\"")
     (goto-char (point-min))
-    (delete-pair)
-    (should (string-equal "fo\"" (buffer-string)))))
+    (should-error (delete-pair))))
 
 (ert-deftest lisp-delete-pair-quotes-text-mode-syntax-table ()
   "Test \\[delete-pair] with modified Text Mode syntax for #15014."