@@ -264,6 +264,7 @@ impl MappableCommand {
264 file_picker_in_current_directory, "Open file picker at current working directory",
264 file_picker_in_current_directory, "Open file picker at current working directory",
265 code_action, "Perform code action",
265 code_action, "Perform code action",
266 buffer_picker, "Open buffer picker",
266 buffer_picker, "Open buffer picker",
267+ jumplist_picker, "Open jumplist picker",
267 symbol_picker, "Open symbol picker",
268 symbol_picker, "Open symbol picker",
268 select_references_to_symbol_under_cursor, "Select symbol references",
269 select_references_to_symbol_under_cursor, "Select symbol references",
269 workspace_symbol_picker, "Open workspace symbol picker",
270 workspace_symbol_picker, "Open workspace symbol picker",
@@ -2270,6 +2271,87 @@ fn buffer_picker(cx: &mut Context) {
2270 cx.push_layer(Box::new(overlayed(picker)));
2271 cx.push_layer(Box::new(overlayed(picker)));
2274+fn jumplist_picker(cx: &mut Context) {
2277+ path: Option<PathBuf>,
2278+ selection: Selection,
2283+ impl ui::menu::Item for JumpMeta {
2286+ fn label(&self, _data: &Self::Data) -> Spans {
2290+ .map(helix_core::path::get_relative_path);
2291+ let path = match path.as_deref().and_then(Path::to_str) {
2292+ Some(path) => path,
2293+ None => SCRATCH_BUFFER_NAME,
2296+ let mut flags = Vec::new();
2297+ if self.is_current {
2301+ let flag = if flags.is_empty() {
2304+ format!(" ({})", flags.join(""))
2306+ format!("{} {}{} {}", self.id, path, flag, self.text).into()
2310+ let new_meta = |view: &View, doc_id: DocumentId, selection: Selection| {
2311+ let doc = &cx.editor.documents.get(&doc_id);
2312+ let text = doc.map_or("".into(), |d| {
2314+ .fragments(d.text().slice(..))
2315+ .map(Cow::into_owned)
2316+ .collect::<Vec<_>>()
2322+ path: doc.and_then(|d| d.path().cloned()),
2325+ is_current: view.doc == doc_id,
2329+ let picker = FilePicker::new(
2333+ .flat_map(|(view, _)| {
2337+ .map(|(doc_id, selection)| new_meta(view, *doc_id, selection.clone()))
2341+ |cx, meta, action| {
2342+ cx.editor.switch(meta.id, action);
2343+ let (view, doc) = current!(cx.editor);
2344+ doc.set_selection(view.id, meta.selection.clone());
2347+ let doc = &editor.documents.get(&meta.id)?;
2348+ let line = meta.selection.primary().cursor_line(doc.text().slice(..));
2349+ Some((meta.path.clone()?, Some((line, line))))
2352+ cx.push_layer(Box::new(overlayed(picker)));
2273impl ui::menu::Item for MappableCommand {
2355impl ui::menu::Item for MappableCommand {
2274 type Data = ReverseKeymap;
2356 type Data = ReverseKeymap;