From 52c3946c872c8bd96508f74cdda5cbb90c664306 Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Thu, 18 Jun 2015 21:00:20 +0000 Subject: [PATCH] Make translation of quotes to curly in doc strings optional. src/doc.c (traditional, prefer-unicode): new symbols. (help-quote-translation): new variable. (Fsubstitute_command_keys): make translation of quotes dependent on `help-quote-translation'; also translate curly quotes back to ASCII ones. lisp/cus-start.el (top-level): Add a customization entry for `help-quote-translation'. --- lisp/cus-start.el | 9 ++++++++- src/doc.c | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/lisp/cus-start.el b/lisp/cus-start.el index 8740f075621..5dd36811436 100644 --- a/lisp/cus-start.el +++ b/lisp/cus-start.el @@ -220,7 +220,14 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of (visible-bell display boolean) (no-redraw-on-reenter display boolean) - ;; dosfns.c + ;; doc.c + (help-quote-translation help + (choice + (const :tag "No translation" nil) + (const :tag "Translate curly single quotes to ASCII" traditional) + (const :tag "Translate ASCII single quotes to curly" prefer-unicode))) + + ;; dosfns.c (dos-display-scancodes display boolean) (dos-hyper-key keyboard integer) (dos-super-key keyboard integer) diff --git a/src/doc.c b/src/doc.c index f1ba64359a6..6794ec777ae 100644 --- a/src/doc.c +++ b/src/doc.c @@ -932,7 +932,8 @@ Otherwise, return a new string. */) strp = SDATA (string) + idx; } } - else if (strp[0] == '`') + else if ((Vhelp_quote_translation == Qprefer_unicode) + && (strp[0] == '`')) { in_quote = true; start = (unsigned char *) "\xE2\x80\x98"; /* ‘ */ @@ -942,12 +943,27 @@ Otherwise, return a new string. */) idx = strp - SDATA (string) + 1; goto subst; } - else if (strp[0] == '\'' && in_quote) + else if ((Vhelp_quote_translation == Qprefer_unicode) + && (strp[0] == '\'' && in_quote)) { in_quote = false; start = (unsigned char *) "\xE2\x80\x99"; /* ’ */ goto subst_quote; } + + else if ((Vhelp_quote_translation == Qtraditional) + && (strp[0] == 0xE2) + && (strp[1] == 0x80) + && ((strp[2] == 0x98) /* curly opening quote */ + || (strp[2] == 0x99))) /* curly closing quote */ + { + start = (strp[2] == 0x98) ? "`" : "'"; + length = 1; + length_byte = 1; + idx = strp - SDATA (string) + 3; + goto subst; + } + else if (! multibyte) /* just copy other chars */ *bufp++ = *strp++, nchars++; else @@ -977,6 +993,8 @@ void syms_of_doc (void) { DEFSYM (Qfunction_documentation, "function-documentation"); + DEFSYM (Qtraditional, "traditional"); + DEFSYM (Qprefer_unicode, "prefer-unicode"); DEFVAR_LISP ("internal-doc-file-name", Vdoc_file_name, doc: /* Name of file containing documentation strings of built-in symbols. */); @@ -986,6 +1004,18 @@ syms_of_doc (void) doc: /* A list of files used to build this Emacs binary. */); Vbuild_files = Qnil; + DEFVAR_LISP ("help-quote-translation", Vhelp_quote_translation, + doc: /* How to translate quotes for display in *Help*. +If the value is nil (default), no translation is done. +If it's the symbol `traditional', any occurrences of the curly quotes +are translated to their ASCII "equivalents", GRAVE and APOSTROPHE. +If it's the symbol `prefer-unicode', any matched pairs of GRAVE and +APOSTROPHE will get translated into the "equivalent" curly quotes. + +Note that any translation done is done in a fresh copy of the doc +string, and doesn't overwrite the original characters. */); + Vhelp_quote_translation = Qnil; + defsubr (&Sdocumentation); defsubr (&Sdocumentation_property); defsubr (&Ssnarf_documentation); -- 2.39.2