vim: Maintain block cursor for navigating/non-modifying operators (#21502)

The cursor shape now only changes to underline for operators that modify
text (like: delete, change, yank) while maintaining block shape for
navigation operators (like: find, till).

This better matches Vim/Nvim's behavior where the cursor only changes
shape when an operator that will modify text is pending.

Release Notes:

- vim: Improved cursor shape behavior to better match Vim
This commit is contained in:
Brian Tan 2024-12-13 21:06:18 -05:00 committed by GitHub
parent 901dbedf8d
commit 85c3aec6e7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -626,10 +626,23 @@ impl Vim {
pub fn cursor_shape(&self) -> CursorShape {
match self.mode {
Mode::Normal => {
if self.operator_stack.is_empty() {
CursorShape::Block
if let Some(operator) = self.operator_stack.last() {
match operator {
// Navigation operators -> Block cursor
Operator::FindForward { .. }
| Operator::FindBackward { .. }
| Operator::Mark
| Operator::Jump { .. }
| Operator::Register
| Operator::RecordRegister
| Operator::ReplayRegister => CursorShape::Block,
// All other operators -> Underline cursor
_ => CursorShape::Underline,
}
} else {
CursorShape::Underline
// No operator active -> Block cursor
CursorShape::Block
}
}
Mode::Replace => CursorShape::Underline,