diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index ce5ce5aabdaeb804e73fd2a29de735f21d083638..550d294ea04dde4e58440c7253a412ffa6198561 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -360,6 +360,8 @@ "context": "Editor && vim_mode == visual && !VimWaiting", "bindings": { "u": "editor::Undo", + "o": "vim::OtherEnd", + "shift-o": "vim::OtherEnd", "c": "vim::VisualChange", "d": "vim::VisualDelete", "x": "vim::VisualDelete", diff --git a/crates/vim/src/visual.rs b/crates/vim/src/visual.rs index cad82bc1ea724a932404d1729023e4206b57bd20..ed41c70daaa6f97f432ff1d0f525729039d7a3e1 100644 --- a/crates/vim/src/visual.rs +++ b/crates/vim/src/visual.rs @@ -24,13 +24,15 @@ actions!( VisualDelete, VisualChange, VisualYank, - VisualPaste + VisualPaste, + OtherEnd, ] ); pub fn init(cx: &mut AppContext) { cx.add_action(toggle_visual); cx.add_action(toggle_visual_line); + cx.add_action(other_end); cx.add_action(change); cx.add_action(delete); cx.add_action(yank); @@ -150,6 +152,18 @@ pub fn toggle_visual_line( }) } +pub fn other_end(_: &mut Workspace, _: &OtherEnd, cx: &mut ViewContext) { + Vim::update(cx, |vim, cx| { + vim.update_active_editor(cx, |editor, cx| { + editor.change_selections(None, cx, |s| { + s.move_with(|_, selection| { + selection.reversed = !selection.reversed; + }) + }) + }) + }); +} + pub fn change(_: &mut Workspace, _: &VisualChange, cx: &mut ViewContext) { Vim::update(cx, |vim, cx| { vim.update_active_editor(cx, |editor, cx| {