diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2019-02-18 19:00:44 -0500 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2019-02-18 19:00:44 -0500 |
commit | e66d5a1c4528681ba6b3465faaa197a5701763cb (patch) | |
tree | 7ffee7ebb680e9e73f383cbdae9d9ffb1bf72f31 /lisp/elec-pair.el | |
parent | a812ed215ce0a7a53f51dd5aa51de720917d2ff0 (diff) | |
download | emacs-e66d5a1c4528681ba6b3465faaa197a5701763cb.tar.gz |
* lisp/elec-pair.el: Do modify+undo more carefully
(electric-pair-inhibit-if-helps-balance): Use the undo system
instead of undoing by hand.
Diffstat (limited to 'lisp/elec-pair.el')
-rw-r--r-- | lisp/elec-pair.el | 33 |
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 happened." (pcase (electric-pair-syntax-info char) (`(,syntax ,pair ,_ ,s-or-c) - (unwind-protect - (progn - (delete-char -1) - (cond ((eq ?\( syntax) - (let* ((pair-data - (electric-pair--balance-info 1 s-or-c)) - (outermost (cdr pair-data))) - (cond ((car outermost) - nil) - (t - (eq (cdr outermost) pair))))) - ((eq syntax ?\") - (electric-pair--unbalanced-strings-p char)))) - (insert char))))) + (catch 'done + ;; FIXME: modify+undo is *very* tricky business. We used to + ;; use `delete-char' followed by `insert', but this changed the + ;; position some markers. The real fix would be to compute the + ;; result without having to modify the buffer at all. + (atomic-change-group + (delete-char -1) + (throw + 'done + (cond ((eq ?\( syntax) + (let* ((pair-data + (electric-pair--balance-info 1 s-or-c)) + (outermost (cdr pair-data))) + (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) "Return non-nil if skipping CHAR would benefit parentheses' balance. |