substitute-command-keys keeps quotes’ text props

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.
This commit is contained in:
Paul Eggert 2016-04-14 08:21:34 -07:00
parent 567ab529f3
commit 32364bbbaa

View file

@ -34,6 +34,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include "coding.h" #include "coding.h"
#include "buffer.h" #include "buffer.h"
#include "disptab.h" #include "disptab.h"
#include "intervals.h"
#include "keymap.h" #include "keymap.h"
/* Buffer used for reading from documentation file. */ /* Buffer used for reading from documentation file. */
@ -739,6 +740,7 @@ Otherwise, return a new string. */)
{ {
char *buf; char *buf;
bool changed = false; bool changed = false;
bool nonquotes_changed = false;
unsigned char *strp; unsigned char *strp;
char *bufp; char *bufp;
ptrdiff_t idx; ptrdiff_t idx;
@ -786,7 +788,7 @@ Otherwise, return a new string. */)
{ {
/* \= quotes the next character; /* \= quotes the next character;
thus, to put in \[ without its special meaning, use \=\[. */ thus, to put in \[ without its special meaning, use \=\[. */
changed = true; changed = nonquotes_changed = true;
strp += 2; strp += 2;
if (multibyte) if (multibyte)
{ {
@ -946,6 +948,8 @@ Otherwise, return a new string. */)
length = SCHARS (tem); length = SCHARS (tem);
length_byte = SBYTES (tem); length_byte = SBYTES (tem);
subst: subst:
nonquotes_changed = true;
subst_quote:
changed = true; changed = true;
{ {
ptrdiff_t offset = bufp - buf; ptrdiff_t offset = bufp - buf;
@ -967,7 +971,7 @@ Otherwise, return a new string. */)
length = 1; length = 1;
length_byte = sizeof uLSQM - 1; length_byte = sizeof uLSQM - 1;
idx = strp - SDATA (string) + 1; idx = strp - SDATA (string) + 1;
goto subst; goto subst_quote;
} }
else if (strp[0] == '`' && quoting_style == STRAIGHT_QUOTING_STYLE) 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 */ 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 strings
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 else
tem = string; tem = string;
xfree (buf); xfree (buf);