diff --git a/crates/agent/src/context_picker.rs b/crates/agent/src/context_picker.rs index 6b6254cf7f..a1588f3ec6 100644 --- a/crates/agent/src/context_picker.rs +++ b/crates/agent/src/context_picker.rs @@ -360,73 +360,15 @@ impl ContextPicker { } fn recent_entries(&self, cx: &mut App) -> Vec { - let Some(workspace) = self.workspace.upgrade().map(|w| w.read(cx)) else { + let Some(workspace) = self.workspace.upgrade() else { return vec![]; }; - let Some(context_store) = self.context_store.upgrade().map(|cs| cs.read(cx)) else { + let Some(context_store) = self.context_store.upgrade() else { return vec![]; }; - let mut recent = Vec::with_capacity(6); - - let mut current_files = context_store.file_paths(cx); - - if let Some(active_path) = active_singleton_buffer_path(&workspace, cx) { - current_files.insert(active_path); - } - - let project = workspace.project().read(cx); - - recent.extend( - workspace - .recent_navigation_history_iter(cx) - .filter(|(path, _)| !current_files.contains(&path.path.to_path_buf())) - .take(4) - .filter_map(|(project_path, _)| { - project - .worktree_for_id(project_path.worktree_id, cx) - .map(|worktree| RecentEntry::File { - project_path, - path_prefix: worktree.read(cx).root_name().into(), - }) - }), - ); - - let mut current_threads = context_store.thread_ids(); - - if let Some(active_thread) = workspace - .panel::(cx) - .map(|panel| panel.read(cx).active_thread(cx)) - { - current_threads.insert(active_thread.read(cx).id().clone()); - } - - let Some(thread_store) = self - .thread_store - .as_ref() - .and_then(|thread_store| thread_store.upgrade()) - else { - return recent; - }; - - thread_store.update(cx, |thread_store, _cx| { - recent.extend( - thread_store - .threads() - .into_iter() - .filter(|thread| !current_threads.contains(&thread.id)) - .take(2) - .map(|thread| { - RecentEntry::Thread(ThreadContextEntry { - id: thread.id, - summary: thread.summary, - }) - }), - ) - }); - - recent + recent_context_picker_entries(context_store, self.thread_store.clone(), workspace, cx) } } @@ -480,16 +422,6 @@ fn supported_context_picker_modes( modes } -fn active_singleton_buffer_path(workspace: &Workspace, cx: &App) -> Option { - let active_item = workspace.active_item(cx)?; - - let editor = active_item.to_any().downcast::().ok()?.read(cx); - let buffer = editor.buffer().read(cx).as_singleton()?; - - let path = buffer.read(cx).file()?.path().to_path_buf(); - Some(path) -} - fn recent_context_picker_entries( context_store: Entity, thread_store: Option>, @@ -498,14 +430,8 @@ fn recent_context_picker_entries( ) -> Vec { let mut recent = Vec::with_capacity(6); - let mut current_files = context_store.read(cx).file_paths(cx); - + let current_files = context_store.read(cx).file_paths(cx); let workspace = workspace.read(cx); - - if let Some(active_path) = active_singleton_buffer_path(workspace, cx) { - current_files.insert(active_path); - } - let project = workspace.project().read(cx); recent.extend( diff --git a/crates/agent/src/context_picker/completion_provider.rs b/crates/agent/src/context_picker/completion_provider.rs index 016d3e8567..c0af143d75 100644 --- a/crates/agent/src/context_picker/completion_provider.rs +++ b/crates/agent/src/context_picker/completion_provider.rs @@ -890,10 +890,10 @@ mod tests { assert_eq!( current_completion_labels(editor), &[ + "editor dir/", "seven.txt dir/b/", "six.txt dir/b/", "five.txt dir/b/", - "four.txt dir/a/", "Files & Directories", "Symbols", "Fetch" @@ -988,14 +988,14 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!( editor.text(cx), - "Lorem [@one.txt](file:dir/a/one.txt) Ipsum [@seven.txt](file:dir/b/seven.txt)" + "Lorem [@one.txt](file:dir/a/one.txt) Ipsum [@editor](file:dir/editor)" ); assert!(!editor.has_visible_completions_menu()); assert_eq!( crease_ranges(editor, cx), vec![ Point::new(0, 6)..Point::new(0, 36), - Point::new(0, 43)..Point::new(0, 77) + Point::new(0, 43)..Point::new(0, 69) ] ); }); @@ -1005,14 +1005,14 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!( editor.text(cx), - "Lorem [@one.txt](file:dir/a/one.txt) Ipsum [@seven.txt](file:dir/b/seven.txt)\n@" + "Lorem [@one.txt](file:dir/a/one.txt) Ipsum [@editor](file:dir/editor)\n@" ); assert!(editor.has_visible_completions_menu()); assert_eq!( crease_ranges(editor, cx), vec![ Point::new(0, 6)..Point::new(0, 36), - Point::new(0, 43)..Point::new(0, 77) + Point::new(0, 43)..Point::new(0, 69) ] ); }); @@ -1026,15 +1026,15 @@ mod tests { editor.update(&mut cx, |editor, cx| { assert_eq!( editor.text(cx), - "Lorem [@one.txt](file:dir/a/one.txt) Ipsum [@seven.txt](file:dir/b/seven.txt)\n[@six.txt](file:dir/b/six.txt)" + "Lorem [@one.txt](file:dir/a/one.txt) Ipsum [@editor](file:dir/editor)\n[@seven.txt](file:dir/b/seven.txt)" ); assert!(!editor.has_visible_completions_menu()); assert_eq!( crease_ranges(editor, cx), vec![ Point::new(0, 6)..Point::new(0, 36), - Point::new(0, 43)..Point::new(0, 77), - Point::new(1, 0)..Point::new(1, 30) + Point::new(0, 43)..Point::new(0, 69), + Point::new(1, 0)..Point::new(1, 34) ] ); }); diff --git a/crates/file_finder/src/file_finder.rs b/crates/file_finder/src/file_finder.rs index 7bcfe9c93c..1a74c4e4bb 100644 --- a/crates/file_finder/src/file_finder.rs +++ b/crates/file_finder/src/file_finder.rs @@ -468,15 +468,9 @@ impl Matches { path: found_path.clone(), panel_match: None, }; - self.matches - .extend(currently_opened.into_iter().map(path_to_entry)); - self.matches.extend( - history_items - .into_iter() - .filter(|found_path| Some(*found_path) != currently_opened) - .map(path_to_entry), - ); + self.matches + .extend(history_items.into_iter().map(path_to_entry)); return; }; diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 843bbd5786..209a195a36 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -1429,8 +1429,10 @@ impl Workspace { ) -> impl Iterator)> { let mut abs_paths_opened: HashMap> = HashMap::default(); let mut history: HashMap, usize)> = HashMap::default(); + for pane in &self.panes { let pane = pane.read(cx); + pane.nav_history() .for_each_entry(cx, |entry, (project_path, fs_path)| { if let Some(fs_path) = &fs_path { @@ -1452,11 +1454,26 @@ impl Workspace { } } }); + + if let Some(item) = pane.active_item() { + if let Some(project_path) = item.project_path(cx) { + let fs_path = self.project.read(cx).absolute_path(&project_path, cx); + + if let Some(fs_path) = &fs_path { + abs_paths_opened + .entry(fs_path.clone()) + .or_default() + .insert(project_path.clone()); + } + + history.insert(project_path, (fs_path, std::usize::MAX)); + } + } } history .into_iter() - .sorted_by_key(|(_, (_, timestamp))| *timestamp) + .sorted_by_key(|(_, (_, order))| *order) .map(|(project_path, (fs_path, _))| (project_path, fs_path)) .rev() .filter(move |(history_path, abs_path)| {