mirror of https://github.com/helix-editor/helix
Support features of :open in :vsplit & :hsplit
parent
12139a4c30
commit
0a10d33eb5
|
@ -104,6 +104,10 @@ fn open(cx: &mut compositor::Context, args: Args, event: PromptEvent) -> anyhow:
|
|||
return Ok(());
|
||||
}
|
||||
|
||||
open_impl(cx, args, Action::Replace)
|
||||
}
|
||||
|
||||
fn open_impl(cx: &mut compositor::Context, args: Args, action: Action) -> anyhow::Result<()> {
|
||||
for arg in args {
|
||||
let (path, pos) = crate::args::parse_file(&arg);
|
||||
let path = helix_stdx::path::expand_tilde(path);
|
||||
|
@ -113,7 +117,8 @@ fn open(cx: &mut compositor::Context, args: Args, event: PromptEvent) -> anyhow:
|
|||
let callback = async move {
|
||||
let call: job::Callback = job::Callback::EditorCompositor(Box::new(
|
||||
move |editor: &mut Editor, compositor: &mut Compositor| {
|
||||
let picker = ui::file_picker(editor, path.into_owned());
|
||||
let picker =
|
||||
ui::file_picker(editor, path.into_owned()).with_default_action(action);
|
||||
compositor.push(Box::new(overlaid(picker)));
|
||||
},
|
||||
));
|
||||
|
@ -122,7 +127,7 @@ fn open(cx: &mut compositor::Context, args: Args, event: PromptEvent) -> anyhow:
|
|||
cx.jobs.callback(callback);
|
||||
} else {
|
||||
// Otherwise, just open the file
|
||||
let _ = cx.editor.open(&path, Action::Replace)?;
|
||||
let _ = cx.editor.open(&path, action)?;
|
||||
let (view, doc) = current!(cx.editor);
|
||||
let pos = Selection::point(pos_at_coords(doc.text().slice(..), pos, true));
|
||||
doc.set_selection(view.id, pos);
|
||||
|
@ -1750,10 +1755,7 @@ fn vsplit(cx: &mut compositor::Context, args: Args, event: PromptEvent) -> anyho
|
|||
if args.is_empty() {
|
||||
split(cx.editor, Action::VerticalSplit);
|
||||
} else {
|
||||
for arg in args {
|
||||
cx.editor
|
||||
.open(&PathBuf::from(arg.as_ref()), Action::VerticalSplit)?;
|
||||
}
|
||||
open_impl(cx, args, Action::VerticalSplit)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
@ -1767,10 +1769,7 @@ fn hsplit(cx: &mut compositor::Context, args: Args, event: PromptEvent) -> anyho
|
|||
if args.is_empty() {
|
||||
split(cx.editor, Action::HorizontalSplit);
|
||||
} else {
|
||||
for arg in args {
|
||||
cx.editor
|
||||
.open(&PathBuf::from(arg.as_ref()), Action::HorizontalSplit)?;
|
||||
}
|
||||
open_impl(cx, args, Action::HorizontalSplit)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
|
|
@ -258,6 +258,7 @@ pub struct Picker<T: 'static + Send + Sync, D: 'static> {
|
|||
widths: Vec<Constraint>,
|
||||
|
||||
callback_fn: PickerCallback<T>,
|
||||
default_action: Action,
|
||||
|
||||
pub truncate_start: bool,
|
||||
/// Caches paths to documents
|
||||
|
@ -382,6 +383,7 @@ impl<T: 'static + Send + Sync, D: 'static + Send + Sync> Picker<T, D> {
|
|||
truncate_start: true,
|
||||
show_preview: true,
|
||||
callback_fn: Box::new(callback_fn),
|
||||
default_action: Action::Replace,
|
||||
completion_height: 0,
|
||||
widths,
|
||||
preview_cache: HashMap::new(),
|
||||
|
@ -440,6 +442,11 @@ impl<T: 'static + Send + Sync, D: 'static + Send + Sync> Picker<T, D> {
|
|||
self
|
||||
}
|
||||
|
||||
pub fn with_default_action(mut self, action: Action) -> Self {
|
||||
self.default_action = action;
|
||||
self
|
||||
}
|
||||
|
||||
/// Move the cursor by a number of lines, either down (`Forward`) or up (`Backward`)
|
||||
pub fn move_by(&mut self, amount: u32, direction: Direction) {
|
||||
let len = self.matcher.snapshot().matched_item_count();
|
||||
|
@ -1068,7 +1075,7 @@ impl<I: 'static + Send + Sync, D: 'static + Send + Sync> Component for Picker<I,
|
|||
key!(Esc) | ctrl!('c') => return close_fn(self),
|
||||
alt!(Enter) => {
|
||||
if let Some(option) = self.selection() {
|
||||
(self.callback_fn)(ctx, option, Action::Replace);
|
||||
(self.callback_fn)(ctx, option, self.default_action);
|
||||
}
|
||||
}
|
||||
key!(Enter) => {
|
||||
|
@ -1092,7 +1099,7 @@ impl<I: 'static + Send + Sync, D: 'static + Send + Sync> Component for Picker<I,
|
|||
self.handle_prompt_change(true);
|
||||
} else {
|
||||
if let Some(option) = self.selection() {
|
||||
(self.callback_fn)(ctx, option, Action::Replace);
|
||||
(self.callback_fn)(ctx, option, self.default_action);
|
||||
}
|
||||
if let Some(history_register) = self.prompt.history_register() {
|
||||
if let Err(err) = ctx
|
||||
|
|
Loading…
Reference in New Issue