zsh-autosuggestions/src
Daniel Portales a98dd4abcf Fix region_highlight entries leaking across accept/edit cycles
Before this change, the highlight module tracked only the most recent
plugin-owned entry in a scalar (_ZSH_AUTOSUGGEST_LAST_HIGHLIGHT) and
relied on a parameter-expansion subtraction to remove it:

    region_highlight=("${(@)region_highlight:#$_ZSH_AUTOSUGGEST_LAST_HIGHLIGHT}")

That has two failure modes:

1. The tracked string is expanded as a zsh glob pattern. If the user's
   ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE contains characters like `#`
   (e.g. `fg=#RRGGBB`), the entry is never removed and orphans
   accumulate in region_highlight across redraws. See #789.

2. Only one entry can be tracked at a time. When apply is called
   repeatedly without a successful reset (which happens under fast edits
   and widget-wrapping interactions), every apply overwrites the tracked
   reference and previous entries are orphaned.

Both manifest as stale suggestion colors bleeding onto accepted text,
typically in combination with zsh-syntax-highlighting (whose entries
interleave with ours in region_highlight).

Changes:

* Track every plugin-owned entry in an array
  (_ZSH_AUTOSUGGEST_OWNED_HIGHLIGHTS).

* On zsh 5.9+, tag each entry with `memo=zsh-autosuggestions` and on
  reset strip by memo in a single pass — robust regardless of how other
  plugins manipulate region_highlight. This matches the mechanism
  zsh-syntax-highlighting has used since 0.8.0.

* On zsh < 5.9, remove owned entries by literal string comparison
  (loop, not pattern expansion) to avoid the `#`-as-glob issue.

* _ZSH_AUTOSUGGEST_LAST_HIGHLIGHT is retained and kept in sync for
  backwards compatibility with any external consumer.

Adds spec/highlight_spec.rb covering:
  - round-trip with a hex-colored style (regression for #789)
  - reset does not touch foreign region_highlight entries
  - accumulated orphans from repeated apply calls are all cleaned up

Supersedes #790 (which used `shift -p region_highlight` — incorrect
when another plugin has appended the most-recent entry).

Fixes #789, #698.
2026-04-20 07:52:36 -06:00
..
strategies cleanup: Consolidate autoloads 2020-01-26 21:15:47 -07:00
async.zsh Merge pull request #630 from codicodi/reset-fd 2023-09-07 09:39:17 -06:00
bind.zsh Be more specific about the built-in widgets we want to avoid wrapping 2020-01-25 08:01:37 -07:00
config.zsh Add more common widgets to list of clear widgets 2023-09-07 08:49:25 -06:00
fetch.zsh Implement completion suggestion strategy (#111) 2019-04-11 09:53:55 -06:00
highlight.zsh Fix region_highlight entries leaking across accept/edit cycles 2026-04-20 07:52:36 -06:00
start.zsh Enable async mode by default in newer versions of zsh 2020-01-26 21:18:49 -07:00
util.zsh Revert "Simplify escaping of pattern and fix match_prev_cmd strategy" 2017-12-06 08:08:53 -07:00
widgets.zsh Clear POSTDISPLAY instead of unsetting 2023-09-07 09:54:04 -06:00