unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Arthur Miller <arthur.miller@live.com>
Cc: 52129@debbugs.gnu.org
Subject: bug#52129: 29.0.50; Wish: Extend `:align-to center' to work on lines in buffer
Date: Sat, 27 Nov 2021 11:15:16 +0200	[thread overview]
Message-ID: <834k7y0xjv.fsf@gnu.org> (raw)
In-Reply-To: <AM9PR09MB49774F0561A68CDD378F88BF96649@AM9PR09MB4977.eurprd09.prod.outlook.com> (message from Arthur Miller on Sat, 27 Nov 2021 09:47:58 +0100)

> From: Arthur Miller <arthur.miller@live.com>
> Cc: 52129@debbugs.gnu.org
> Date: Sat, 27 Nov 2021 09:47:58 +0100
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > I don't understand what exactly are you asking for.  Is your problem
> > that you have to prepend some character to the string and put the
> > :align-to spec on that character?  Because AFAIU that simple measure
> > should achieve your goal.
> 
> You mean something like this:
> 
> #+begin_src emacs-lisp
> (defun evc--time ()
>   (propertize
>    (time-stamp-string " %H:%M") 'face evc--time-face 'display '(space :align-to center)))
> 
> (defun evc--date ()
>   (propertize
>    (concat
>     " "
>     (capitalize (time-stamp-string "%A")) ". "
>     (capitalize (time-stamp-string "%B %d"))) 'face evc--date-face 'display '(space :align-to center)))

No, I mean to put this property:

    'display '(space :align-to center)

on a space character (or any other character, which will not be
displayed) that is prepended to the time-stamp-string you want to
display.

> (let* ((tlen (* 0.5 (string-pixel-width time)))
>              (dlen (* 0.5 (string-pixel-width date)))
>              (spct (propertize " " 'display `(space :align-to (- center (,tlen)))))
>              (spcd (propertize " " 'display `(space :align-to (- center (,dlen))))))
>         (insert spct time "\n" spcd date))
> 
> I hope above illustrates that it is not just to prepend a space, you have to
> calculate how much it should extend to.

So you want to center the string, not its first character?  OK, but
why is the above a problem?  It's simple enough code, I think.

> Also, even if it would be just to prepend a spacer character, the goal is still
> to align text in center of a line, so why can't we just renderer to do it for
> us, instead of having such procedural way of telling it what to do. Why can we
> not just tell:
> 
> (defun evc--time ()
>   (propertize
>    (time-stamp-string " %H:%M") 'face evc--time-face 'display '(line :align-to center)))
> 
> or something similar.

Because the Emacs display code examines buffer text one character at a
time, left to right, and produces the glyphs for display for each
character before it goes to the next.  You are asking the display
engine to know the display width of your string before it performs the
layout calculations for that string, and that cannot work.  The
display code cannot even assume that it will traverse all the
characters of a line, it could be forced to stop before it reaches the
end of the line, in which case it cannot know that width even
post-factum.

> Also what if the text is longer then visual line? Would it be possible for the
> rendering engine to center part of the tring with 'aligne-to center' property,
> and cull extensive part on sides that are outside. That is not acheavable with a spacer.

You want the display engine to decide where to break such a long line?
Or do you want to decide that up front and indicate that via the
portion of the text on which you put this hypothetical property?  IOW,
what exactly is the meaning of "cull" here?





  reply	other threads:[~2021-11-27  9:15 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-26 20:01 bug#52129: 29.0.50; Wish: Extend `:align-to center' to work on lines in buffer Arthur Miller
2021-11-27  5:59 ` Eli Zaretskii
2021-11-27  8:47   ` Arthur Miller
2021-11-27  9:15     ` Eli Zaretskii [this message]
2021-11-27 11:06       ` Arthur Miller
2021-11-27 11:25         ` Eli Zaretskii
2021-11-27 23:40           ` Arthur Miller
2021-11-28  7:48             ` Eli Zaretskii
2021-11-28 10:38               ` Arthur Miller
2021-11-29 15:59                 ` Lars Ingebrigtsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=834k7y0xjv.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=52129@debbugs.gnu.org \
    --cc=arthur.miller@live.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).