Subject: Re: bug#52459: 28.0.90; prin1-to-string does not escape bidi control characters despite print-escape-control-characters=t

From: Dmitry Gutov <[email-masked]>
Date: Tue, 14 Dec 2021 21:40:50 +0300

On 14.12.2021 21:32, Daniel Mendler wrote:
> On 12/14/21 7:23 PM, Dmitry Gutov wrote:
>> I just did a little testing, and it seems
>> 'print-escape-control-characters' only affects 'prin1-to-string' and
>> 'prin1' but not 'message' or 'format'.
> No, `print-escape-multibyte` also applies to `format  and `message`. Try
> the following:
> 
> (let ((print-escape-multibyte t))
>    (format "%S" bidi-directional-controls-chars)
>    (message "%S" bidi-directional-controls-chars))

This is interesting, because print-escape-control-characters (which I 
mentioned) does not:

ELISP> (let ((print-escape-control-characters t)) (prin1 "\b"))

"\10"
""
ELISP> (let ((print-escape-control-characters t)) (prin1-to-string "\b"))
"\"\\10\""
ELISP> (let ((print-escape-control-characters t)) (format "\b"))
""
ELISP> (let ((print-escape-control-characters t)) (message "\b"))
""

 >> Is that a problem?
 >>
 >> If not, adding a new variable which makes the same distinction seems
 >> consistent with the current design.
 > Exactly. My proposal is consistent with the current design.

...but indeed if the new variable has the same scope as either of the 
existing ones, it seems easy to justify.

Maybe reconcile the scopes of the existing vars, too. 
'print-escape-multibyte' is documented as "This affects only ‘prin1’", 
but it is the other var which makes the distinction.