mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-05 22:20:24 -08:00
Adjust previous electric.el and elec-pair.el change
This fixes a serious bug introduced previously electric-pair-inhibit-if-helps-balance and electric-pair-skip-if-helps-balance, whereby "innocent" markers were being pushed by those function's new save-change-and-restore semantics. The fix can probably still be improved. It also adds comments to parts of the code, where deemed necessary. * lisp/elec-pair.el (electric-pair--insert): Add comment. (electric-pair--save-literal-point-excursion): New helper macro. (electric-pair-inhibit-if-helps-balance) (electric-pair-skip-if-helps-balance): Don't use insert-before-markers since it may hurt other markers that have nothing to do with the 'save-excursion'. (electric-pair-post-self-insert-function): Use electric-pair--save-literal-point-excursion. * lisp/electric.el (electric-indent-post-self-insert-function): Remove lexical variable.
This commit is contained in:
parent
f845f8a279
commit
682ab5d92a
2 changed files with 28 additions and 10 deletions
|
|
@ -228,6 +228,12 @@ inside a comment or string."
|
|||
(let ((last-command-event char)
|
||||
(blink-matching-paren nil)
|
||||
(electric-pair-mode nil)
|
||||
;; When adding the "closer" delimiter, a job his function is
|
||||
;; frequently used for, we don't want to munch any extra
|
||||
;; newlines above us. That would be the default behaviour of
|
||||
;; `electric-layout-mode', which potentially kicked in before
|
||||
;; us to add these newlines, and is probably about to kick in
|
||||
;; again after we add the closer.
|
||||
(electric-layout-allow-duplicate-newlines t))
|
||||
(self-insert-command 1)))
|
||||
|
||||
|
|
@ -406,6 +412,15 @@ strings."
|
|||
(let ((ppss (electric-pair--syntax-ppss (point) '(comment))))
|
||||
(memq (nth 3 ppss) (list t char))))
|
||||
|
||||
(defmacro electric-pair--save-literal-point-excursion (&rest body)
|
||||
;; FIXME: need this instead of `save-excursion' when functions in
|
||||
;; BODY, such as `electric-pair-inhibit-if-helps-balance' and
|
||||
;; `electric-pair-skip-if-helps-balance' modify and restore the
|
||||
;; buffer in a way that modifies the marker used by save-excursion.
|
||||
(let ((point (make-symbol "point")))
|
||||
`(let ((,point (point)))
|
||||
(unwind-protect (progn ,@body) (goto-char ,point)))))
|
||||
|
||||
(defun electric-pair-inhibit-if-helps-balance (char)
|
||||
"Return non-nil if auto-pairing of CHAR would hurt parentheses' balance.
|
||||
|
||||
|
|
@ -427,7 +442,7 @@ happened."
|
|||
(eq (cdr outermost) pair)))))
|
||||
((eq syntax ?\")
|
||||
(electric-pair--unbalanced-strings-p char))))
|
||||
(insert-before-markers char)))))
|
||||
(insert char)))))
|
||||
|
||||
(defun electric-pair-skip-if-helps-balance (char)
|
||||
"Return non-nil if skipping CHAR would benefit parentheses' balance.
|
||||
|
|
@ -452,7 +467,7 @@ happened."
|
|||
(not (eq (cdr outermost) pair)))))))
|
||||
((eq syntax ?\")
|
||||
(electric-pair--inside-string-p char))))
|
||||
(insert-before-markers char)))))
|
||||
(insert char)))))
|
||||
|
||||
(defun electric-pair-default-skip-self (char)
|
||||
(if electric-pair-preserve-balance
|
||||
|
|
@ -498,7 +513,7 @@ happened."
|
|||
((and (memq syntax '(?\) ?\" ?\$))
|
||||
(and (or unconditional
|
||||
(if (functionp electric-pair-skip-self)
|
||||
(save-excursion
|
||||
(electric-pair--save-literal-point-excursion
|
||||
(goto-char pos)
|
||||
(funcall electric-pair-skip-self last-command-event))
|
||||
electric-pair-skip-self))
|
||||
|
|
@ -527,7 +542,7 @@ happened."
|
|||
((and (memq syntax '(?\( ?\" ?\$))
|
||||
(not overwrite-mode)
|
||||
(or unconditional
|
||||
(not (save-excursion
|
||||
(not (electric-pair--save-literal-point-excursion
|
||||
(goto-char pos)
|
||||
(funcall electric-pair-inhibit-predicate
|
||||
last-command-event)))))
|
||||
|
|
@ -544,6 +559,11 @@ happened."
|
|||
(matching-paren (char-after))))
|
||||
(save-excursion (newline 1 t)))))))
|
||||
|
||||
;; Prioritize this to kick in after
|
||||
;; `electric-layout-post-self-insert-function': that considerably
|
||||
;; simplifies interoperation when `electric-pair-mode',
|
||||
;; `electric-layout-mode' and `electric-indent-mode' are used
|
||||
;; together. Use `vc-region-history' on these lines for more info.
|
||||
(put 'electric-pair-post-self-insert-function 'priority 50)
|
||||
|
||||
(defun electric-pair-will-use-region ()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue