From 29f57665eb2dc5c1461257ff9b4662004e74069b Mon Sep 17 00:00:00 2001 From: cyq <15000851237@163.com> Date: Tue, 2 Jun 2026 02:11:31 +0800 Subject: [PATCH] fix(tui): narrow mention depth hint --- crates/tui/src/tui/file_mention.rs | 13 +++++++++++- crates/tui/src/tui/ui/tests.rs | 34 ++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/crates/tui/src/tui/file_mention.rs b/crates/tui/src/tui/file_mention.rs index 3a04e707..4e9e2d36 100644 --- a/crates/tui/src/tui/file_mention.rs +++ b/crates/tui/src/tui/file_mention.rs @@ -301,7 +301,7 @@ pub fn try_autocomplete_file_mention(app: &mut App) -> bool { } fn no_file_mention_matches_status(partial: &str, walk_depth: usize) -> String { - if walk_depth > 0 && (partial.contains('/') || partial.contains('\\')) { + if path_partial_reaches_walk_depth(partial, walk_depth) { format!( "No files match @{partial} (mention_walk_depth={walk_depth}; use /config set mention_walk_depth 0 to search deeper)" ) @@ -310,6 +310,17 @@ fn no_file_mention_matches_status(partial: &str, walk_depth: usize) -> String { } } +fn path_partial_reaches_walk_depth(partial: &str, walk_depth: usize) -> bool { + if walk_depth == 0 { + return false; + } + let component_count = partial + .split(['/', '\\']) + .filter(|component| !component.is_empty()) + .count(); + component_count >= walk_depth +} + /// Splice a completion into the input, replacing the `@` token at /// `byte_start` with `@`. Cursor moves to the end of the new /// token so further keystrokes extend (or escape via space) naturally. diff --git a/crates/tui/src/tui/ui/tests.rs b/crates/tui/src/tui/ui/tests.rs index 4f24373c..ffc4e525 100644 --- a/crates/tui/src/tui/ui/tests.rs +++ b/crates/tui/src/tui/ui/tests.rs @@ -4748,6 +4748,40 @@ fn try_autocomplete_file_mention_no_match_mentions_depth_cap_for_path_like_parti ); } +#[test] +fn try_autocomplete_file_mention_no_match_skips_depth_hint_for_shallow_path() { + let tmpdir = TempDir::new().expect("tempdir"); + + let mut app = create_test_app(); + app.workspace = tmpdir.path().to_path_buf(); + app.mention_walk_depth = 6; + app.input = "@shallow_missing/main.rs".to_string(); + app.cursor_position = app.input.chars().count(); + + assert!(try_autocomplete_file_mention(&mut app)); + assert_eq!( + app.status_message.as_deref(), + Some("No files match @shallow_missing/main.rs") + ); +} + +#[test] +fn try_autocomplete_file_mention_no_match_skips_depth_hint_when_unlimited() { + let tmpdir = TempDir::new().expect("tempdir"); + + let mut app = create_test_app(); + app.workspace = tmpdir.path().to_path_buf(); + app.mention_walk_depth = 0; + app.input = "@a/b/c/d/e/f/g/target".to_string(); + app.cursor_position = app.input.chars().count(); + + assert!(try_autocomplete_file_mention(&mut app)); + assert_eq!( + app.status_message.as_deref(), + Some("No files match @a/b/c/d/e/f/g/target") + ); +} + #[test] fn try_autocomplete_file_mention_returns_false_outside_mention() { let mut app = create_test_app();