Skip to content

vim: Fix incorrect bracket matching for symmetric quotes in cs operator#52321

Merged
ConradIrwin merged 3 commits intozed-industries:mainfrom
lingyaochu:vim_cs
Apr 17, 2026
Merged

vim: Fix incorrect bracket matching for symmetric quotes in cs operator#52321
ConradIrwin merged 3 commits intozed-industries:mainfrom
lingyaochu:vim_cs

Conversation

@lingyaochu
Copy link
Copy Markdown
Contributor

Context

Closes #46698

This PR fixes a bug where the cs (change surrounds) operator fails on symmetric delimiters like quotes.

In a sequence like c s ' ", Zed previously performed two independent searches. For a line like I'm 'goˇod', the first step (cs') correctly moves the cursor to the second quote: I'm ˇ'good'. However, when the replacement character " is pressed, change_surrounds would perform another scan from the new cursor position. Because quotes are symmetric, this second search would incorrectly match 'm ' as the target pair, leading to a broken result like I"m "good'.

I've refactored the workflow to ensure the search happens only once. prepare_and_move_to_valid_bracket_pair now computes and stores the Anchor positions of the detected pair directly into the operator state. change_surrounds then simply reuses these anchors instead of re-executing the search. This ensures correctness for quotes while remaining consistent with Vim/Neovim cursor behavior. While this slightly increases coupling between these two functions, it is an intentional trade-off since they exclusively serve the cs operation.

How to Review

The main changes are in crates/vim/src/surrounds.rs. I renamed check_and_move_to_valid_bracket_pair to prepare_and_move_to_valid_bracket_pair and updated it to return the detected bracket anchors. In change_surrounds, I removed the redundant search logic and updated it to perform the replacement using the provided anchors. You can also see the updated Operator::ChangeSurrounds enum variant in crates/vim/src/state.rs which now carries the anchor data.

Self-Review Checklist

  • I've reviewed my own diff for quality, security, and reliability
  • Unsafe blocks (if any) have justifying comments
  • The content is consistent with the UI/UX checklist
  • Tests cover the new/changed behavior
  • Performance impact has been considered and is acceptable

Release Notes:

  • Fixed an issue where the cs Vim operator incorrectly identified symmetric quotes in certain contexts.
@cla-bot cla-bot Bot added the cla-signed The user has signed the Contributor License Agreement label Mar 24, 2026
@github-actions github-actions Bot added the community champion Issues filed by our amazing community champions! 🫶 label Mar 24, 2026
@zed-codeowner-coordinator zed-codeowner-coordinator Bot requested a review from a team March 24, 2026 13:19
@zed-community-bot zed-community-bot Bot added the guild Pull requests by someone in Zed Guild. NOTE: the label application is automated via github actions label Mar 24, 2026
@zed-codeowner-coordinator zed-codeowner-coordinator Bot requested review from as-cii and dinocosta and removed request for a team March 24, 2026 13:19
@zelenenka zelenenka assigned ConradIrwin and unassigned as-cii Apr 15, 2026
@ConradIrwin ConradIrwin merged commit adfcb45 into zed-industries:main Apr 17, 2026
31 checks passed
@ConradIrwin
Copy link
Copy Markdown
Member

Thanks for fixing this!

@lingyaochu lingyaochu deleted the vim_cs branch April 17, 2026 08:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla-signed The user has signed the Contributor License Agreement community champion Issues filed by our amazing community champions! 🫶 guild Pull requests by someone in Zed Guild. NOTE: the label application is automated via github actions

4 participants