From 2ecbd97fe854879257cf9ccaf2b2e1a3603de918 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Wed, 18 Dec 2024 08:28:22 -0700 Subject: [PATCH] vim: Support count with [x and ]x (#22176) Fixes: #21577 Fixes: #17245 Release Notes: - vim: Add support for [x/]x --- assets/keymaps/vim.json | 4 ++-- crates/vim/src/visual.rs | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index 597388368d..417916db4d 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -230,8 +230,8 @@ "ctrl-pageup": "pane::ActivatePrevItem", "insert": "vim::InsertBefore", // tree-sitter related commands - "[ x": "editor::SelectLargerSyntaxNode", - "] x": "editor::SelectSmallerSyntaxNode", + "[ x": "vim::SelectLargerSyntaxNode", + "] x": "vim::SelectSmallerSyntaxNode", "] d": "editor::GoToDiagnostic", "[ d": "editor::GoToPrevDiagnostic", "] c": "editor::GoToHunk", diff --git a/crates/vim/src/visual.rs b/crates/vim/src/visual.rs index 8d2b31a1de..b062d07ad9 100644 --- a/crates/vim/src/visual.rs +++ b/crates/vim/src/visual.rs @@ -36,6 +36,8 @@ actions!( SelectPrevious, SelectNextMatch, SelectPreviousMatch, + SelectSmallerSyntaxNode, + SelectLargerSyntaxNode, RestoreVisualSelection, VisualInsertEndOfLine, VisualInsertFirstNonWhiteSpace, @@ -74,6 +76,24 @@ pub fn register(editor: &mut Editor, cx: &mut ViewContext) { vim.select_match(Direction::Prev, cx); }); + Vim::action(editor, cx, |vim, _: &SelectLargerSyntaxNode, cx| { + let count = Vim::take_count(cx).unwrap_or(1); + for _ in 0..count { + vim.update_editor(cx, |_, editor, cx| { + editor.select_larger_syntax_node(&Default::default(), cx); + }); + } + }); + + Vim::action(editor, cx, |vim, _: &SelectSmallerSyntaxNode, cx| { + let count = Vim::take_count(cx).unwrap_or(1); + for _ in 0..count { + vim.update_editor(cx, |_, editor, cx| { + editor.select_smaller_syntax_node(&Default::default(), cx); + }); + } + }); + Vim::action(editor, cx, |vim, _: &RestoreVisualSelection, cx| { let Some((stored_mode, reversed)) = vim.stored_visual_mode.take() else { return;