Fix . repeat for remapping surrounds/exchange actions (#26101)

Closes #ISSUE

cc @thomasheartman

Release Notes:

- vim: Fixes `.` repeat for remapped surrounds/exchange actions
This commit is contained in:
Conrad Irwin 2025-03-04 21:47:12 -07:00 committed by GitHub
parent 47f8f891c8
commit ec4719146a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 40 additions and 19 deletions

View file

@ -561,4 +561,41 @@ impl Operator {
| Operator::ToggleComments => false,
}
}
pub fn starts_dot_recording(&self) -> bool {
match self {
Operator::Change
| Operator::Delete
| Operator::Replace
| Operator::Indent
| Operator::Outdent
| Operator::AutoIndent
| Operator::Lowercase
| Operator::Uppercase
| Operator::OppositeCase
| Operator::ToggleComments
| Operator::ReplaceWithRegister
| Operator::Rewrap
| Operator::ShellCommand
| Operator::AddSurrounds { target: None }
| Operator::ChangeSurrounds { target: None }
| Operator::DeleteSurrounds
| Operator::Exchange => true,
Operator::Yank
| Operator::Object { .. }
| Operator::FindForward { .. }
| Operator::FindBackward { .. }
| Operator::Sneak { .. }
| Operator::SneakBackward { .. }
| Operator::Mark
| Operator::Digraph { .. }
| Operator::Literal { .. }
| Operator::AddSurrounds { .. }
| Operator::ChangeSurrounds { .. }
| Operator::Jump { .. }
| Operator::Register
| Operator::RecordRegister
| Operator::ReplayRegister => false,
}
}
}

View file

@ -827,22 +827,9 @@ impl Vim {
}
fn push_operator(&mut self, operator: Operator, window: &mut Window, cx: &mut Context<Self>) {
if matches!(
operator,
Operator::Change
| Operator::Delete
| Operator::Replace
| Operator::Indent
| Operator::Outdent
| Operator::AutoIndent
| Operator::Lowercase
| Operator::Uppercase
| Operator::OppositeCase
| Operator::ToggleComments
| Operator::ReplaceWithRegister
) {
self.start_recording(cx)
};
if operator.starts_dot_recording() {
self.start_recording(cx);
}
// Since these operations can only be entered with pre-operators,
// we need to clear the previous operators when pushing,
// so that the current stack is the most correct
@ -853,9 +840,6 @@ impl Vim {
| Operator::DeleteSurrounds
) {
self.operator_stack.clear();
if let Operator::AddSurrounds { target: None } = operator {
self.start_recording(cx);
}
};
self.operator_stack.push(operator);
self.sync_vim_settings(window, cx);