Add dot-repeat to Vim mode (#40521)

## What changed

- Bind `.` in Vim normal mode to repeat the last complete edit.
- Record semantic delete, change, replace, paste, and insert-mode actions so repeats preserve motions, text objects, inserted text, and editor actions across keymap changes.
- Expose `vim_normal.repeat_last_change` in the configurable keymap and keymap picker, including conflict handling for existing custom bindings.

## Testing

- Add coverage for repeating deletes, replacements, complete changes, pasted and literal text, insert-mode editor actions, custom bindings, unavailable motions, and cleared buffers.

GitOrigin-RevId: 3213df964811e7902377ff1d93641e59f4037914
This commit is contained in:
Benjamin Carlsson authored and copyberry committed 2026-08-25 02:34:04 +00:00
1 parent cbfd999db7
commit c1db22a3cd
16 files changed
+658 -71

No files matched your search

+10
View File
@@ -3801,6 +3801,7 @@
"open_line_above": null,
"open_line_below": null,
"paste_after": null,
"repeat_last_change": null,
"replace_char": null,
"start_change_operator": null,
"start_delete_operator": null,
@@ -4608,6 +4609,7 @@
"open_line_above": null,
"open_line_below": null,
"paste_after": null,
"repeat_last_change": null,
"replace_char": null,
"start_change_operator": null,
"start_delete_operator": null,
@@ -5016,6 +5018,14 @@
],
"description": "Paste after cursor (`p`)."
},
"repeat_last_change": {
"allOf": [
{
"$ref": "#/definitions/KeybindingsSpec"
}
],
"description": "Repeat the last complete edit (`.`)."
},
"replace_char": {
"allOf": [
{