emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 682ab5d 2/2: Adjust previous electric.el and elec-p


From: João Távora
Subject: [Emacs-diffs] master 682ab5d 2/2: Adjust previous electric.el and elec-pair.el change
Date: Fri, 25 Jan 2019 12:33:21 -0500 (EST)

branch: master
commit 682ab5d92a6922694a92fcde029811bccf98d700
Author: João Távora <address@hidden>
Commit: João Távora <address@hidden>

    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.
---
 lisp/elec-pair.el | 28 ++++++++++++++++++++++++----
 lisp/electric.el  | 10 ++++------
 2 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/lisp/elec-pair.el b/lisp/elec-pair.el
index 20581ad..b5ec492 100644
--- a/lisp/elec-pair.el
+++ b/lisp/elec-pair.el
@@ -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 ()
diff --git a/lisp/electric.el b/lisp/electric.el
index b945877..657913a 100644
--- a/lisp/electric.el
+++ b/lisp/electric.el
@@ -270,14 +270,12 @@ or comment."
         ;; hence copied).
         (let ((at-newline (<= pos (line-beginning-position))))
           (when at-newline
-            (let ((before (copy-marker (1- pos) t))
-                  inhibit-reindentation)
+            (let ((before (copy-marker (1- pos) t)))
               (save-excursion
                 (unless
-                    (setq inhibit-reindentation
-                          (or (memq indent-line-function
-                                    electric-indent-functions-without-reindent)
-                              electric-indent-inhibit))
+                    (or (memq indent-line-function
+                              electric-indent-functions-without-reindent)
+                        electric-indent-inhibit)
                   ;; Don't reindent the previous line if the
                   ;; indentation function is not a real one.
                   (goto-char before)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]