* Re: [Emacs-diffs] master 34d4720: Electric quotes: Improve support for Markdown mode (Bug#24709) [not found] ` <20170702154852.1796522E35@vcs0.savannah.gnu.org> @ 2017-07-02 17:48 ` Stefan Monnier 2017-07-03 16:48 ` Philipp Stephani 0 siblings, 1 reply; 4+ messages in thread From: Stefan Monnier @ 2017-07-02 17:48 UTC (permalink / raw) To: emacs-devel; +Cc: Philipp Stephani > Also introduce a new variable 'electric-quote-code-faces'. Major > modes such as 'markdown-mode' can add faces to this list to treat text > as inline code and disable electric quoting. Hmm... FWIW I don't like using faces for that (e.g. it means the features doesn't work when the user disables font-lock-mode, even in cases where it's easy to decide what to do based on syntax-ppss for example). Why not use a electric-quote-inhibit-function hook instead? Stefan ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Emacs-diffs] master 34d4720: Electric quotes: Improve support for Markdown mode (Bug#24709) 2017-07-02 17:48 ` [Emacs-diffs] master 34d4720: Electric quotes: Improve support for Markdown mode (Bug#24709) Stefan Monnier @ 2017-07-03 16:48 ` Philipp Stephani 2017-07-03 18:36 ` Stefan Monnier 0 siblings, 1 reply; 4+ messages in thread From: Philipp Stephani @ 2017-07-03 16:48 UTC (permalink / raw) To: Stefan Monnier, emacs-devel [-- Attachment #1.1: Type: text/plain, Size: 1237 bytes --] Stefan Monnier <monnier@iro.umontreal.ca> schrieb am So., 2. Juli 2017 um 19:48 Uhr: > > Also introduce a new variable 'electric-quote-code-faces'. Major > > modes such as 'markdown-mode' can add faces to this list to treat > text > > as inline code and disable electric quoting. > > Hmm... FWIW I don't like using faces for that (e.g. it means the > features doesn't work when the user disables font-lock-mode, even in > cases where it's easy to decide what to do based on syntax-ppss for > example). > Why not use a electric-quote-inhibit-function hook instead? > > Good point, here's another patch. -- Google Germany GmbH Erika-Mann-Straße 33 80636 München Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Geschäftsführer: Matthew Scott Sucherman, Paul Terence Manicle Diese E-Mail ist vertraulich. Wenn Sie nicht der richtige Adressat sind, leiten Sie diese bitte nicht weiter, informieren Sie den Absender und löschen Sie die E-Mail und alle Anhänge. Vielen Dank. This e-mail is confidential. If you are not the right addressee please do not forward it, please inform the sender, and please erase this e-mail including any attachments. Thanks. [-- Attachment #1.2: Type: text/html, Size: 1738 bytes --] [-- Attachment #2: 0001-Use-hook-instead-of-face-list-to-inhibit-electric-quot.txt --] [-- Type: text/plain, Size: 5795 bytes --] From 287a333286f5441128a1169be75e89461823e3af Mon Sep 17 00:00:00 2001 From: Philipp Stephani <phst@google.com> Date: Mon, 3 Jul 2017 18:46:10 +0200 Subject: [PATCH] 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 2afed2d253..d21d9cd5ee 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 1564df5949..4c1d9039d9 100644 --- a/lisp/electric.el +++ b/lisp/electric.el @@ -451,8 +451,15 @@ electric-quote-context-sensitive :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 @@ electric-quote-post-self-insert-function (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 @@ electric-quote-post-self-insert-function (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 6f63d30e75..9dd27661d4 100644 --- a/test/lisp/electric-tests.el +++ b/test/lisp/electric-tests.el @@ -697,16 +697,24 @@ electric-quote-context-sensitive-after-paren-double (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) -- 2.13.2.725.g09c95d1e9-goog ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Emacs-diffs] master 34d4720: Electric quotes: Improve support for Markdown mode (Bug#24709) 2017-07-03 16:48 ` Philipp Stephani @ 2017-07-03 18:36 ` Stefan Monnier 2017-07-03 19:00 ` Philipp Stephani 0 siblings, 1 reply; 4+ messages in thread From: Stefan Monnier @ 2017-07-03 18:36 UTC (permalink / raw) To: Philipp Stephani; +Cc: emacs-devel > Good point, here's another patch. Looks good, thanks. Stefan > Google Germany GmbH > Erika-Mann-Straße 33 > 80636 München > Registergericht und -nummer: Hamburg, HRB 86891 > Sitz der Gesellschaft: Hamburg > Geschäftsführer: Matthew Scott Sucherman, Paul Terence Manicle > Diese E-Mail ist vertraulich. Wenn Sie nicht der richtige Adressat sind, > leiten Sie diese bitte nicht weiter, informieren Sie den Absender und > löschen Sie die E-Mail und alle Anhänge. Vielen Dank. > This e-mail is confidential. If you are not the right addressee please do > not forward it, please inform the sender, and please erase this e-mail > including any attachments. Thanks. > From 287a333286f5441128a1169be75e89461823e3af Mon Sep 17 00:00:00 2001 > From: Philipp Stephani <phst@google.com> > Date: Mon, 3 Jul 2017 18:46:10 +0200 > Subject: [PATCH] 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 2afed2d253..d21d9cd5ee 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 1564df5949..4c1d9039d9 100644 > --- a/lisp/electric.el > +++ b/lisp/electric.el > @@ -451,8 +451,15 @@ electric-quote-context-sensitive > :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 @@ electric-quote-post-self-insert-function > (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 @@ electric-quote-post-self-insert-function > (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 6f63d30e75..9dd27661d4 100644 > --- a/test/lisp/electric-tests.el > +++ b/test/lisp/electric-tests.el > @@ -697,16 +697,24 @@ electric-quote-context-sensitive-after-paren-double > (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) > -- > 2.13.2.725.g09c95d1e9-goog ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Emacs-diffs] master 34d4720: Electric quotes: Improve support for Markdown mode (Bug#24709) 2017-07-03 18:36 ` Stefan Monnier @ 2017-07-03 19:00 ` Philipp Stephani 0 siblings, 0 replies; 4+ messages in thread From: Philipp Stephani @ 2017-07-03 19:00 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 787 bytes --] Stefan Monnier <monnier@iro.umontreal.ca> schrieb am Mo., 3. Juli 2017 um 20:36 Uhr: > > Good point, here's another patch. > > Looks good, thanks. > Pushed as 4cd0db3d6e. -- Google Germany GmbH Erika-Mann-Straße 33 80636 München Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Geschäftsführer: Matthew Scott Sucherman, Paul Terence Manicle Diese E-Mail ist vertraulich. Wenn Sie nicht der richtige Adressat sind, leiten Sie diese bitte nicht weiter, informieren Sie den Absender und löschen Sie die E-Mail und alle Anhänge. Vielen Dank. This e-mail is confidential. If you are not the right addressee please do not forward it, please inform the sender, and please erase this e-mail including any attachments. Thanks. [-- Attachment #2: Type: text/html, Size: 1228 bytes --] ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-07-03 19:00 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20170702154850.22058.98643@vcs0.savannah.gnu.org> [not found] ` <20170702154852.1796522E35@vcs0.savannah.gnu.org> 2017-07-02 17:48 ` [Emacs-diffs] master 34d4720: Electric quotes: Improve support for Markdown mode (Bug#24709) Stefan Monnier 2017-07-03 16:48 ` Philipp Stephani 2017-07-03 18:36 ` Stefan Monnier 2017-07-03 19:00 ` Philipp Stephani
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).