Subject: bug#23254: closed (Re: 25.0.90; substitute-command-keys does not preserve text properties)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 14 Apr 2016 15:29:01 +0000

Your bug report

#23254: 25.0.90; substitute-command-keys does not preserve text properties

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
23254: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=23254
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: 25.0.90; substitute-command-keys does not preserve text properties
From: Paul Eggert <[email-masked]>
To: Clément Pit--Claudel <[email-masked]>
Cc: [email-masked]
Date: Thu, 14 Apr 2016 08:28:25 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

Although substitute-command-keys has never kept text properties when it 
makes a change, it is annoying that merely substituting quotes strips 
the properties, so I installed the attached patch into emacs-25 to fix 
this particular problem. Thanks for reporting it.

Subject: 25.0.90; substitute-command-keys does not preserve text properties
From: Clément Pit--Claudel <[email-masked]>
To: [email-masked]
Date: Sat, 9 Apr 2016 14:58:29 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

In Emacs 25, substitute-command-keys removes text properties of strings containing quotes:

> In Emacs 25:
(substitute-command-keys (propertize "`a'" 'prop 'val))
"‘a’"

> In Emacs 24.5:
(substitute-command-keys (propertize "`a'" 'prop 'val))
#("`a'" 0 3 (prop val))

As Eli pointed out on the mailing list,

> Anything that is substituted has its test properties removed:
> 
>   (substitute-command-keys (propertize "\\[forward-char]" 'prop 'val))
>    => "C-f"
> 
> The above is from Emacs 24.5.
> 
> I think patches are welcome to reinstate the properties.

This is an issue in particular for docstrings:

(defcustom my/pretty/set/option nil
  "Demo text properties in customize."
  :group 'emacs
  :type `(set (const :tag ,(concat (propertize "Title of option 1 (bold on both 24.5 and 25)" 'face '(:weight bold))
                                   "\n   "
                                   (propertize "Docs of option 1, in a smaller font on both 24.5 and 25." 'face '(:height 0.9))))
              (const :tag ,(concat (propertize "Title of option 2 (`bold' on 24.5 but not 25)" 'face '(:weight bold))
                                   "\n   "
                                   (propertize "Docs of option 2, in a smaller font on 24.5, but not 25." 'face '(:height 0.9))))))

This example uses text properties on `:tag's to make the customize buffer more readable. This works fine in GNU Emacs 24.5, but it stopped working on master (and emacs-25), because of substitute-command-keys replacing quotes and as a side effect dropping text properties.

Clément.