diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs index dea2e905c..e11311641 100644 --- a/helix-term/src/ui/picker.rs +++ b/helix-term/src/ui/picker.rs @@ -1002,7 +1002,7 @@ fn id(&self) -> Option<&'static str> { pub fn close_buffer_in_buffer_picker( component: &mut dyn Component, - cx: &mut compositor::Context, + cx: &mut Context, ) -> EventResult { let Some(picker) = component .as_any_mut() @@ -1029,6 +1029,56 @@ pub fn close_buffer_in_buffer_picker( EventResult::Consumed(None) } +// Above command is cool because it's for one specific picker. + +// This is also cool because it doesn't even need to interact with +// the picker, so we don't need concrete types: + +pub fn close_picker(_component: &mut dyn Component, _cx: &mut Context) -> EventResult { + close_fn() +} + +// Now this is a problem. It compiles ok. +// We can probably even specify it in the default keymap: +// +// MappableCommand::Component { name: "..", doc: "..", fun: crate::ui::picker::to_start } +// +// But how do we represent this in keymap config? Do we do namespacing in the +// command names and end up with tens of commands for scrolling each picker? +// +// MappableCommand::Component { +// name: "file_picker::to_start", +// doc: "..", +// crate::ui::picker::to_start, +// }, +// MappableCommand::Component { +// name: "buffer_picker::to_start", +// doc: "..", +// crate::ui::picker::to_start, +// }, +// +// Can we use a macro to close over the verbose parts of this? +// +// Can we do something clever with a hypothetical AnyPicker interface +// similar to AnyComponent? Will we have to do that for every Component +// that uses generics? + +pub fn to_start( + component: &mut dyn Component, + _cx: &mut Context, +) -> EventResult { + let Some(picker) = component + .as_any_mut() + .downcast_mut::>() + else { + return EventResult::Ignored(None); + }; + + picker.cursor = 0; + + EventResult::Consumed(None) +} + fn close_fn() -> EventResult { EventResult::Consumed(Some(Box::new(|compositor: &mut Compositor, _ctx| { // remove the layer