Subject: Re: bug#69384: 30.0.50; :align-to and bidi-paragraph-direction interaction

From: Stephen Berman <[email-masked]>
Date: Sun, 25 Feb 2024 22:18:10 +0100

On Sun, 25 Feb 2024 21:45:43 +0200 Eli Zaretskii <[email-masked]> wrote:

>> From: Stephen Berman <[email-masked]>
>> Cc: [email-masked]
>> Date: Sun, 25 Feb 2024 19:26:55 +0100
>> 
>> On Sun, 25 Feb 2024 19:35:22 +0200 Eli Zaretskii <[email-masked]> wrote:
>> 
>> > I don't understand well enough what were you trying to achieve, so I
>> > cannot suggest how to do that.
>> 
>> I want to display RTL text aligned with LTR text; the buffer contains
>> mainly LTR text.  Currently just setting bidi-paragraph-direction to
>> 'left-to-right is sufficient for aligning at column 0, but I may want to
>> align to some column in the middle of the window, which I why I tried
>> using :align-to and found calculating the needed value cumbersome.
>
> Sorry, this is still too vague.  What do you mean by "RTL text aligned
> with LTR text"? "aligned" in what way and sense?
>
> How about an example of text showing what you want to do?  To avoid
> strange effects of bidi reordering, please use lower-case letters to
> represent LTR text and upper-case letters to represent RTL text.

The screenshot in my first post in this bug shows the alignment I want:
the last (i.e. leftmost) character of the Arabic string occupies the
same horizontal position (in this case, the leftmost column) as the
first (i.e. leftmost) character of the English string.

>> > What do you mean by "first column (0) in LTR order"?  D|o you mean the
>> > leftmost column in the visual order? something else?
>> 
>> Yes, column 0 as in a buffer containing only LTR text.
>
> Please don't talk about column numbers in this context, because it's
> confusing: in RTL text columns are counted from the right.  "Leftmost
> column", by contrast, is clear.

Ok.

>> >> the first two examples were meant to show that using these
>> >> individually also works.  But I gather from your reply that I've
>> >> misunderstood what :align-to set to 0 means; can you enlighten me?
>> >
>> > It's supposed to be a no-op, of course.  Exactly like in the strict
>> > LTR unidirectional text.  What else can it mean?
>> 
>> I now realize I shouldn't have used :align-to 0 for this case, since
>> setting bidi-paragraph-direction to 'left-to-right already gives the
>> desired column-0 alignment.
>
> Exactly.
>
>> It's for alignment to a columns > 0 that :align-to in combination
>> with bidi-paragraph-direction could be useful, if the value of
>> :align-to were easy to use, e.g. simply to to align the RTL text to
>> LTR-column 20 (instead of having to do some trial-and-error
>> calculation).  But the broken shaping thwarts that.
>
> You should be able to do that without tweaking
> bidi-paragraph-direction, since :align-to can use the 'left' and
> 'right' positions.  For example:
>
>   (let* ((a "السّلام عليكم")
> 	 (b "Hello")
> 	 (buf (get-buffer-create "Test3")))
>     (with-current-buffer buf
>       (erase-buffer)
>       (insert (propertize " " 'display
>                               `(space :align-to (- right 20))) a "\n\n" b)
>       (switch-to-buffer buf)))
>
> (Except that it looks like 'left' and 'right' are reversed in this
> case, probably a bug.)

Thanks for the suggestion and code sample.  However, this aligns the
*first* (i.e. *rightmost*) character of the Arabic string with the
position 20 columns from the left; see the attached screenshot,
produced by the following extension of your code sample:

(let* ((a "السّلام عليكم")
       (b "Hello")
       (buf (get-buffer-create "Test3")))
  (with-current-buffer buf
    (erase-buffer)
    (insert (propertize " " 'display `(space :align-to (- right 20)))
	    a "\n\n" (make-string 20 ? ) b
            "\n12345678901234567890")
    (switch-to-buffer buf)))

What I want is for the leftmost character of both strings to be aligned,
and with :align-to I can't seem to do this without having to make a
fiddly calculation.

> You can also use 'text' to stand for the width of the text-area of a
> window.

I don't see how that would avoid the fiddly calculation.

Steve Berman