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

* lisp/elec-pair.el: Do modify+undo more carefully

(electric-pair-inhibit-if-helps-balance): Use the undo system
instead of undoing by hand.
This commit is contained in:
Stefan Monnier 2019-02-18 19:00:44 -05:00
parent a812ed215c
commit e66d5a1c45

View file

@ -429,20 +429,25 @@ some list calculations, finally restoring the situation as if nothing
happened." happened."
(pcase (electric-pair-syntax-info char) (pcase (electric-pair-syntax-info char)
(`(,syntax ,pair ,_ ,s-or-c) (`(,syntax ,pair ,_ ,s-or-c)
(unwind-protect (catch 'done
(progn ;; FIXME: modify+undo is *very* tricky business. We used to
(delete-char -1) ;; use `delete-char' followed by `insert', but this changed the
(cond ((eq ?\( syntax) ;; position some markers. The real fix would be to compute the
(let* ((pair-data ;; result without having to modify the buffer at all.
(electric-pair--balance-info 1 s-or-c)) (atomic-change-group
(outermost (cdr pair-data))) (delete-char -1)
(cond ((car outermost) (throw
nil) 'done
(t (cond ((eq ?\( syntax)
(eq (cdr outermost) pair))))) (let* ((pair-data
((eq syntax ?\") (electric-pair--balance-info 1 s-or-c))
(electric-pair--unbalanced-strings-p char)))) (outermost (cdr pair-data)))
(insert char))))) (cond ((car outermost)
nil)
(t
(eq (cdr outermost) pair)))))
((eq syntax ?\")
(electric-pair--unbalanced-strings-p char)))))))))
(defun electric-pair-skip-if-helps-balance (char) (defun electric-pair-skip-if-helps-balance (char)
"Return non-nil if skipping CHAR would benefit parentheses' balance. "Return non-nil if skipping CHAR would benefit parentheses' balance.