vim: Add :sp[lit] <filename> and :vs[plit] <filename> support (#33686)

Closes #32627

Release Notes:

- Adds `:sp[lit] <filename>` and `:vs[plit] <filename>` support
This commit is contained in:
AidanV 2025-07-08 22:43:43 -07:00 committed by GitHub
parent ecf4d5539e
commit acff48fc0d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -28,8 +28,8 @@ use std::{
use task::{HideStrategy, RevealStrategy, SpawnInTerminal, TaskId}; use task::{HideStrategy, RevealStrategy, SpawnInTerminal, TaskId};
use ui::ActiveTheme; use ui::ActiveTheme;
use util::ResultExt; use util::ResultExt;
use workspace::notifications::DetachAndPromptErr;
use workspace::{Item, SaveIntent, notifications::NotifyResultExt}; use workspace::{Item, SaveIntent, notifications::NotifyResultExt};
use workspace::{SplitDirection, notifications::DetachAndPromptErr};
use zed_actions::{OpenDocs, RevealTarget}; use zed_actions::{OpenDocs, RevealTarget};
use crate::{ use crate::{
@ -175,6 +175,13 @@ struct VimSave {
} }
/// Deletes the specified marks from the editor. /// Deletes the specified marks from the editor.
#[derive(Clone, PartialEq, Action)]
#[action(namespace = vim, no_json, no_register)]
struct VimSplit {
pub vertical: bool,
pub filename: String,
}
#[derive(Clone, PartialEq, Action)] #[derive(Clone, PartialEq, Action)]
#[action(namespace = vim, no_json, no_register)] #[action(namespace = vim, no_json, no_register)]
enum DeleteMarks { enum DeleteMarks {
@ -323,6 +330,33 @@ pub fn register(editor: &mut Editor, cx: &mut Context<Vim>) {
}); });
}); });
Vim::action(editor, cx, |vim, action: &VimSplit, window, cx| {
let Some(workspace) = vim.workspace(window) else {
return;
};
workspace.update(cx, |workspace, cx| {
let project = workspace.project().clone();
let Some(worktree) = project.read(cx).visible_worktrees(cx).next() else {
return;
};
let project_path = ProjectPath {
worktree_id: worktree.read(cx).id(),
path: Arc::from(Path::new(&action.filename)),
};
let direction = if action.vertical {
SplitDirection::vertical(cx)
} else {
SplitDirection::horizontal(cx)
};
workspace
.split_path_preview(project_path, false, Some(direction), window, cx)
.detach_and_log_err(cx);
})
});
Vim::action(editor, cx, |vim, action: &DeleteMarks, window, cx| { Vim::action(editor, cx, |vim, action: &DeleteMarks, window, cx| {
fn err(s: String, window: &mut Window, cx: &mut Context<Editor>) { fn err(s: String, window: &mut Window, cx: &mut Context<Editor>) {
let _ = window.prompt( let _ = window.prompt(
@ -998,8 +1032,24 @@ fn generate_commands(_: &App) -> Vec<VimCommand> {
save_intent: Some(SaveIntent::Overwrite), save_intent: Some(SaveIntent::Overwrite),
}), }),
VimCommand::new(("cq", "uit"), zed_actions::Quit), VimCommand::new(("cq", "uit"), zed_actions::Quit),
VimCommand::new(("sp", "lit"), workspace::SplitHorizontal), VimCommand::new(("sp", "lit"), workspace::SplitHorizontal).args(|_, args| {
VimCommand::new(("vs", "plit"), workspace::SplitVertical), Some(
VimSplit {
vertical: false,
filename: args,
}
.boxed_clone(),
)
}),
VimCommand::new(("vs", "plit"), workspace::SplitVertical).args(|_, args| {
Some(
VimSplit {
vertical: true,
filename: args,
}
.boxed_clone(),
)
}),
VimCommand::new( VimCommand::new(
("bd", "elete"), ("bd", "elete"),
workspace::CloseActiveItem { workspace::CloseActiveItem {