feat(editor): "extend selection" and "match all" in find/replace tab - #4279
feat(editor): "extend selection" and "match all" in find/replace tab#4279fuuulstack wants to merge 126 commits into
Conversation
t8y2
left a comment
There was a problem hiding this comment.
request changes:当前 PR 实际没有包含任何代码改动。
head f95b88b3eb92495fd02ea776526a4a2c26cf8e46 的文件树与 base 完全相同,GitHub 也显示 changed files 为 0。现有查找面板仍只有上一个、下一个和关闭按钮,快捷键注册中也没有单词扩选或 Alt+W。
看起来是先在 fork 中将 t8y2/dbx:main 合并到了 fork 的 main,随后又把这个同步上游的 merge commit 提交回了上游。请将实际功能提交推送到 PR 分支后再更新此 PR。
t8y2
left a comment
There was a problem hiding this comment.
request changes:上一轮 blocker 仍未闭环。
最新 head 34d7132ff373253db997825564a72164b9ffa955 相比上一轮 reviewed commit 只新增了 docs/data/contributors.json 的生成数据刷新,仍然没有 PR 标题和截图中描述的 CodeMirror 功能。当前查找面板没有“全部选中”按钮,快捷键注册和编辑器 keymap 中也没有 Alt+W 或扩选命令。
请将实际功能代码和对应测试推送到 PR 分支,并移除无关的 contributors 数据刷新。测试至少需要覆盖扩选层级、selection scope、零宽/Unicode 匹配、只读、多选择、快捷键冲突及大量匹配场景。
|
I have a bounded maintainer patch ready for this exact head. It implements syntax-aware extend selection, bounded Match All multi-selection, modifier-based match extension, shortcut registration, translations, and focused regression coverage (131 tests pass). This pull request currently has maintainer edits disabled, so I cannot attach the verified patch to the contributor branch. Please enable maintainer edits on the PR; I can then push the patch and continue the normal CI/squash flow. |
1. 🧪 变更概览:补充用户实际 SQL 的连续扩选回归测试。 2. 🧪 关键修改:验证大写关键字与 LIMIT 场景下,前两次命令依次选择 001 和完整字符串字面量。 3. 🧪 影响与测试:仅修改测试文件;定向测试 16 项通过,typecheck 与 lint 通过。
1. 📝 变更概览:记录查找结果全部选中与 Command+点击追加匹配项的交互设计。 2. 📝 关键修改:明确搜索选区工具边界、面板集成、作用域和焦点行为。 3. 🧪 影响与测试:仅新增设计文档,后续按 TDD 计划实现并验证。
1. 📝 变更概览:将已确认设计拆分为搜索选区工具、面板集成和完整验证三项任务。 2. 📝 关键修改:明确 TDD 测试、接口、共享编辑器多选依赖及国际化改动。 3. 🧪 影响与测试:仅新增实施计划,尚未修改生产代码。
1. ✨ 变更概览:新增搜索命中范围转换与多选区追加工具。 2. ✨ 关键修改:支持按 next/prev 方向环绕查找、跳过已选命中并保留反向选区。 3. 🧪 影响与测试:新增 5 项纯选区单元测试,全部通过。
1. ✨ 变更概览:在查找面板加入全部选中命中项与 Command+点击追加匹配选区。 2. ✨ 关键修改:复用当前搜索作用域和正则逻辑,新增 TextSelect 图标、中文/英文文案,并为共享编辑器开启多选。 3. 🧪 影响与测试:定向测试 10 项、类型检查和 lint 均通过,保留两条既有 lint warning。
|
| Locale | Missing entries |
|---|---|
es |
1 |
it |
1 |
ja |
1 |
pt-BR |
1 |
zh-TW |
1 |
Patch preview
diff --git a/apps/desktop/src/i18n/locales/es.ts b/apps/desktop/src/i18n/locales/es.ts
index 016fac1e1..c02f15054 100644
--- a/apps/desktop/src/i18n/locales/es.ts
+++ b/apps/desktop/src/i18n/locales/es.ts
@@ -825,6 +825,7 @@ export default withEnglishFallback({
close: "Cerrar (Esc)",
noResults: "Sin resultados",
inSelection: "En la selección",
+ selectAll: "Seleccionar todo",
},
executionPicker: {
title: "Execution Target",
diff --git a/apps/desktop/src/i18n/locales/it.ts b/apps/desktop/src/i18n/locales/it.ts
index 96a99cf32..747587ab0 100644
--- a/apps/desktop/src/i18n/locales/it.ts
+++ b/apps/desktop/src/i18n/locales/it.ts
@@ -823,6 +823,7 @@ export default withEnglishFallback({
close: "Chiudi (Esc)",
noResults: "Nessun risultato",
inSelection: "Nella selezione",
+ selectAll: "Seleziona tutto",
},
executionPicker: {
title: "Execution Target",
diff --git a/apps/desktop/src/i18n/locales/ja.ts b/apps/desktop/src/i18n/locales/ja.ts
index f5808c273..10846fd33 100644
--- a/apps/desktop/src/i18n/locales/ja.ts
+++ b/apps/desktop/src/i18n/locales/ja.ts
@@ -822,6 +822,7 @@ export default withEnglishFallback({
close: "閉じる (Esc)",
noResults: "結果なし",
inSelection: "選択範囲内",
+ selectAll: "すべて選択",
},
executionPicker: {
title: "Execution Target",
diff --git a/apps/desktop/src/i18n/locales/pt-BR.ts b/apps/desktop/src/i18n/locales/pt-BR.ts
index c22b1e106..ed95c4b95 100644
--- a/apps/desktop/src/i18n/locales/pt-BR.ts
+++ b/apps/desktop/src/i18n/locales/pt-BR.ts
@@ -824,6 +824,7 @@ export default withEnglishFallback({
close: "Fechar (Esc)",
noResults: "Nenhum resultado",
inSelection: "Na seleção",
+ selectAll: "Selecionar tudo",
},
executionPicker: {
title: "Execution Target",
diff --git a/apps/desktop/src/i18n/locales/zh-TW.ts b/apps/desktop/src/i18n/locales/zh-TW.ts
index 808c399a6..e1f07b1be 100644
--- a/apps/desktop/src/i18n/locales/zh-TW.ts
+++ b/apps/desktop/src/i18n/locales/zh-TW.ts
@@ -823,6 +823,7 @@ export default withEnglishFallback({
close: "關閉 (Esc)",
noResults: "無結果",
inSelection: "選取區內",
+ selectAll: "全部選中",
},
executionPicker: {
title: "執行目標",
t8y2
left a comment
There was a problem hiding this comment.
当前实现仍有 SQL 语义正确性和主线程性能 blocker。
-
apps/desktop/src/lib/editor/sqlSemanticSelectionRanges.ts:224-235按文本顺序合并AND/OR,声明的优先级表没有真正参与构建。例如a = 1 OR b = 2 AND c = 3中光标位于b时,会先扩选成a = 1 OR b = 2,而不是优先得到b = 2 AND c = 3。请按 SQL 运算符优先级和括号层级构建表达式范围,并补充混合 AND/OR、括号和子查询测试。 -
同一循环执行
logicalTokens.length + 1轮,并在每轮为每个逻辑词扫描持续增长的binary数组。实测 100 个 AND 条件单次扩选约 456ms,并生成 9904 个 ranges,编辑器会明显卡顿。请改为有界的线性或近线性表达式构建,并增加长条件链性能回归。 -
EditorSearchPanel.vue:113-121、:301-306使用Number.POSITIVE_INFINITY收集并一次创建全部匹配 selection。大文件中的短词或零宽正则会产生无界 ranges 和主线程卡顿。请设置明确上限、反馈截断状态,并覆盖大量匹配与零宽正则。
t8y2
left a comment
There was a problem hiding this comment.
我复核了最新 head f7ffec3834c627a27ea058526cd412b6113093b9。7 月 29 日 review 后唯一的新提交只刷新了 docs/data/contributors.json,没有修改功能代码,因此上一轮三个 blocker 仍然存在。
-
apps/desktop/src/lib/editor/sqlSemanticSelectionRanges.ts:224仍按文本顺序组合AND/OR,声明的优先级没有参与构建。a = 1 OR b = 2 AND c = 3中光标位于b时,仍会先扩选成a = 1 OR b = 2。请按 SQL 优先级和括号层级构建表达式范围,并补充混合AND/OR、括号、BETWEEN和子查询测试。 -
同一逻辑在
:225仍执行多轮全数组扫描。当前 head 上,100 个AND条件单次扩选约需 775ms,并返回 5004 个候选 range。请改成有界的线性或近线性实现,并增加长条件链性能回归。 -
EditorSearchPanel.vue:121和:304仍使用Number.POSITIVE_INFINITY收集并一次创建全部 selections。短词和零宽正则可以生成无界的匹配和光标。请设置明确上限、显示截断状态,并覆盖大量匹配和零宽正则。
另外,PR 当前与 main 冲突。只读 merge-tree 显示冲突仅在无关的 docs/data/contributors.json;建议更新分支后删除或重新生成这次 bot 刷新。当前 exact head 也没有 CI checks。
1. 🐛 变更概览:按 SQL 运算符优先级和括号层级线性构建语义扩选范围,修复混合 AND/OR、算术表达式和子查询的选择顺序。 2. 🚀 关键修改:新增正则最大匹配数量设置并默认限制为 1000;搜索计数、全部选中和追加光标使用有界收集,达到上限时显示截断反馈。 3. 🧪 影响与测试:补充长条件链、大量匹配和零宽正则回归;make check、make cargo-check-fast 及浏览器设置保存和多光标交互验证均通过。
|
| Locale | Missing entries |
|---|---|
es |
4 |
it |
4 |
ja |
4 |
pt-BR |
4 |
zh-TW |
4 |
Patch preview
diff --git a/apps/desktop/src/i18n/locales/es.ts b/apps/desktop/src/i18n/locales/es.ts
index 016fac1e1..106f5796d 100644
--- a/apps/desktop/src/i18n/locales/es.ts
+++ b/apps/desktop/src/i18n/locales/es.ts
@@ -825,6 +825,8 @@ export default withEnglishFallback({
close: "Cerrar (Esc)",
noResults: "Sin resultados",
inSelection: "En la selección",
+ selectAll: "Seleccionar todo",
+ resultsTruncated: "Resultados truncados, solo se cuentan y seleccionan los primeros {limit} resultados.",
},
executionPicker: {
title: "Execution Target",
@@ -4595,6 +4597,8 @@ export default withEnglishFallback({
dateTimeFormatAuto: "Reconocimiento automático",
dateTimeFormatSearchPlaceholder: "Seleccionar o ingresar formato",
dateTimeFormatEmpty: "Ingresar formato de fecha y hora personalizado",
+ regexMaxMatchCount: "Máximo de coincidencias de regex",
+ regexMaxMatchCountDescription: "Limita el conteo de búsquedas y el número de selecciones múltiples para evitar ralentizaciones en documentos grandes (100–10000).",
},
driverStore: {
jreDirRemoveFailed: "No se pudo eliminar el directorio JRE antiguo: {path} (error original: {error})",
diff --git a/apps/desktop/src/i18n/locales/it.ts b/apps/desktop/src/i18n/locales/it.ts
index 96a99cf32..f935e11f1 100644
--- a/apps/desktop/src/i18n/locales/it.ts
+++ b/apps/desktop/src/i18n/locales/it.ts
@@ -823,6 +823,8 @@ export default withEnglishFallback({
close: "Chiudi (Esc)",
noResults: "Nessun risultato",
inSelection: "Nella selezione",
+ selectAll: "Seleziona tutto",
+ resultsTruncated: "Risultati troncati, solo i primi {limit} match sono contati e selezionati.",
},
executionPicker: {
title: "Execution Target",
@@ -4593,6 +4595,8 @@ export default withEnglishFallback({
dateTimeFormatAuto: "Riconoscimento automatico",
dateTimeFormatSearchPlaceholder: "Seleziona o inserisci il formato",
dateTimeFormatEmpty: "Inserisci un formato data/ora personalizzato",
+ regexMaxMatchCount: "Numero massimo di corrispondenze regex",
+ regexMaxMatchCountDescription: "Limita il conteggio delle ricerche e il numero di selezioni multiple per evitare rallentamenti su documenti grandi (100–10000).",
},
driverStore: {
jreDirRemoveFailed: "Impossibile rimuovere la vecchia directory JRE: {path} (errore originale: {error})",
diff --git a/apps/desktop/src/i18n/locales/ja.ts b/apps/desktop/src/i18n/locales/ja.ts
index f5808c273..7fb754f16 100644
--- a/apps/desktop/src/i18n/locales/ja.ts
+++ b/apps/desktop/src/i18n/locales/ja.ts
@@ -822,6 +822,8 @@ export default withEnglishFallback({
close: "閉じる (Esc)",
noResults: "結果なし",
inSelection: "選択範囲内",
+ selectAll: "すべて選択",
+ resultsTruncated: "一致結果は切り捨てられ、最初の {limit} 件の一致のみを統計・選択します。",
},
executionPicker: {
title: "Execution Target",
@@ -4593,6 +4595,8 @@ export default withEnglishFallback({
dateTimeFormatAuto: "自動認識",
dateTimeFormatSearchPlaceholder: "形式を選択または入力",
dateTimeFormatEmpty: "カスタム日時形式を入力",
+ regexMaxMatchCount: "正規表現の最大一致数",
+ regexMaxMatchCountDescription: "検索統計と複数選択の数を制限し、大きなドキュメントでの遅延を回避します(100–10000)。",
},
driverStore: {
jreDirRemoveFailed: "古い JRE ディレクトリを削除できませんでした: {path}(元のエラー: {error})",
diff --git a/apps/desktop/src/i18n/locales/pt-BR.ts b/apps/desktop/src/i18n/locales/pt-BR.ts
index c22b1e106..1da0f9240 100644
--- a/apps/desktop/src/i18n/locales/pt-BR.ts
+++ b/apps/desktop/src/i18n/locales/pt-BR.ts
@@ -824,6 +824,8 @@ export default withEnglishFallback({
close: "Fechar (Esc)",
noResults: "Nenhum resultado",
inSelection: "Na seleção",
+ selectAll: "Selecionar todos",
+ resultsTruncated: "Resultados de correspondência truncados, apenas os primeiros {limit} itens correspondentes são contados e selecionados.",
},
executionPicker: {
title: "Execution Target",
@@ -4595,6 +4597,8 @@ export default withEnglishFallback({
dateTimeFormatAuto: "Detecção automática",
dateTimeFormatSearchPlaceholder: "Selecione ou digite um formato",
dateTimeFormatEmpty: "Insira um formato de data e hora personalizado",
+ regexMaxMatchCount: "Número máximo de correspondências regex",
+ regexMaxMatchCountDescription: "Limita o número de correspondências de pesquisa e seleções múltiplas para evitar lentidão em documentos grandes (100–10000).",
},
driverStore: {
jreDirRemoveFailed: "Não foi possível remover o diretório JRE antigo: {path} (erro original: {error})",
diff --git a/apps/desktop/src/i18n/locales/zh-TW.ts b/apps/desktop/src/i18n/locales/zh-TW.ts
index 808c399a6..9245d5569 100644
--- a/apps/desktop/src/i18n/locales/zh-TW.ts
+++ b/apps/desktop/src/i18n/locales/zh-TW.ts
@@ -823,6 +823,8 @@ export default withEnglishFallback({
close: "關閉 (Esc)",
noResults: "無結果",
inSelection: "選取區內",
+ selectAll: "全部選取",
+ resultsTruncated: "匹配結果已截斷,僅統計和選取前 {limit} 個匹配項。",
},
executionPicker: {
title: "執行目標",
@@ -4264,6 +4266,8 @@ export default withEnglishFallback({
shortcutUppercaseSelection: "選取內容轉為大寫",
shortcutLowercaseSelection: "選取內容轉為小寫",
shortcutExPasteSqlInCondition: "ExPaste:貼上為 IN 條件",
+ regexMaxMatchCount: "正則最大匹配數量",
+ regexMaxMatchCountDescription: "限制搜尋統計和多選區數量,避免大文件卡頓(100–10000)。",
},
driverStore: {
jreDirRemoveFailed: "無法刪除舊的 JRE 目錄:{path}(原始錯誤:{error})",
1. 🧪 变更概览:补充用户实际 SQL 的连续扩选回归测试。 2. 🧪 关键修改:验证大写关键字与 LIMIT 场景下,前两次命令依次选择 001 和完整字符串字面量。 3. 🧪 影响与测试:仅修改测试文件;定向测试 16 项通过,typecheck 与 lint 通过。
1. 📝 变更概览:记录查找结果全部选中与 Command+点击追加匹配项的交互设计。 2. 📝 关键修改:明确搜索选区工具边界、面板集成、作用域和焦点行为。 3. 🧪 影响与测试:仅新增设计文档,后续按 TDD 计划实现并验证。
1. 📝 变更概览:将已确认设计拆分为搜索选区工具、面板集成和完整验证三项任务。 2. 📝 关键修改:明确 TDD 测试、接口、共享编辑器多选依赖及国际化改动。 3. 🧪 影响与测试:仅新增实施计划,尚未修改生产代码。
1. ✨ 变更概览:新增搜索命中范围转换与多选区追加工具。 2. ✨ 关键修改:支持按 next/prev 方向环绕查找、跳过已选命中并保留反向选区。 3. 🧪 影响与测试:新增 5 项纯选区单元测试,全部通过。
1. ✨ 变更概览:在查找面板加入全部选中命中项与 Command+点击追加匹配选区。 2. ✨ 关键修改:复用当前搜索作用域和正则逻辑,新增 TextSelect 图标、中文/英文文案,并为共享编辑器开启多选。 3. 🧪 影响与测试:定向测试 10 项、类型检查和 lint 均通过,保留两条既有 lint warning。
1. 🐛 变更概览:按 SQL 运算符优先级和括号层级线性构建语义扩选范围,修复混合 AND/OR、算术表达式和子查询的选择顺序。 2. 🚀 关键修改:新增正则最大匹配数量设置并默认限制为 1000;搜索计数、全部选中和追加光标使用有界收集,达到上限时显示截断反馈。 3. 🧪 影响与测试:补充长条件链、大量匹配和零宽正则回归;make check、make cargo-check-fast 及浏览器设置保存和多光标交互验证均通过。
1. 🚀 变更概览:搜索与正则匹配恢复完整精确计数,仅限制“全部选中”一次创建的选区数量。 2. 🐛 关键修改:使用常量内存计数和流式匹配迭代,逐次追加光标不受批量上限影响,并提供可见的截断反馈。 3. 🧪 影响与测试:补充五万匹配、零宽正则和一万已有选区性能回归,make check、make cargo-check-fast 与浏览器 QA 均通过,并附性能测试报告。
1. 🧪 变更概览:新增八类不同 SQL 结构的语义扩选回归,覆盖混合逻辑、括号、BETWEEN、JOIN 和嵌套子查询。 2. 🐛 关键修改:避免将 WHERE 后括号误判为函数调用,并移除 BETWEEN 上下界形成的错误独立选择范围。 3. ✅ 影响与测试:语义扩选定向 31 项通过,make check 的格式、lint、类型检查和全量测试全部通过。
t8y2
left a comment
There was a problem hiding this comment.
request changes: the latest functional code resolves the previous multi-selection performance issue, but the branch history still needs to be rebuilt before this PR can be reviewed and merged safely.
The current head merges two parallel copies of the feature history. GitHub consequently reports 466 changed files and roughly 36.9k additions, while the actual editor feature delta is about 35 files and 3k additions. This stale-base graph is also breaking the pull-request label workflow because it checks out a base that predates the current script.
Please create a clean branch from the latest main, replay only the intended editor/search commits, and remove the old parallel chain, merge commit, and unrelated docs/data/contributors.json snapshot. Then force-push the rebuilt branch and rerun exact-head CI.
变更说明
新增单词扩选:默认快捷键
Alt+W,支持 SQL 语义层级扩选及普通文本回退。新增全部选中:编辑器的查找面板新增“全部选中”。另外按住
Command/Ctrl点击“上一个/下一个”可以在匹配区追加光标变更类型
涉及前端
验证
make check通过make cargo-check-fast通过pnpm test通过eslint通过关联 Issue
无