From 32364bbbaa8bda68228a3b0191c0b340c252d2a2 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 14 Apr 2016 08:21:34 -0700 Subject: [PATCH] =?utf8?q?substitute-command-keys=20keeps=20quotes?= =?utf8?q?=E2=80=99=20text=20props?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Problem reported by Clément Pit--Claudel (Bug#23254). * src/doc.c: Include intervals.h. (Fsubstitute_command_keys): If the only substitutions are for quotes, copy the source string’s text properties too, since no substring lengths have changed. --- src/doc.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/doc.c b/src/doc.c index 1d466612c66..7cdb0d03a81 100644 --- a/src/doc.c +++ b/src/doc.c @@ -34,6 +34,7 @@ along with GNU Emacs. If not, see . */ #include "coding.h" #include "buffer.h" #include "disptab.h" +#include "intervals.h" #include "keymap.h" /* Buffer used for reading from documentation file. */ @@ -739,6 +740,7 @@ Otherwise, return a new string. */) { char *buf; bool changed = false; + bool nonquotes_changed = false; unsigned char *strp; char *bufp; ptrdiff_t idx; @@ -786,7 +788,7 @@ Otherwise, return a new string. */) { /* \= quotes the next character; thus, to put in \[ without its special meaning, use \=\[. */ - changed = true; + changed = nonquotes_changed = true; strp += 2; if (multibyte) { @@ -946,6 +948,8 @@ Otherwise, return a new string. */) length = SCHARS (tem); length_byte = SBYTES (tem); subst: + nonquotes_changed = true; + subst_quote: changed = true; { ptrdiff_t offset = bufp - buf; @@ -967,7 +971,7 @@ Otherwise, return a new string. */) length = 1; length_byte = sizeof uLSQM - 1; idx = strp - SDATA (string) + 1; - goto subst; + goto subst_quote; } else if (strp[0] == '`' && quoting_style == STRAIGHT_QUOTING_STYLE) { @@ -1003,7 +1007,22 @@ Otherwise, return a new string. */) } if (changed) /* don't bother if nothing substituted */ - tem = make_string_from_bytes (buf, nchars, bufp - buf); + { + tem = make_string_from_bytes (buf, nchars, bufp - buf); + if (!nonquotes_changed) + { + /* Nothing has changed other than quoting, so copy the string’s + text properties. FIXME: Text properties should survive other + changes too. */ + INTERVAL interval_copy = copy_intervals (string_intervals (string), + 0, SCHARS (string)); + if (interval_copy) + { + set_interval_object (interval_copy, tem); + set_string_intervals (tem, interval_copy); + } + } + } else tem = string; xfree (buf); -- 2.11.4.GIT