From de5bd2fa01fb95343d52e6f7c20a8ff2611ab7e0 Mon Sep 17 00:00:00 2001 From: cirry <812852553@qq.com> Date: Fri, 10 Jul 2026 17:44:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .reasonix/desktop-topic-auto-title-meta.json | 4 +- .reasonix/desktop-topic-created-at.json | 3 +- .reasonix/desktop-topic-title-sources.json | 3 +- .reasonix/desktop-topic-titles.json | 3 +- src-tauri/src/lib.rs | 99 +++++------- src/components/DirectorySidebar.vue | 149 +------------------ 6 files changed, 46 insertions(+), 215 deletions(-) diff --git a/.reasonix/desktop-topic-auto-title-meta.json b/.reasonix/desktop-topic-auto-title-meta.json index 69570b6..1af7c51 100644 --- a/.reasonix/desktop-topic-auto-title-meta.json +++ b/.reasonix/desktop-topic-auto-title-meta.json @@ -55,8 +55,8 @@ }, "topic_20260710-063053_353d579222d3b70b": { "stage": 3, - "userTurns": 3, + "userTurns": 4, "basisHash": "aaae120b1f33c2f2", - "updatedAt": 1783668572932 + "updatedAt": 1783674217586 } } \ No newline at end of file diff --git a/.reasonix/desktop-topic-created-at.json b/.reasonix/desktop-topic-created-at.json index 67bff44..5b59f18 100644 --- a/.reasonix/desktop-topic-created-at.json +++ b/.reasonix/desktop-topic-created-at.json @@ -9,5 +9,6 @@ "topic_20260710-034033_6432ee6566f7b432": 1783654833341, "topic_20260710-034724_3c6fb29d8d0a4119": 1783655244536, "topic_20260710-054543_5e7c427932aecd7b": 1783662343716, - "topic_20260710-063053_353d579222d3b70b": 1783665053391 + "topic_20260710-063053_353d579222d3b70b": 1783665053391, + "topic_20260710-090003_60717bd90da5ec68": 1783674003004 } \ No newline at end of file diff --git a/.reasonix/desktop-topic-title-sources.json b/.reasonix/desktop-topic-title-sources.json index 76cc3d3..b4ef565 100644 --- a/.reasonix/desktop-topic-title-sources.json +++ b/.reasonix/desktop-topic-title-sources.json @@ -47,5 +47,6 @@ "topic_20260710-034033_6432ee6566f7b432": "auto", "topic_20260710-034724_3c6fb29d8d0a4119": "auto", "topic_20260710-054543_5e7c427932aecd7b": "auto", - "topic_20260710-063053_353d579222d3b70b": "auto" + "topic_20260710-063053_353d579222d3b70b": "auto", + "topic_20260710-090003_60717bd90da5ec68": "auto" } \ No newline at end of file diff --git a/.reasonix/desktop-topic-titles.json b/.reasonix/desktop-topic-titles.json index 5b316c2..1414c6c 100644 --- a/.reasonix/desktop-topic-titles.json +++ b/.reasonix/desktop-topic-titles.json @@ -47,5 +47,6 @@ "topic_20260710-034033_6432ee6566f7b432": "我在点击目录树的时候新增文件夹和新建…", "topic_20260710-034724_3c6fb29d8d0a4119": "目录树中鼠标悬浮弹框dropmenu…", "topic_20260710-054543_5e7c427932aecd7b": "现在在markdown的编辑区域中…", - "topic_20260710-063053_353d579222d3b70b": "这个应用里有一个全局搜索的功能,帮我…" + "topic_20260710-063053_353d579222d3b70b": "这个应用里有一个全局搜索的功能,帮我…", + "topic_20260710-090003_60717bd90da5ec68": "新的会话" } \ No newline at end of file diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 46deead..88ec54e 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -334,23 +334,14 @@ fn rename_entry(path: String, new_name: String) -> Result { fn search_files( workspace: String, keyword: String, - case_sensitive: bool, - use_regex: bool, - whole_word: bool, - extensions: Vec, ) -> Result, String> { if keyword.is_empty() { return Ok(Vec::new()); } - let pattern = if use_regex { - keyword.clone() - } else { - regex::escape(&keyword) - }; - + let pattern = regex::escape(&keyword); let mut builder = regex::RegexBuilder::new(&pattern); - builder.case_insensitive(!case_sensitive); + builder.case_insensitive(true); let re = builder .build() .map_err(|e| format!("正则表达式无效: {}", e))?; @@ -362,8 +353,6 @@ fn search_files( workspace_path, workspace_path, &re, - whole_word, - &extensions, &mut results, )?; @@ -375,8 +364,6 @@ fn walk_dir( base: &std::path::Path, dir: &std::path::Path, re: &Regex, - whole_word: bool, - extensions: &[String], results: &mut Vec, ) -> Result<(), String> { let entries = fs::read_dir(dir).map_err(|e| format!("无法读取目录: {}", e))?; @@ -389,14 +376,14 @@ fn walk_dir( let path = entry.path(); if path.is_dir() { - walk_dir(base, &path, re, whole_word, extensions, results)?; + walk_dir(base, &path, re, results)?; } else if path.is_file() { let ext = path .extension() .and_then(|e| e.to_str()) .unwrap_or("") .to_lowercase(); - if !extensions.iter().any(|e| e == &ext) { + if ext != "md" { continue; } @@ -409,59 +396,41 @@ fn walk_dir( let mut matches: Vec = Vec::new(); for (i, line) in lines.iter().enumerate() { - let has_match = if whole_word { - re.find_iter(line).any(|m| { - let start = m.start(); - let end = m.end(); - let prev_char = line[..start] - .chars() - .last() - .map(|c| !c.is_alphanumeric() && c != '_') - .unwrap_or(true); - let next_char = line[end..] - .chars() - .next() - .map(|c| !c.is_alphanumeric() && c != '_') - .unwrap_or(true); - prev_char && next_char - }) - } else { - re.is_match(line) - }; + if !re.is_match(line) { + continue; + } - if has_match { - let column = re - .find(line) - .map(|m| line[..m.start()].chars().count() + 1) - .unwrap_or(1); + let column = re + .find(line) + .map(|m| line[..m.start()].chars().count() + 1) + .unwrap_or(1); - let context_before: Vec = (0..i) - .rev() - .take(2) - .map(|j| lines[j].to_string()) - .collect::>() - .into_iter() - .rev() - .collect(); + let context_before: Vec = (0..i) + .rev() + .take(2) + .map(|j| lines[j].to_string()) + .collect::>() + .into_iter() + .rev() + .collect(); - let context_after: Vec = lines - .iter() - .skip(i + 1) - .take(2) - .map(|s| s.to_string()) - .collect(); + let context_after: Vec = lines + .iter() + .skip(i + 1) + .take(2) + .map(|s| s.to_string()) + .collect(); - matches.push(SearchMatch { - line: i + 1, - column, - line_text: line.to_string(), - context_before, - context_after, - }); + matches.push(SearchMatch { + line: i + 1, + column, + line_text: line.to_string(), + context_before, + context_after, + }); - if matches.len() >= 100 { - break; - } + if matches.len() >= 100 { + break; } } diff --git a/src/components/DirectorySidebar.vue b/src/components/DirectorySidebar.vue index 5fff412..c582f3d 100644 --- a/src/components/DirectorySidebar.vue +++ b/src/components/DirectorySidebar.vue @@ -83,10 +83,6 @@ const MAX_SEARCH_HISTORY = 10; const SEARCH_DEBOUNCE_MS = 300; const searchKeyword = ref(""); -const searchCaseSensitive = ref(false); -const searchUseRegex = ref(false); -const searchWholeWord = ref(false); -const searchExtensions = ref(["md"]); const searchResults = ref([]); const searchLoading = ref(false); const searchError = ref(""); @@ -95,21 +91,6 @@ const searchInputRef = ref(null); const searchFocusedFile = ref(null); let searchDebounceTimer: ReturnType | null = null; -const searchableTypes = [ - { label: "Markdown (.md)", value: "md" }, - { label: "纯文本 (.txt)", value: "txt" }, - { label: "JSON (.json)", value: "json" }, - { label: "YAML (.yaml/.yml)", value: "yaml" }, - { label: "JavaScript (.js)", value: "js" }, - { label: "TypeScript (.ts)", value: "ts" }, - { label: "CSS (.css)", value: "css" }, - { label: "HTML (.html)", value: "html" }, - { label: "XML (.xml)", value: "xml" }, -]; - -const showExtensionDropdown = ref(false); -const extensionDropdownRef = ref(null); - const totalMatchCount = computed(() => { return searchResults.value.reduce((sum, f) => sum + f.match_count, 0); }); @@ -150,10 +131,6 @@ async function performSearch() { const results = await invoke("search_files", { workspace: props.folderPath, keyword, - caseSensitive: searchCaseSensitive.value, - useRegex: searchUseRegex.value, - wholeWord: searchWholeWord.value, - extensions: searchExtensions.value, }); searchResults.value = results; if (results.length === 0) { @@ -181,18 +158,6 @@ function clearSearch() { searchFocusedFile.value = null; } -function toggleExtension(ext: string) { - const idx = searchExtensions.value.indexOf(ext); - if (idx >= 0) { - if (searchExtensions.value.length > 1) { - searchExtensions.value.splice(idx, 1); - } - } else { - searchExtensions.value = [...searchExtensions.value, ext]; - } - triggerSearch(); -} - function handleSearchKeydown(e: KeyboardEvent) { if (e.key === "Escape") { clearSearch(); @@ -231,13 +196,10 @@ function activateSearch() { function highlightMatchText(text: string): string { const keyword = searchKeyword.value.trim(); - if (!keyword || searchUseRegex.value) { - return escapeHtml(text); - } + if (!keyword) return escapeHtml(text); const escaped = keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); try { - const flags = searchCaseSensitive.value ? "g" : "gi"; - const re = new RegExp(`(${escaped})`, flags); + const re = new RegExp(`(${escaped})`, "gi"); return escapeHtml(text).replace(re, "$1"); } catch { return escapeHtml(text); @@ -251,21 +213,7 @@ function escapeHtml(text: string): string { .replace(/>/g, ">"); } -function closeExtensionDropdown(e: MouseEvent) { - if (extensionDropdownRef.value && !extensionDropdownRef.value.contains(e.target as Node)) { - showExtensionDropdown.value = false; - } -} - -watch(showExtensionDropdown, (open) => { - if (open) { - setTimeout(() => document.addEventListener("click", closeExtensionDropdown), 0); - } else { - document.removeEventListener("click", closeExtensionDropdown); - } -}); - -watch([searchKeyword, searchCaseSensitive, searchUseRegex, searchWholeWord], () => { +watch(searchKeyword, () => { triggerSearch(); }); @@ -703,64 +651,7 @@ function handleCreateRootFile() { - -
- - - - -
- -
- -
-
-
@@ -776,7 +667,7 @@ function handleCreateRootFile() { -
+