summaryrefslogtreecommitdiff
path: root/src/doc.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2016-04-14 08:21:34 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2016-04-14 08:23:00 -0700
commit32364bbbaa8bda68228a3b0191c0b340c252d2a2 (patch)
tree4629f3a685ae49f87e075610915bd722fb70aa66 /src/doc.c
parent567ab529f313bc8fe68d25b2ca95f5987cce81a1 (diff)
downloademacs-32364bbbaa8bda68228a3b0191c0b340c252d2a2.tar.gz
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.
Diffstat (limited to 'src/doc.c')
-rw-r--r--src/doc.c25
1 files 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 <http://www.gnu.org/licenses/>. */
#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);