[vim/vim] Virtual Replace mode: BS over multi-byte text eats the padding (PR #21211)

4 views
Skip to first unread message

Volodymyr Chernetskyi

unread,
Sep 3, 2026, 7:28:45 AM (yesterday) Sep 3
to vim/vim, Subscribed

Problem: In Virtual Replace mode, backspacing over a character that
replaced several multi-byte characters deletes the padding
that follows it, so the text after the cursor loses its
alignment.
Solution: In replace_do_bs() advance by the length of the character at
the current offset instead of always measuring the first
restored character.

After the original characters are restored, replace_do_bs() adds up their screen width so it knows how much of the alignment padding to drop again. The loop advanced "i" by mb_ptr2len(p) - 1, which always returns the length of the first restored character rather than the length of the character at the offset being looked at.

One backspace can restore more than one character, because a wide character may have replaced several narrow ones. When those characters do not all have the same byte length the index lands in the middle of a character: chartabsize() then measures a trailing byte, counts it as an unprintable worth four cells, and the inflated width makes the following loop delete padding spaces that should have been kept.

call setline(1, 'aé    xyz')
call feedkeys("gR\u4e00\<BS>\e", 'xt')

leaves "aéxyz" instead of restoring the original line. Going the other way round ('éa') happens to work, since there the first character is the longer one.

This has been wrong since the loop was added in Vim 7.0.


You can view, comment on, or merge this pull request online at:

  https://github.com/vim/vim/pull/21211

Commit Summary

  • 7e005c4 Virtual Replace mode: BS over multi-byte text eats the padding

File Changes

(2 files)

Patch Links:


Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications, keep track of coding agent tasks and review pull requests on the go with GitHub Mobile for iOS and Android. Download it today!
You are receiving this because you are subscribed to this thread.Message ID: <vim/vim/pull/21211@github.com>

Reply all
Reply to author
Forward
0 new messages