# editor: Fix cursor animation across width and scroll changes \(\#64184\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/7a01ac15c5f69e86d66af641a835fa85fdfb0d06)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: 7a01ac15c5f69e86d66af641a835fa85fdfb0d06

Requested commit: 7a01ac15c5f69e86d66af641a835fa85fdfb0d06

Commit: 7a01ac15c5f69e86d66af641a835fa85fdfb0d06

Tree: ea04581ad3c9f6a81a1be54d6dec9adcbb7e889c

Author: Cain

Committer: GitHub

## Message

```
editor: Fix cursor animation across width and scroll changes (#64184)

Follow-up to #63195.

This PR fixes the cursor animation problems reported in [this
comment](https://github.com/zed-industries/zed/pull/63195#issuecomment-5662566417):

- Block cursors snapped instead of animating when moving between
characters with different display widths, such as an ASCII character and
an emoji or CJK character.
- Cursor animation disappeared near the top and bottom scroll margins
when keyboard navigation triggered vertical autoscrolling.

The first issue happened because any cursor geometry size change was
treated as a reason to snap. Cursor movement now retargets the animation
when either the rectangle position or size changes, while geometry
changes without a logical cursor move still snap immediately.

The second issue happened because every viewport change cleared the
active animation. Scroll-only viewport changes now translate the current
and target corner positions, as well as the previous target geometry, by
the scroll pixel delta before retargeting. This preserves the spring's
motion and velocity across autoscroll. Actual layout changes, including
text-area size, line height, and font advance changes, continue to snap.

Regression coverage includes:

- Both narrow-to-wide and wide-to-narrow cursor transitions, including
convergence to the new rectangle.
- Cursor movement in both directions while the viewport scrolls.
- Scrolling during an active animation without clearing its position or
velocity.
- Layout changes that must still snap.
- An editor-level keyboard autoscroll test using a vertical scroll
margin of 3.

Validation:

- `cargo test -p editor cursor_animation --lib`
- `cargo fmt --all --check`
- `cargo build -p zed --bin zed --profile release-fast`
- Manual verification with the release-fast binary

Release Notes:

- Fixed cursor animations when moving between characters of different
widths and during keyboard-triggered autoscrolling.

---------

Co-authored-by: Christopher Biscardi <chris@christopherbiscardi.com>
```

## Parents

- [6c9d10cb83084cfdbb9d4cf3919b57b7dc707758](https://git.cafe/gitcafe/zed/commit/6c9d10cb83084cfdbb9d4cf3919b57b7dc707758?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/7a01ac15c5f69e86d66af641a835fa85fdfb0d06?format=markdown)
