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 ui::ActiveTheme;
use util::ResultExt;
use workspace::notifications::DetachAndPromptErr;
use workspace::{Item, SaveIntent, notifications::NotifyResultExt};
use workspace::{SplitDirection, notifications::DetachAndPromptErr};
use zed_actions::{OpenDocs, RevealTarget};
use crate::{
@ -175,6 +175,13 @@ struct VimSave {
}
/// 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)]
#[action(namespace = vim, no_json, no_register)]
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| {
fn err(s: String, window: &mut Window, cx: &mut Context<Editor>) {
let _ = window.prompt(
@ -998,8 +1032,24 @@ fn generate_commands(_: &App) -> Vec<VimCommand> {
save_intent: Some(SaveIntent::Overwrite),
}),
VimCommand::new(("cq", "uit"), zed_actions::Quit),
VimCommand::new(("sp", "lit"), workspace::SplitHorizontal),
VimCommand::new(("vs", "plit"), workspace::SplitVertical),
VimCommand::new(("sp", "lit"), workspace::SplitHorizontal).args(|_, args| {
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(
("bd", "elete"),
workspace::CloseActiveItem {