aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2019-02-18 19:00:44 -0500
committerStefan Monnier2019-02-18 19:00:44 -0500
commite66d5a1c4528681ba6b3465faaa197a5701763cb (patch)
tree7ffee7ebb680e9e73f383cbdae9d9ffb1bf72f31
parenta812ed215ce0a7a53f51dd5aa51de720917d2ff0 (diff)
downloademacs-e66d5a1c4528681ba6b3465faaa197a5701763cb.tar.gz
emacs-e66d5a1c4528681ba6b3465faaa197a5701763cb.zip
* lisp/elec-pair.el: Do modify+undo more carefully
(electric-pair-inhibit-if-helps-balance): Use the undo system instead of undoing by hand.
-rw-r--r--lisp/elec-pair.el33
1 files changed, 19 insertions, 14 deletions
diff --git a/lisp/elec-pair.el b/lisp/elec-pair.el
index b5ec492930e..3be09d87b4f 100644
--- a/lisp/elec-pair.el
+++ b/lisp/elec-pair.el
@@ -429,20 +429,25 @@ some list calculations, finally restoring the situation as if nothing
429happened." 429happened."
430 (pcase (electric-pair-syntax-info char) 430 (pcase (electric-pair-syntax-info char)
431 (`(,syntax ,pair ,_ ,s-or-c) 431 (`(,syntax ,pair ,_ ,s-or-c)
432 (unwind-protect 432 (catch 'done
433 (progn 433 ;; FIXME: modify+undo is *very* tricky business. We used to
434 (delete-char -1) 434 ;; use `delete-char' followed by `insert', but this changed the
435 (cond ((eq ?\( syntax) 435 ;; position some markers. The real fix would be to compute the
436 (let* ((pair-data 436 ;; result without having to modify the buffer at all.
437 (electric-pair--balance-info 1 s-or-c)) 437 (atomic-change-group
438 (outermost (cdr pair-data))) 438 (delete-char -1)
439 (cond ((car outermost) 439 (throw
440 nil) 440 'done
441 (t 441 (cond ((eq ?\( syntax)
442 (eq (cdr outermost) pair))))) 442 (let* ((pair-data
443 ((eq syntax ?\") 443 (electric-pair--balance-info 1 s-or-c))
444 (electric-pair--unbalanced-strings-p char)))) 444 (outermost (cdr pair-data)))
445 (insert char))))) 445 (cond ((car outermost)
446 nil)
447 (t
448 (eq (cdr outermost) pair)))))
449 ((eq syntax ?\")
450 (electric-pair--unbalanced-strings-p char)))))))))
446 451
447(defun electric-pair-skip-if-helps-balance (char) 452(defun electric-pair-skip-if-helps-balance (char)
448 "Return non-nil if skipping CHAR would benefit parentheses' balance. 453 "Return non-nil if skipping CHAR would benefit parentheses' balance.