From fb35cd98c820efd02185681a55323aeab1b2ae62 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Thu, 5 Sep 2024 19:45:18 -0600 Subject: [PATCH] vim: Add :y (#17448) Closes #16937 Updates #17397 Release Notes: - vim: Add `:y[ank]` --- crates/vim/src/command.rs | 3 ++- crates/vim/src/visual.rs | 15 +++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/crates/vim/src/command.rs b/crates/vim/src/command.rs index 669bf6813e..03bb892045 100644 --- a/crates/vim/src/command.rs +++ b/crates/vim/src/command.rs @@ -21,7 +21,7 @@ use crate::{ JoinLines, }, state::Mode, - visual::VisualDeleteLine, + visual::{VisualDeleteLine, VisualYankLine}, Vim, }; @@ -587,6 +587,7 @@ fn generate_commands(_: &AppContext) -> Vec { VimCommand::new(("lN", "ext"), editor::actions::GoToPrevDiagnostic).count(), VimCommand::new(("j", "oin"), JoinLines).range(), VimCommand::new(("d", "elete"), VisualDeleteLine).range(), + VimCommand::new(("y", "ank"), VisualYankLine).range(), VimCommand::new(("sor", "t"), SortLinesCaseSensitive).range(), VimCommand::new(("sort i", ""), SortLinesCaseInsensitive).range(), VimCommand::str(("E", "xplore"), "project_panel::ToggleFocus"), diff --git a/crates/vim/src/visual.rs b/crates/vim/src/visual.rs index a4d0441b80..4330136700 100644 --- a/crates/vim/src/visual.rs +++ b/crates/vim/src/visual.rs @@ -30,6 +30,7 @@ actions!( VisualDelete, VisualDeleteLine, VisualYank, + VisualYankLine, OtherEnd, SelectNext, SelectPrevious, @@ -58,7 +59,12 @@ pub fn register(editor: &mut Editor, cx: &mut ViewContext) { vim.record_current_action(cx); vim.visual_delete(true, cx); }); - Vim::action(editor, cx, |vim, _: &VisualYank, cx| vim.visual_yank(cx)); + Vim::action(editor, cx, |vim, _: &VisualYank, cx| { + vim.visual_yank(false, cx) + }); + Vim::action(editor, cx, |vim, _: &VisualYankLine, cx| { + vim.visual_yank(true, cx) + }); Vim::action(editor, cx, Vim::select_next); Vim::action(editor, cx, Vim::select_previous); @@ -440,10 +446,11 @@ impl Vim { self.switch_mode(Mode::Normal, true, cx); } - pub fn visual_yank(&mut self, cx: &mut ViewContext) { + pub fn visual_yank(&mut self, line_mode: bool, cx: &mut ViewContext) { self.store_visual_marks(cx); self.update_editor(cx, |vim, editor, cx| { - let line_mode = editor.selections.line_mode; + let line_mode = line_mode || editor.selections.line_mode; + editor.selections.line_mode = line_mode; vim.yank_selections_content(editor, line_mode, cx); editor.change_selections(None, cx, |s| { s.move_with(|map, selection| { @@ -613,7 +620,7 @@ impl Vim { self.stop_recording(cx); self.visual_delete(false, cx) } - Some(Operator::Yank) => self.visual_yank(cx), + Some(Operator::Yank) => self.visual_yank(false, cx), _ => {} // Ignoring other operators } }