emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] master 4cd0db3: Use hook instead of face list to inhibit e


From: Philipp Stephani
Subject: [Emacs-diffs] master 4cd0db3: Use hook instead of face list to inhibit electric quoting
Date: Mon, 3 Jul 2017 15:00:17 -0400 (EDT)

branch: master
commit 4cd0db3d6e6e4d5bd49283483bdafbbfc0f583f1
Author: Philipp Stephani <address@hidden>
Commit: Philipp Stephani <address@hidden>

    Use hook instead of face list to inhibit electric quoting
    
    This is more flexible and doesn't couple electric quoting to font
    locking.
    Give that 'electric-quote-code-faces' was just introduced, remove it
    without formal deprecation.
    
    * lisp/electric.el (electric-quote-inhibit-functions): New abnormal
    hook variable.
    (electric-quote-post-self-insert-function): Run the hook.  Remove
    use of old 'electric-quote-code-faces' variable.
    
    * test/lisp/electric-tests.el (electric-quote-markdown-in-text)
    (electric-quote-markdown-in-code): Adapt unit tests.
---
 etc/NEWS                    | 12 ++++++------
 lisp/electric.el            | 19 ++++++++++++-------
 test/lisp/electric-tests.el | 16 ++++++++++++----
 3 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index a766642..83cb73f 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -138,12 +138,12 @@ line, after a whitespace character, and after an opening 
parenthesis;
 and it will replace the apostrophe by a closing quote character in all
 other cases.
 
-** The new variable 'electric-quote-code-faces' controls when to
-disable electric quoting in text modes.  Major modes can add faces to
-this list; Emacs will temporarily disable 'electric-quote-mode'
-whenever point is before a character having such a face.  This is
-intended for major modes that derive from 'text-mode' but allow inline
-code segments, such as 'markdown-mode'.
+** The new variable 'electric-quote-inhibit-functions' controls when
+to disable electric quoting based on context.  Major modes can add
+functions to this list; Emacs will temporarily disable
+'electric-quote-mode' whenever any of the functions returns non-nil.
+This can be used by major modes that derive from 'text-mode' but allow
+inline code segments, such as 'markdown-mode'.
 
 +++
 ** The new user variable 'dired-omit-case-fold' allows the user to
diff --git a/lisp/electric.el b/lisp/electric.el
index 1564df5..4c1d9039 100644
--- a/lisp/electric.el
+++ b/lisp/electric.el
@@ -451,8 +451,15 @@ whitespace, opening parenthesis, or quote and leaves \\=` 
alone."
   :version "26.1"
   :type 'boolean :safe #'booleanp :group 'electricity)
 
-(defvar electric-quote-code-faces ()
-  "List of faces to treat as inline code in `text-mode'.")
+(defvar electric-quote-inhibit-functions ()
+  "List of functions that should inhibit electric quoting.
+When the variable `electric-quote-mode' is non-nil, Emacs will
+call these functions in order after the user has typed an \\=` or
+\\=' character.  If one of them returns non-nil, electric quote
+substitution is inhibited.  The functions are called after the
+\\=` or \\=' character has been inserted with point directly
+after the inserted character.  The functions in this hook should
+not move point or change the current buffer.")
 
 (defun electric-quote-post-self-insert-function ()
   "Function that `electric-quote-mode' adds to `post-self-insert-hook'.
@@ -460,7 +467,9 @@ This requotes when a quoting key is typed."
   (when (and electric-quote-mode
              (or (eq last-command-event ?\')
                  (and (not electric-quote-context-sensitive)
-                      (eq last-command-event ?\`))))
+                      (eq last-command-event ?\`)))
+             (not (run-hook-with-args-until-success
+                   'electric-quote-inhibit-functions)))
     (let ((start
            (if (and comment-start comment-use-syntax)
                (when (or electric-quote-comment electric-quote-string)
@@ -475,10 +484,6 @@ This requotes when a quoting key is typed."
                                          (syntax-ppss (1- (point)))))))))
              (and electric-quote-paragraph
                   (derived-mode-p 'text-mode)
-                  ;; FIXME: There should be a ‘cl-disjoint’ function.
-                  (null (cl-intersection (face-at-point nil 'multiple)
-                                         electric-quote-code-faces
-                                         :test #'eq))
                   ;; FIXME: Why is the next form there?  It’s never
                   ;; nil.
                   (or (eq last-command-event ?\`)
diff --git a/test/lisp/electric-tests.el b/test/lisp/electric-tests.el
index 6f63d30..9dd2766 100644
--- a/test/lisp/electric-tests.el
+++ b/test/lisp/electric-tests.el
@@ -697,16 +697,24 @@ baz\"\""
 (define-electric-pair-test electric-quote-markdown-in-text
   "" "'" :expected-string "’" :expected-point 2
   :modes '(text-mode)
-  :fixture-fn #'electric-quote-local-mode
-  :bindings '((electric-quote-code-faces font-lock-constant-face))
+  :fixture-fn (lambda ()
+                (electric-quote-local-mode)
+                (add-hook 'electric-quote-inhibit-functions
+                          (lambda ()
+                            (save-excursion (search-backward "`" nil t)))
+                          nil :local))
   :test-in-comments nil :test-in-strings nil)
 
 (define-electric-pair-test electric-quote-markdown-in-code
   #("`a`" 1 2 (face font-lock-constant-face)) "-'"
   :expected-string "`'a`" :expected-point 3
   :modes '(text-mode)
-  :fixture-fn #'electric-quote-local-mode
-  :bindings '((electric-quote-code-faces font-lock-constant-face))
+  :fixture-fn (lambda ()
+                (electric-quote-local-mode)
+                (add-hook 'electric-quote-inhibit-functions
+                          (lambda ()
+                            (save-excursion (search-backward "`" nil t)))
+                          nil :local))
   :test-in-comments nil :test-in-strings nil)
 
 (provide 'electric-tests)



reply via email to

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