emacs/lisp
Andrea Alberti ca5e9976b1 Pixel-direct alignment in visual-wrap-prefix-mode (bug#81039)
`visual-wrap--content-prefix' previously returned a column count
computed as

    (max (string-width prefix)
         (ceiling (string-pixel-width prefix) avg-space-width))

with two problems:

* `string-width' ignores `buffer-invisibility-spec', so an invisible
  prefix (hidden ATX markers under `markdown-ts-hide-markup', for
  example) still reserved its character count on line 1 via a
  `min-width' display property, shifting the visible heading right.

* With variable-pitch fonts, rounding the prefix width up to whole
  columns added visible padding whenever the natural width did not
  fall on an exact column boundary.

Return the prefix's natural pixel width via `string-pixel-width'
instead, which accounts for any display transformation applied to
the prefix (invisibility, `display' replacements, text scaling,
proportional fonts).  Drop the `min-width' property from
`visual-wrap--apply-to-line' so line 1 renders at its natural width.
Switch the continuation `wrap-prefix' to a mixed-unit `:align-to'
sum form:

    (space :align-to (+ (PIX) (EXTRA-INDENT . width)))

where PIX is the prefix's pixel width and EXTRA-INDENT is
`visual-wrap-extra-indent' in canonical character widths.  The
display engine resolves each term per the active frame and sums
them, so no Lisp-level unit conversion is needed.

Since `min-width' is no longer installed, the accumulation cycle
that commit 81a5beb8af (bug#73882) worked around cannot recur.
Drop the `min-width' strip from `visual-wrap--content-prefix' and
the `min-width' removal from `visual-wrap--remove-properties'.
Keep `min-width' in `visual-wrap--safe-display-specs' so that
lines where other modes install it are not skipped.

* lisp/visual-wrap.el (visual-wrap--content-prefix): Return pixel
width instead of column count; drop the `min-width' strip.
(visual-wrap--apply-to-line): Drop `min-width' on line 1; use
mixed-unit `:align-to' sum form for the continuation wrap-prefix.
(visual-wrap--adjust-prefix): Handle only string prefixes; the
numeric (pixel) case is now handled inline in `--apply-to-line'
via the mixed-unit `:align-to' sum form.
(visual-wrap--remove-properties): Drop `min-width' removal.
(visual-wrap--safe-display-specs): Add note about `min-width'.
* test/lisp/visual-wrap-tests.el: Update expected `wrap-prefix'
values to the new sum form.
(visual-wrap-tests/invisible-prefix): New test motivated by bug#81039.
(visual-wrap-tests/negative-extra-indent): New test; verify that a
large negative `visual-wrap-extra-indent' produces a valid
wrap-prefix (the display engine clamps the stretch to zero).
* test/manual/visual-wrap-test.el: New file.  Manual test suite
for visual-eyeball verification of prefix alignment behavior.

Reported-by: Andrea Alberti <a.alberti82@gmail.com>
Co-authored-by: Stefan Monnier <monnier@iro.umontreal.ca>
2026-05-26 16:56:32 -04:00
..
calc Fix updates of embedded formulas by 'calc-embedded-update-formula' 2026-05-17 10:57:53 +03:00
calendar Rename `icalendar-recur' type and related functions 2026-05-23 13:25:19 +03:00
cedet
emacs-lisp lisp/emacs-lisp/package.el (package-quickstart-refresh): Delete stale elc 2026-05-25 17:01:07 -04:00
emulation
erc Merge from origin/emacs-31 2026-05-21 00:24:52 +01:00
eshell Allow child processes to continue after EPIPE 2026-05-17 17:24:10 -07:00
gnus Gnus: Prefer passing functions to message-add-action 2026-05-26 15:54:48 -04:00
image
international Use plain autoload cookie with transient-define-prefix 2026-04-27 21:58:39 +02:00
language Add language-environment and input methods for Syriac 2026-04-23 11:31:10 +03:00
leim/quail Add language-environment and input methods for Syriac 2026-04-23 11:31:10 +03:00
mail shr.el: Don't insert image at outdated destination (bug#80945) 2026-05-18 22:26:12 -04:00
mh-e Improve previous change. 2026-04-10 11:04:29 -07:00
net Merge from origin/emacs-31 2026-05-23 07:23:33 -04:00
nxml Fix defining a few faces as empty 2026-04-27 21:35:44 +02:00
obsolete Mark gnus-dbus.el as obsolete 2026-05-09 12:50:23 +02:00
org ; Fix two file headers misunderstood by authors.el. 2026-05-07 20:04:04 +01:00
play Window handling bug fixes. 2026-03-17 18:32:40 -04:00
progmodes ;cperl-mode.el: Fix fontification edge cases 2026-05-25 11:23:34 +02:00
term ; * lisp/term/pgtk-win.el (icon-map-list): Fix :type. 2026-05-09 12:44:59 +03:00
textmodes Merge from origin/emacs-31 2026-05-23 17:30:21 +01:00
url ; Fix typo 2026-05-12 17:11:00 +02:00
use-package ; Fix handling of string by the use-package keyword :vc 2026-03-16 18:23:37 +01:00
vc vc-refresh-state: Use cond* 2026-05-23 12:47:24 +01:00
abbrev.el
align.el
allout-widgets.el
allout.el
ansi-color.el
ansi-osc.el
apropos.el
arc-mode.el
array.el
auth-source-pass.el Improve last change to auth-source-pass 2026-03-26 15:05:22 +01:00
auth-source.el Improve auth-source-backend-parse 2026-05-20 10:10:30 +02:00
autoinsert.el
autorevert.el
avoid.el
battery.el
bind-key.el Avoid infinite recursion in bind-keys-form (bug#80759) 2026-04-08 14:56:02 +00:00
bindings.el ; * lisp/bindings.el (mode-line-percent-position): Doc fix (bug#80617). 2026-03-15 12:16:40 +02:00
bookmark.el
bs.el
buff-menu.el
button.el
calculator.el
case-table.el
ChangeLog.1
ChangeLog.2
ChangeLog.3
ChangeLog.4
ChangeLog.5
ChangeLog.6
ChangeLog.7
ChangeLog.8
ChangeLog.9
ChangeLog.10
ChangeLog.11
ChangeLog.12
ChangeLog.13
ChangeLog.14
ChangeLog.15
ChangeLog.16
ChangeLog.17
char-fold.el
chistory.el
cmuscheme.el
color.el
comint.el (comint--fontify-input-fontify-region): Silence messages (bug#80870) 2026-04-23 11:16:05 -04:00
completion-preview.el New variable 'completion-frontend-properties' (bug#80990) 2026-05-09 20:06:25 +02:00
completion.el
composite.el
COPYING
cus-dep.el
cus-edit.el Bump master Emacs version to 32.0.50 2026-05-07 17:46:43 +01:00
cus-face.el
cus-start.el
cus-theme.el
custom.el
dabbrev.el (dabbrev-completion): Improve last fix for bug#80645 2026-03-22 10:58:40 -04:00
delim-col.el
delsel.el (delete-selection-repeat-replace-region): Partial fix for bug#80216 2026-03-17 12:40:22 -04:00
descr-text.el
desktop.el Add predicate for initial_terminal 2026-03-26 15:19:56 +01:00
dframe.el
dired-aux.el vc-rename-file: New OK-IF-ALREADY-EXISTS parameter 2026-04-15 10:06:20 -04:00
dired-x.el
dired.el Restrict Dired handling of newlines in file names 2026-04-17 19:26:37 +02:00
dirtrack.el
disp-table.el Prettify special glyphs 2026-05-23 14:12:19 +03:00
display-fill-column-indicator.el Add predicate for initial_terminal 2026-03-26 15:19:56 +01:00
display-line-numbers.el
dnd.el
doc-view.el
dom.el
dos-fns.el
dos-vars.el
dos-w32.el
double.el
dynamic-setting.el
ebuff-menu.el
ecomplete.el
editorconfig-conf-mode.el
editorconfig-core-handle.el
editorconfig-core.el
editorconfig-fnmatch.el
editorconfig-tools.el
editorconfig.el
edmacro.el
ehelp.el
elec-pair.el
electric.el
elide-head.el
emacs-lock.el
env.el
epa-dired.el
epa-file.el Fix last change 2026-04-01 16:48:09 +02:00
epa-hook.el
epa-ks.el
epa-mail.el
epa.el
epg-config.el
epg.el
expand.el
external-completion.el ; (external-completion-table): Fix a couple of typos. 2026-05-01 11:23:09 +02:00
ezimage.el
face-remap.el
facemenu.el
faces.el Introduce 'margin' face for window margin background 2026-05-05 11:21:57 +03:00
ffap.el (dired-at-point-prompter): Fix bug#80545 2026-04-08 15:19:06 -04:00
filecache.el
fileloop.el
filenotify.el
files-x.el Set indent property for with-connection-local-variables 2026-04-27 21:38:00 +02:00
files.el Fix file-name-non-special implementation of get-file-buffer 2026-05-12 08:48:43 +02:00
filesets.el
find-cmd.el
find-dired.el
find-file.el
find-lisp.el
finder.el
flow-ctrl.el
foldout.el
follow.el
font-core.el
font-lock.el
format-spec.el Call format-spec substitution functions in current buffer 2026-04-27 21:11:52 +02:00
format.el
forms.el
frame.el Add predicate for initial_terminal 2026-03-26 15:19:56 +01:00
frameset.el Add predicate for initial_terminal 2026-03-26 15:19:56 +01:00
fringe.el
generic-x.el
help-at-pt.el
help-fns.el ; Improve doc strings of several Help-related user options 2026-05-06 14:19:50 +03:00
help-macro.el
help-mode.el
help.el ; Improve doc strings of several Help-related user options 2026-05-06 14:19:50 +03:00
hex-util.el
hexl.el
hfy-cmap.el
hi-lock.el
hilit-chg.el
hippie-exp.el
hl-line.el
htmlfontify.el ; htmlfontify: Handle 'reset' face attribute value (bug#81032) 2026-05-14 17:11:43 +02:00
ibuf-ext.el
ibuf-macs.el
ibuffer.el ; * lisp/ibuffer.el (ibuffer-fontification-alist): Doc fix (bug#80618). 2026-03-19 17:46:57 +02:00
icomplete.el In fido-vertical-mode, let C-s and C-r recover their original use 2026-04-29 10:12:41 +01:00
ido.el
ielm.el
iimage.el
image-file.el
image-mode.el
image.el
imenu.el
indent-aux.el
indent.el
info-look.el
info-xref.el
info.el (Info-documentlanguage): Keep Info-related code in info.el 2026-04-25 09:56:25 -04:00
informat.el
isearch.el ; Improve documentation of lazy-highlight in search and replace commands 2026-05-22 14:46:13 +03:00
isearchb.el
jit-lock.el
jka-cmpr-hook.el
jka-compr.el
json.el
jsonrpc.el Jsonrpc: rework sync request handling (bug#80623) 2026-05-04 11:47:21 +01:00
keymap.el
kmacro.el (kmacro-end-call-mouse): Make obsolete 2026-03-27 08:54:14 -04:00
ldefs-boot.el ; Update ldefs-boot.el. 2026-04-29 14:55:23 +01:00
loadhist.el
loadup.el
locate.el
lpr.el
ls-lisp.el
macros.el
Makefile.in
man.el
master.el
mb-depth.el
md4.el
menu-bar.el Add predicate for initial_terminal 2026-03-26 15:19:56 +01:00
midnight.el
minibuf-eldef.el
minibuffer.el Merge from origin/emacs-31 2026-05-16 07:17:51 -04:00
misc.el
misearch.el
mouse-copy.el
mouse-drag.el
mouse.el Improve 'context-menu-send-to' (bug#79512) 2026-05-05 19:45:28 +03:00
mpc.el
msb.el
mwheel.el
newcomment.el
notifications.el
novice.el
obarray.el
outline.el ; Fix quotation of some symbols 2026-04-04 13:44:08 +01:00
paren.el Fix text visibility issue with show-paren--show-context-in-overlay 2026-04-01 06:28:51 +02:00
password-cache.el
pcmpl-cvs.el
pcmpl-git.el
pcmpl-gnu.el
pcmpl-linux.el
pcmpl-rpm.el
pcmpl-unix.el
pcmpl-x.el
pcomplete.el
pgtk-dnd.el
pixel-scroll.el
plstore.el
printing.el ; Fix 2 defcustoms in printing.el 2026-04-03 15:44:38 +03:00
proced.el ; Improve documentation of Proced 2026-04-25 09:01:48 +03:00
profiler.el
ps-bdf.el
ps-mule.el
ps-print.el
ps-samp.el
pulse.el
README
recentf.el
rect.el
register.el (register--get-method-type): Fix one more case (bug#80894) 2026-04-26 12:18:44 -04:00
registry.el
repeat.el
replace.el ; Improve documentation of lazy-highlight in search and replace commands 2026-05-22 14:46:13 +03:00
reposition.el
reveal.el
rfn-eshadow.el
ring-bell-fns.el
rot13.el
rtree.el
ruler-mode.el
savehist.el
saveplace.el
scroll-all.el
scroll-bar.el
scroll-lock.el
select.el
send-to.el Improve 'context-menu-send-to' (bug#79512) 2026-05-05 19:45:28 +03:00
server.el ; Improve documentation of Emacs server-client protocol 2026-05-02 12:35:48 +03:00
ses.el
shadowfile.el
shell.el
simple.el ; Improve documentation of commands that move by compilation errors 2026-05-17 09:05:13 +03:00
skeleton.el
so-long.el
sort.el
soundex.el
speedbar.el
sqlite-mode.el
sqlite.el
startup.el Fix 'prepare-user-lisp' to follow symlinks 2026-05-11 15:36:58 +02:00
strokes.el
subr.el Detect some API violations in combine-change-calls (bug#80877) 2026-05-20 11:27:40 +00:00
svg.el
system-sleep.el
system-taskbar.el
t-mouse.el
tab-bar.el Rebind 'tab-bar-mouse-close-tab' from <down-mouse-2> to <mouse-2> 2026-04-21 19:30:03 +03:00
tab-line.el New faces 'tab-line-active' and 'tab-line-inactive' (bug#80742) 2026-04-14 20:14:15 +03:00
tabify.el
talk.el
tar-mode.el
tempo.el
term.el Fix terminal emulation of "ESC [ K" sequence 2026-05-09 15:33:21 +00:00
thingatpt.el
thread.el
time-stamp.el ; time-stamp: rename some internal functions to include "--" 2026-04-07 09:28:32 -07:00
time.el
timezone.el
tmm.el
tool-bar.el ; * lisp/tool-bar.el (tool-bar-setup): Adapt to change for bug#80545. 2026-03-26 11:20:53 +02:00
tooltip.el
touch-screen.el
transient.el Update to Transient v0.13.3-10-g87d0ca08 2026-05-07 17:35:17 +02:00
tree-widget.el
treesit-x.el
treesit.el ; Fix byte-compilation warnings in non-Tree-Sitter builds 2026-05-16 14:13:56 +03:00
tty-tip.el
tutorial.el
type-break.el
uniquify.el
userlock.el
vcursor.el
version.el
view.el
visual-wrap.el Pixel-direct alignment in visual-wrap-prefix-mode (bug#81039) 2026-05-26 16:56:32 -04:00
w32-fns.el
w32-vars.el
wdired.el
which-key.el
whitespace.el ; * lisp/whitespace.el (whitespace-global-modes): Grammar fix. 2026-03-23 21:11:38 +00:00
wid-browse.el
wid-edit.el
widget.el
windmove.el
window-tool-bar.el
window-x.el
window.el ; Fix last fix to 'window--make-major-side-window' 2026-03-27 23:35:24 +01:00
winner.el
woman.el
x-dnd.el
xdg.el
xml.el
xt-mouse.el Add predicate for initial_terminal 2026-03-26 15:19:56 +01:00
xwidget.el
yank-media.el

This directory contains source code for the parts of Emacs that are
written in Emacs Lisp.  *.el files are Emacs Lisp source, and the
corresponding *.elc files are byte-compiled versions.  Byte-compiled
files are architecture-independent.

The term subdirectory contains Lisp files that customize Emacs for
certain terminal types.  When Emacs starts, it checks the TERM
environment variable to get the terminal type and loads
'term/${TERM}.el' if it exists.

The other subdirectories hold Lisp packages grouped by their general
purpose.