diff options
| author | Stefan Monnier | 2019-02-18 19:00:44 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2019-02-18 19:00:44 -0500 |
| commit | e66d5a1c4528681ba6b3465faaa197a5701763cb (patch) | |
| tree | 7ffee7ebb680e9e73f383cbdae9d9ffb1bf72f31 | |
| parent | a812ed215ce0a7a53f51dd5aa51de720917d2ff0 (diff) | |
| download | emacs-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.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 | |||
| 429 | happened." | 429 | happened." |
| 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. |