Subject: bug#65021: 29.1; align-to on wrapped line regression

From: Axel Forsman <[email-masked]>
Date: Wed, 02 Aug 2023 13:10:06 +0000 (UTC)

I noticed that the interpretation of the hpos given to the :align-to
space specification property changed in Emacs 29.1 compared to 28.2,
without it being documented anywhere. In version 28 it counts relative
to the visual start of the line, whereas in version 29 it starts at the
logical start of the line.

That is, the following MWE exhibits different visual behavior in Emacs
28 contra 29:

    (insert
     (concat
      "\n"
      (make-string (round (* 1.25 (window-text-width))) ?x)
      (propertize " " 'display `(space :align-to ,(round (window-text-width) 2)))
      "foo\n\n"))

(In 28 the text "foo" is centered correctly by the space. In 29 the
space has zero-width and no effect.)

The previous behavior makes more sense in the context of section 41.16.3
Pixel Specification for Spaces in the Emacs manual, and it would be
quite the breaking change so I am hoping it was unintentional.

Kind regards
Axel Forsman

In GNU Emacs 29.1 (build 1, x86_64-pc-linux-gnu)
Repository revision: emacs-29.1
Repository branch: master
System Description: NixOS 23.05 (Stoat)

Configured using:
 'configure
 --prefix=/nix/store/whazydpl0yj8i03aapsd2cyry70mng55-emacs-unstable-29.1-nox
 --disable-build-details --with-modules --with-gif=no --with-jpeg=no
 --with-png=no --with-tiff=no --with-x=no --with-xpm=no
 --with-native-compilation --with-tree-sitter'

Configured features:
DBUS GMP GNUTLS GPM JSON LIBSELINUX LIBSYSTEMD LIBXML2 MODULES
NATIVE_COMP NOTIFY INOTIFY PDUMPER SECCOMP SOUND SQLITE3 THREADS
TREE_SITTER ZLIB

Important settings:
  value of $LC_MESSAGES: en_US.UTF-8
  value of $LANG: sv_SE.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  undo-tree-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  hotfuzz-vertico-mode: t
  vertico-mode: t
  xclip-mode: t
  evil-mode: t
  evil-local-mode: t
  electric-pair-mode: t
  delete-selection-mode: t
  global-auto-revert-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/run/current-system/sw/share/emacs/site-lisp/site-start hides /nix/store/whazydpl0yj8i03aapsd2cyry70mng55-emacs-unstable-29.1-nox/share/emacs/site-lisp/site-start

Features:
(shadow sort mail-extr emacsbug mule-util hotfuzz-module notmuch
notmuch-tree notmuch-jump notmuch-hello image wid-edit notmuch-show
notmuch-print notmuch-crypto notmuch-mua notmuch-message notmuch-draft
notmuch-maildir-fcc notmuch-address notmuch-company notmuch-parser
notmuch-wash diff-mode easy-mmode coolj goto-addr icalendar diary-lib
diary-loaddefs cal-menu calendar cal-loaddefs notmuch-tag crm
notmuch-lib notmuch-version notmuch-compat hl-line message sendmail
yank-media dired dnd dired-loaddefs rfc822 mml mailabbrev mail-utils
gmm-utils mailheader mm-view mml-smime mml-sec epa derived epg rfc6068
epg-config gnus-util text-property-search time-date smime password-cache
gnutls puny dig mm-decode mm-bodies mm-encode mailcap mail-parse rfc2231
rfc2047 rfc2045 mm-util ietf-drums mail-prsvr term/tmux term/xterm xterm
lua-mode-autoloads nix-mode-autoloads julia-mode-autoloads
cmake-mode-autoloads yaml-mode-autoloads haskell-mode-autoloads
typescript-mode-autoloads markdown-mode-autoloads rust-mode-autoloads
mytheme-theme ws-butler-autoloads rmsbolt-autoloads corfu-autoloads
yasnippet undo-tree diff queue yasnippet-autoloads transient format-spec
eieio eieio-core magit-autoloads magit-section-autoloads
git-commit-autoloads with-editor-autoloads dash-autoloads
xterm-color-autoloads devdocs-autoloads hotfuzz vertico compat
hotfuzz-autoloads vertico-autoloads compat-autoloads xclip
xclip-autoloads evil evil-keybindings evil-integration evil-maps
evil-commands reveal evil-jumps evil-command-window evil-search evil-ex
evil-types evil-macros evil-repeat evil-states evil-core byte-opt comp
regexp-opt comp-cstr warnings icons subr-x rx cl-seq cl-macs gv cl-extra
help-mode tool-bar advice evil-common thingatpt rect evil-vars ring
edmacro kmacro undo-tree-autoloads queue-autoloads evil-autoloads
goto-chg-autoloads pcase elec-pair delsel autorevert filenotify
cl-loaddefs cl-lib ekipage bytecomp byte-compile rmc iso-transl tooltip
cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type
elisp-mode tabulated-list replace newcomment text-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu
timer select mouse jit-lock font-lock syntax font-core term/tty-colors
frame minibuffer nadvice seq simple cl-generic indonesian philippine
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp
files window text-properties overlay sha1 md5 base64 format env
code-pages mule custom widget keymap hashtable-print-readable backquote
threads dbusbind inotify multi-tty make-network-process native-compile
emacs)

Memory information:
((conses 16 623896 226463)
 (symbols 48 15703 10)
 (strings 32 85936 57749)
 (string-bytes 1 4096111)
 (vectors 16 33101)
 (vector-slots 8 543541 137525)
 (floats 8 64 333)
 (intervals 56 62415 18186)
 (buffers 984 13))