>From d63be0394bc94c8b763f4869759f2f2603ff6981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6ktu=C4=9F=20Kayaalp?= Date: Sun, 9 Oct 2016 11:29:50 -0700 Subject: [PATCH 1/2] New user variable 'electric-quote-chars' * doc/emacs/text.texi (Quotation Marks), etc/NEWS: Document this. * lisp/electric.el (electric-quote-chars): New defcustom. (electric-quote-post-self-insert-function): Use it. (electric--insertable-p): Arg can now be a char, too. --- doc/emacs/text.texi | 14 ++++++++-- etc/NEWS | 4 +++ lisp/electric.el | 74 ++++++++++++++++++++++++++++++++--------------------- 3 files changed, 61 insertions(+), 31 deletions(-) diff --git a/doc/emacs/text.texi b/doc/emacs/text.texi index 579f788..74b68dd 100644 --- a/doc/emacs/text.texi +++ b/doc/emacs/text.texi @@ -412,6 +412,7 @@ Quotation Marks @cindex mode, Electric Quote @cindex curly quotes @cindex curved quotes address@hidden guillemets @findex electric-quote-mode One common way to quote is the typewriter convention, which quotes using straight apostrophes @t{'like this'} or double-quotes @t{"like @@ -420,11 +421,17 @@ Quotation Marks @t{“like this”}. In text files, typewriter quotes are simple and portable; curved quotes are less ambiguous and typically look nicer. address@hidden electric-quote-chars Electric Quote mode makes it easier to type curved quotes. As you type characters it optionally converts @t{`} to @t{‘}, @t{'} to @t{’}, @t{``} to @t{“}, and @t{''} to @t{”}. These conversions are suppressed in buffers whose coding systems cannot represent curved -quote characters. +quote characters. It's possible to change the default quotes listed +above, by customizing the variable @code{electric-quote-chars}, a list +of four characters, where the items correspond to the left single +quote, the right single quote, the left double quote and the right +double quote, respectively, whose default value is address@hidden'(?‘ ?’ ?“ ?”)}. @vindex electric-quote-paragraph @vindex electric-quote-comment @@ -445,7 +452,10 @@ Quotation Marks insert a curved quote even when Electric Quote is disabled or inactive, you can type @kbd{C-x 8 [} for @t{‘}, @kbd{C-x 8 ]} for @t{’}, @kbd{C-x 8 @{} for @t{“}, and @kbd{C-x 8 @}} for @t{”}. address@hidden Text}. address@hidden Text}. Note that the value of address@hidden does not affect these keybindings, they +are not keybindings of @code{electric-quote-mode} but bound in address@hidden @node Filling @section Filling Text diff --git a/etc/NEWS b/etc/NEWS index 14450a6..d52dbe6 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -60,6 +60,10 @@ affected by this, as SGI stopped supporting IRIX in December 2013. * Changes in Emacs 26.1 ++++ +** The new user variable 'electric-quote-chars' provides a list +of curved quotes for 'electric-quote-mode', allowing user to choose +the types of quotes to be used. --- The group 'wp', whose label was "text", is now deprecated. diff --git a/lisp/electric.el b/lisp/electric.el index 0ec0a1e..5c7be35 100644 --- a/lisp/electric.el +++ b/lisp/electric.el @@ -425,16 +425,26 @@ electric-quote-string :version "25.1" :type 'boolean :safe 'booleanp :group 'electricity) +(defcustom electric-quote-chars '(?‘ ?’ ?“ ?”) + "Curved quote characters for `electric-quote-mode'. +The items correspond to the left single quote, the right single +quote, the left double quote, and the right double quote, respectively." + :version "25.1" + :type 'list :safe 'listp :group 'electricity) + (defcustom electric-quote-paragraph t "Non-nil means to use electric quoting in text paragraphs." :version "25.1" :type 'boolean :safe 'booleanp :group 'electricity) -(defun electric--insertable-p (string) - (or (not buffer-file-coding-system) - (eq (coding-system-base buffer-file-coding-system) 'undecided) - (not (unencodable-char-position nil nil buffer-file-coding-system - nil string)))) +(defun electric--insertable-p (string-or-char) + (let ((str (if (characterp string-or-char) + (string string-or-char) + string-or-char))) + (or (not buffer-file-coding-system) + (eq (coding-system-base buffer-file-coding-system) 'undecided) + (not (unencodable-char-position nil nil buffer-file-coding-system + nil str))))) (defun electric-quote-post-self-insert-function () "Function that `electric-quote-mode' adds to `post-self-insert-hook'. @@ -457,30 +467,33 @@ electric-quote-post-self-insert-function (derived-mode-p 'text-mode) (or (eq last-command-event ?\`) (save-excursion (backward-paragraph) (point))))))) - (when start - (save-excursion - (if (eq last-command-event ?\`) - (cond ((and (electric--insertable-p "“") - (search-backward "‘`" (- (point) 2) t)) - (replace-match "“") - (when (and electric-pair-mode - (eq (cdr-safe - (assq ?‘ electric-pair-text-pairs)) - (char-after))) - (delete-char 1)) - (setq last-command-event ?“)) - ((and (electric--insertable-p "‘") - (search-backward "`" (1- (point)) t)) - (replace-match "‘") - (setq last-command-event ?‘))) - (cond ((and (electric--insertable-p "”") - (search-backward "’'" (- (point) 2) t)) - (replace-match "”") - (setq last-command-event ?”)) - ((and (electric--insertable-p "’") - (search-backward "'" (1- (point)) t)) - (replace-match "’") - (setq last-command-event ?’))))))))) + (pcase electric-quote-chars + (`(,q1 ,q2 ,q3 ,q4) + (when start + (save-excursion + (if (eq last-command-event ?\`) + (cond ((and (electric--insertable-p q3) + (search-backward (string q1 ?`) (- (point) 2) t)) + (replace-match (string q3)) + (when (and electric-pair-mode + (eq (cdr-safe + (assq q1 electric-pair-text-pairs)) + (char-after))) + (delete-char 1)) + (setq last-command-event q3)) + ((and (electric--insertable-p q1) + (search-backward "`" (1- (point)) t)) + (replace-match (string q1)) + (setq last-command-event q1))) + (cond ((and (electric--insertable-p q4) + (search-backward (string q2 ?') (- (point) 2) t)) + (replace-match (string q4)) + (setq last-command-event q4)) + ((and (electric--insertable-p q2) + (search-backward "'" (1- (point)) t)) + (replace-match (string q2)) + (setq last-command-event q2))))))) + (_ (error "‘electric-quote-chars’ must contain exactly 4 characters.")))))) (put 'electric-quote-post-self-insert-function 'priority 10) @@ -497,6 +510,9 @@ electric-quote-mode `electric-quote-comment', `electric-quote-string', and `electric-quote-paragraph'. +Customize `electric-quote-chars' in order to use quote chars +other than the ones listed here. + This is a global minor mode. To toggle the mode in a single buffer, use `electric-quote-local-mode'." :global t :group 'electricity -- 2.7.4