From 387d4b4cd4bfaa562283a53dc4b9ea5729be9175 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Wed, 20 May 2026 22:32:12 +0800 Subject: [PATCH 01/10] =?UTF-8?q?[0146]=20=E6=9B=B4=E6=96=B0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=96=87=E6=A1=A3=EF=BC=9A=E7=84=A6=E7=82=B9=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E5=B7=A5=E5=85=B7=E6=A0=8F=E6=80=A7=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=8E=92=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- devel/0146.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 devel/0146.md diff --git a/devel/0146.md b/devel/0146.md new file mode 100644 index 0000000000..ec2d1e0c16 --- /dev/null +++ b/devel/0146.md @@ -0,0 +1,45 @@ +# [0146] 优化新建空白文档时焦点图标工具栏的性能 + +## 相关文档 +- [dddd.md](dddd.md) - 任务文档模板 + +## 任务相关的代码文件 +- `src/Edit/Interface/edit_interface.cpp` - `update_menus()` 和 `resume()` 中调用 `menu_icons(2, ...)` +- `src/Data/Document/new_style.cpp` - `get_style_menu()` 等 style/package 菜单缓存 +- `TeXmacs/progs/generic/generic-menu.scm` - `texmacs-focus-icons`、`standard-focus-icons` 定义 +- `TeXmacs/progs/generic/document-menu.scm` - `focus-style-icons` 定义 +- `TeXmacs/progs/kernel/gui/menu-widget.scm` - `menu-expand` 展开逻辑及静态菜单缓存 +- `TeXmacs/progs/texmacs/menus/main-menu.scm` - `style-menu` 等函数定义 + +## 如何测试 + +### 非确定性测试(性能验证) +1. 启动 Mogan +2. 使用 `Ctrl+N` 或菜单新建空白文档 +3. 观察新建文档的响应速度 + +## 如何提交 + +```bash +xmake b stem +``` + +## What + +优化新建空白文档时,焦点图标工具栏(focus icon toolbar)的 expand 过程的性能。 + +## Why + +新建空白文档时,焦点图标工具栏的刷新存在性能瓶颈,冷启动 `menu-expand 2` 耗时约 60~80ms: + +1. `resume()` 在视图激活时调用 `menu_icons(2, "(horizontal (link texmacs-focus-icons))")` +2. `texmacs-focus-icons` 调用 `(standard-focus-icons (focus-tree))`,该菜单包含大量动态内容 +3. 其中的 `(link style-menu)` 触发 `get_style_menu()`,每次都要 `descendance` 遍历样式目录树 + `compute_style_menu` 构建菜单字符串 + `eval` 解析 +4. scheme 层 `menu-expand` 对 `(assuming ...)`、`(=> ...)`、`(for ...)` 等的递归展开也有显著开销 + +## How + +1. **C++ 层 static cache**:为 `get_style_menu()`、`get_add_package_menu()`、`get_remove_package_menu()`、`get_toggle_package_menu()` 添加 `static object cache`,首次计算后缓存结果,后续调用直接返回 +2. **scheme 层静态菜单缓存**:在 `menu-expand-link` 中通过 `static-menu-link?` 识别不依赖运行时状态的菜单函数(如 `style-menu`、`add-package-menu` 等),用 `menu-expand-link-cache`(ahash-table)缓存展开结果,按函数符号名作为 key + +当前状态:C++ static cache 和 scheme 静态菜单缓存已生效,`update_menus` 阶段 `menu-expand 2` 从约 30ms 降至约 10ms。冷启动首次展开约 60ms 的排查仍在进行中。 From 3853d354e8d1c47decc857d1267d33554ec6138f Mon Sep 17 00:00:00 2001 From: Da Shen Date: Wed, 20 May 2026 22:32:21 +0800 Subject: [PATCH 02/10] =?UTF-8?q?[0146]=20=E7=84=A6=E7=82=B9=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E5=B7=A5=E5=85=B7=E6=A0=8F=E6=80=A7=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=9A=E7=BC=93=E5=AD=98=20style/package=20?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=8F=8A=E9=9D=99=E6=80=81=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=B1=95=E5=BC=80=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - get_style_menu() 等 4 个函数添加 static object cache,避免重复调用 descendance + eval - menu-expand-link 中添加 static-menu-link? 识别静态菜单,缓存展开结果 - 添加诊断日志用于定位 menu-expand 递归展开的耗时分布 Co-Authored-By: Claude Opus 4.7 --- TeXmacs/progs/generic/document-menu.scm | 6 ++- TeXmacs/progs/generic/generic-menu.scm | 20 ++++++++-- TeXmacs/progs/kernel/gui/menu-widget.scm | 49 +++++++++++++++++++++--- src/Data/Document/new_style.cpp | 24 ++++++++++-- src/Edit/Interface/edit_interface.cpp | 4 ++ 5 files changed, 89 insertions(+), 14 deletions(-) diff --git a/TeXmacs/progs/generic/document-menu.scm b/TeXmacs/progs/generic/document-menu.scm index 4af18f1291..18aea51d3e 100644 --- a/TeXmacs/progs/generic/document-menu.scm +++ b/TeXmacs/progs/generic/document-menu.scm @@ -1285,7 +1285,11 @@ ) ;define (tm-menu (focus-style-icons t) - (minibar (let* ((st* (get-style-list)) (st (if (null? st*) (list "no style") st*))) + (minibar (let* ((start0 (texmacs-time)) + (st* (get-style-list)) + (_ (let ((ms (- (texmacs-time) start0))) + (when (> ms 1) (display* " focus-bench get-style-list=" ms "ms\n")))) + (st (if (null? st*) (list "no style") st*))) (=> (balloon (eval (style-menu-name (car st))) "Document style") (link style-menu) --- diff --git a/TeXmacs/progs/generic/generic-menu.scm b/TeXmacs/progs/generic/generic-menu.scm index 1d9b420336..f416c72051 100644 --- a/TeXmacs/progs/generic/generic-menu.scm +++ b/TeXmacs/progs/generic/generic-menu.scm @@ -947,7 +947,7 @@ (dynamic (focus-misc-icons t)) (mini #t (with l - (focus-variants-of t) + (bench-focus "focus-variants-of" '(focus-variants-of t)) (assuming (<= (length l) 1) (inert ((eval `(verbatim ,(focus-tag-name (tree-label t)))) (noop))) ) ;assuming @@ -968,7 +968,11 @@ ) ;with ) ;mini (dynamic (focus-tag-extra-icons t)) - (assuming (cursor-inside? t) + (assuming (let* ((start (texmacs-time)) + (r (cursor-inside? t))) + (let ((ms (- (texmacs-time) start))) + (when (> ms 1) (display* " focus-bench cursor-inside?=" ms "ms\n")) + r)) ((balloon (icon "tm_exit_left.xpm") "Exit tag on the left") (structured-exit-left) ) ; @@ -977,12 +981,20 @@ ) ; ((balloon (icon "tm_focus_delete.xpm") "Remove tag") (remove-structure-upwards)) ) ;assuming - (assuming (focus-has-preferences? t) + (assuming (let* ((start (texmacs-time)) + (r (focus-has-preferences? t))) + (let ((ms (- (texmacs-time) start))) + (when (> ms 1) (display* " focus-bench focus-has-preferences?=" ms "ms\n")) + r)) (=> (balloon (icon "tm_focus_prefs.xpm") "Preferences for tag") (dynamic (focus-preferences-menu t)) ) ;=> ) ;assuming - (assuming (focus-has-parameters? t) + (assuming (let* ((start (texmacs-time)) + (r (focus-has-parameters? t))) + (let ((ms (- (texmacs-time) start))) + (when (> ms 1) (display* " focus-bench focus-has-parameters?=" ms "ms\n")) + r)) (=> (balloon (icon "tm_theme.xpm") "Rendering options for tag") (dynamic (focus-rendering-menu t)) ) ;=> diff --git a/TeXmacs/progs/kernel/gui/menu-widget.scm b/TeXmacs/progs/kernel/gui/menu-widget.scm index 2cc636f16f..ea6229abf3 100644 --- a/TeXmacs/progs/kernel/gui/menu-widget.scm +++ b/TeXmacs/progs/kernel/gui/menu-widget.scm @@ -1244,15 +1244,46 @@ ;; Menu expansion ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(define menu-expand-link-cache (make-ahash-table)) + +(define (static-menu-link? name) + "Menus whose expanded result never changes at runtime." + (in? name '(style-menu add-package-menu remove-package-menu + toggle-package-menu basic-theme-menu + document-page-size-menu document-language-menu + document-short-font-menu document-font-base-size-menu + page-rendering-menu page-layout-menu document-columns-menu + print-menu-inline new-file-menu load-menu save-menu + close-menu cite-texmacs-menu cite-texmacs-related-menu + color-menu document-encryption-menu + document-columns-menu))) + (define (menu-expand-link p) "Expand menu link @p." - (with linked ((eval (cadr p))) (if linked (menu-expand linked) p)) -) ;define + (let* ((name (cadr p)) + (cached (and (static-menu-link? name) (ahash-ref menu-expand-link-cache name)))) + (if cached cached + (let* ((eval-start (texmacs-time)) + (linked ((eval name))) + (eval-ms (- (texmacs-time) eval-start)) + (expand-start (texmacs-time)) + (result (if linked (menu-expand linked) p)) + (expand-ms (- (texmacs-time) expand-start))) + (when (> (+ eval-ms expand-ms) 5) + (display* " link [" eval-ms "+" expand-ms "ms] " name "\n")) + (when (and (static-menu-link? name) linked) + (ahash-set! menu-expand-link-cache name result)) + result)))) (define (menu-expand-dynamic p) "Expand menu link @p." - (with dyn (eval (cadr p)) (if dyn (menu-expand dyn) p)) -) ;define + (let* ((start (texmacs-time)) + (dyn (eval (cadr p))) + (result (if dyn (menu-expand dyn) p)) + (elapsed (- (texmacs-time) start))) + (when (> elapsed 2) + (display* " dynamic " (cadr p) " " elapsed "ms\n")) + result)) (define (menu-expand-resize p) "Expand resize menu @p." @@ -1369,7 +1400,15 @@ (define (menu-expand-list l) "Expand links and conditional menus in list of menus @l." - (map menu-expand l) + (map (lambda (item) + (let* ((start (texmacs-time)) + (result (menu-expand item)) + (elapsed (- (texmacs-time) start))) + (when (> elapsed 5) + (display* " expand-item [" elapsed "ms] " + (if (pair? item) (car item) item) "\n")) + result)) + l) ) ;define (define must-eval-list '(input enum choice filtered-choice toggle)) diff --git a/src/Data/Document/new_style.cpp b/src/Data/Document/new_style.cpp index 246e4d7f49..65a816e1b3 100644 --- a/src/Data/Document/new_style.cpp +++ b/src/Data/Document/new_style.cpp @@ -428,28 +428,44 @@ compute_style_menu (url u, int kind) { object get_style_menu () { + static object cache; + if (cache != null_object ()) { + cout << "get_style_menu: cached\n"; + return cache; + } + cout << "get_style_menu: computing...\n"; url sty_u= descendance ("$TEXMACS_STYLE_ROOT"); string sty = compute_style_menu (sty_u, 0); - return eval ("(menu-dynamic " * sty * ")"); + cache= eval ("(menu-dynamic " * sty * ")"); + return cache; } object get_add_package_menu () { + static object cache; + if (cache != null_object ()) return cache; url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); string pck = compute_style_menu (pck_u, 1); - return eval ("(menu-dynamic " * pck * ")"); + cache= eval ("(menu-dynamic " * pck * ")"); + return cache; } object get_remove_package_menu () { + static object cache; + if (cache != null_object ()) return cache; url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); string pck = compute_style_menu (pck_u, 2); - return eval ("(menu-dynamic " * pck * ")"); + cache= eval ("(menu-dynamic " * pck * ")"); + return cache; } object get_toggle_package_menu () { + static object cache; + if (cache != null_object ()) return cache; url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); string pck = compute_style_menu (pck_u, 3); - return eval ("(menu-dynamic " * pck * ")"); + cache= eval ("(menu-dynamic " * pck * ")"); + return cache; } diff --git a/src/Edit/Interface/edit_interface.cpp b/src/Edit/Interface/edit_interface.cpp index 340d7a7bba..5f152d8ec4 100644 --- a/src/Edit/Interface/edit_interface.cpp +++ b/src/Edit/Interface/edit_interface.cpp @@ -111,6 +111,7 @@ edit_interface_rep::suspend () { void edit_interface_rep::resume () { // cout << "Resume " << buf->buf->name << LF; + bench_start ("resume"); got_focus= true; SERVER (menu_main ("(horizontal (link texmacs-menu))")); SERVER (menu_icons (0, "(horizontal (link texmacs-main-icons))")); @@ -145,6 +146,7 @@ edit_interface_rep::resume () { // after a bugfix by Massimiliano during summer 2016 eval ("(delayed (:idle 1) (refresh-window))"); #endif + bench_end ("resume"); } void @@ -810,6 +812,7 @@ edit_interface_rep::change_time () { void edit_interface_rep::update_menus () { + bench_start ("update_menus"); SERVER (menu_main ("(horizontal (link texmacs-menu))")); SERVER (menu_icons (0, "(horizontal (link texmacs-main-icons))")); SERVER (menu_icons (1, "(horizontal (link texmacs-mode-icons))")); @@ -840,6 +843,7 @@ edit_interface_rep::update_menus () { cache_memorize (); last_update= last_change; save_user_preferences (); + bench_end ("update_menus"); } int From 2c32958fae44177bd683ae534ed67c3eca9676c5 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Wed, 20 May 2026 22:38:55 +0800 Subject: [PATCH 03/10] wip --- TeXmacs/progs/generic/document-menu.scm | 5 +---- TeXmacs/progs/kernel/gui/menu-widget.scm | 12 +++++++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/TeXmacs/progs/generic/document-menu.scm b/TeXmacs/progs/generic/document-menu.scm index 18aea51d3e..73dd6f009a 100644 --- a/TeXmacs/progs/generic/document-menu.scm +++ b/TeXmacs/progs/generic/document-menu.scm @@ -1285,10 +1285,7 @@ ) ;define (tm-menu (focus-style-icons t) - (minibar (let* ((start0 (texmacs-time)) - (st* (get-style-list)) - (_ (let ((ms (- (texmacs-time) start0))) - (when (> ms 1) (display* " focus-bench get-style-list=" ms "ms\n")))) + (minibar (let* ((st* (get-style-list)) (st (if (null? st*) (list "no style") st*))) (=> (balloon (eval (style-menu-name (car st))) "Document style") (link style-menu) diff --git a/TeXmacs/progs/kernel/gui/menu-widget.scm b/TeXmacs/progs/kernel/gui/menu-widget.scm index ea6229abf3..2ad9aa9cd0 100644 --- a/TeXmacs/progs/kernel/gui/menu-widget.scm +++ b/TeXmacs/progs/kernel/gui/menu-widget.scm @@ -1266,11 +1266,14 @@ (let* ((eval-start (texmacs-time)) (linked ((eval name))) (eval-ms (- (texmacs-time) eval-start)) + (count-before menu-expand-count) (expand-start (texmacs-time)) (result (if linked (menu-expand linked) p)) - (expand-ms (- (texmacs-time) expand-start))) + (expand-ms (- (texmacs-time) expand-start)) + (count-after menu-expand-count)) (when (> (+ eval-ms expand-ms) 5) - (display* " link [" eval-ms "+" expand-ms "ms] " name "\n")) + (display* " link [" eval-ms "+" expand-ms "ms, " + (- count-after count-before) " nodes] " name "\n")) (when (and (static-menu-link? name) linked) (ahash-set! menu-expand-link-cache name result)) result)))) @@ -1398,13 +1401,16 @@ `(toggle ,(replace-procedures (cadr p)) ,((caddr p))) ) ;define +(define menu-expand-count 0) + (define (menu-expand-list l) "Expand links and conditional menus in list of menus @l." (map (lambda (item) + (set! menu-expand-count (+ menu-expand-count 1)) (let* ((start (texmacs-time)) (result (menu-expand item)) (elapsed (- (texmacs-time) start))) - (when (> elapsed 5) + (when (> elapsed 1) (display* " expand-item [" elapsed "ms] " (if (pair? item) (car item) item) "\n")) result)) From e3a93ba85287f24ba0450265cb3d82392a8abc36 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Wed, 20 May 2026 22:52:51 +0800 Subject: [PATCH 04/10] =?UTF-8?q?[0146]=20=E7=BC=93=E5=AD=98=20hidden=5Fpa?= =?UTF-8?q?ckage=20=E7=9A=84=20descendance=20=E7=BB=93=E6=9E=9C=EF=BC=8C?= =?UTF-8?q?=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D=E6=96=87=E4=BB=B6=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=89=AB=E6=8F=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hidden_package 每次调用都重新执行 descendance("$TEXMACS_PACKAGE_ROOT") 扫描文件系统,4个包累计耗时 67ms。改为 static 局部变量缓存后降至 ~14ms,resume 总耗时从 245ms 降至 155ms。 Co-Authored-By: Claude Opus 4.7 --- src/Data/Document/new_style.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Data/Document/new_style.cpp b/src/Data/Document/new_style.cpp index 65a816e1b3..d6bd75b494 100644 --- a/src/Data/Document/new_style.cpp +++ b/src/Data/Document/new_style.cpp @@ -383,7 +383,7 @@ bool hidden_package (string name) { if (name == "std-latex") return false; if (!hidden_packages->contains (name)) { - url pck_u = descendance ("$TEXMACS_PACKAGE_ROOT"); + static url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); hidden_packages (name)= hidden_package (pck_u, name, false); } return hidden_packages[name]; @@ -429,11 +429,7 @@ compute_style_menu (url u, int kind) { object get_style_menu () { static object cache; - if (cache != null_object ()) { - cout << "get_style_menu: cached\n"; - return cache; - } - cout << "get_style_menu: computing...\n"; + if (cache != null_object ()) return cache; url sty_u= descendance ("$TEXMACS_STYLE_ROOT"); string sty = compute_style_menu (sty_u, 0); cache= eval ("(menu-dynamic " * sty * ")"); From bf2035ed56af02d2c8ba173e21fded6376ed6aa1 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Wed, 20 May 2026 22:54:20 +0800 Subject: [PATCH 05/10] =?UTF-8?q?[0146]=20=E6=B8=85=E7=90=86=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=B1=95=E5=BC=80=E7=9A=84=20bench=20=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除 menu-expand-link、menu-expand-dynamic、menu-expand-list 中的 texmacs-time 计时和 display* 输出。 Co-Authored-By: Claude Opus 4.7 --- TeXmacs/progs/kernel/gui/menu-widget.scm | 29 ++++-------------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/TeXmacs/progs/kernel/gui/menu-widget.scm b/TeXmacs/progs/kernel/gui/menu-widget.scm index 2ad9aa9cd0..017f48f6b9 100644 --- a/TeXmacs/progs/kernel/gui/menu-widget.scm +++ b/TeXmacs/progs/kernel/gui/menu-widget.scm @@ -1263,29 +1263,16 @@ (let* ((name (cadr p)) (cached (and (static-menu-link? name) (ahash-ref menu-expand-link-cache name)))) (if cached cached - (let* ((eval-start (texmacs-time)) - (linked ((eval name))) - (eval-ms (- (texmacs-time) eval-start)) - (count-before menu-expand-count) - (expand-start (texmacs-time)) - (result (if linked (menu-expand linked) p)) - (expand-ms (- (texmacs-time) expand-start)) - (count-after menu-expand-count)) - (when (> (+ eval-ms expand-ms) 5) - (display* " link [" eval-ms "+" expand-ms "ms, " - (- count-after count-before) " nodes] " name "\n")) + (let* ((linked ((eval name))) + (result (if linked (menu-expand linked) p))) (when (and (static-menu-link? name) linked) (ahash-set! menu-expand-link-cache name result)) result)))) (define (menu-expand-dynamic p) "Expand menu link @p." - (let* ((start (texmacs-time)) - (dyn (eval (cadr p))) - (result (if dyn (menu-expand dyn) p)) - (elapsed (- (texmacs-time) start))) - (when (> elapsed 2) - (display* " dynamic " (cadr p) " " elapsed "ms\n")) + (let* ((dyn (eval (cadr p))) + (result (if dyn (menu-expand dyn) p))) result)) (define (menu-expand-resize p) @@ -1407,13 +1394,7 @@ "Expand links and conditional menus in list of menus @l." (map (lambda (item) (set! menu-expand-count (+ menu-expand-count 1)) - (let* ((start (texmacs-time)) - (result (menu-expand item)) - (elapsed (- (texmacs-time) start))) - (when (> elapsed 1) - (display* " expand-item [" elapsed "ms] " - (if (pair? item) (car item) item) "\n")) - result)) + (menu-expand item)) l) ) ;define From 339fee18666074178d5e2c9d1471ee09ee71fa98 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Wed, 20 May 2026 22:57:53 +0800 Subject: [PATCH 06/10] =?UTF-8?q?[0146]=20=E6=B8=85=E7=90=86=20focus-tag-i?= =?UTF-8?q?cons=20=E4=B8=AD=E7=9A=84=20bench=20=E8=B0=83=E8=AF=95=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 还原 focus-variants-of、cursor-inside?、focus-has-preferences?、 focus-has-parameters? 中的 texmacs-time 计时包装和 display* 输出。 Co-Authored-By: Claude Opus 4.7 --- TeXmacs/progs/generic/generic-menu.scm | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/TeXmacs/progs/generic/generic-menu.scm b/TeXmacs/progs/generic/generic-menu.scm index f416c72051..1d9b420336 100644 --- a/TeXmacs/progs/generic/generic-menu.scm +++ b/TeXmacs/progs/generic/generic-menu.scm @@ -947,7 +947,7 @@ (dynamic (focus-misc-icons t)) (mini #t (with l - (bench-focus "focus-variants-of" '(focus-variants-of t)) + (focus-variants-of t) (assuming (<= (length l) 1) (inert ((eval `(verbatim ,(focus-tag-name (tree-label t)))) (noop))) ) ;assuming @@ -968,11 +968,7 @@ ) ;with ) ;mini (dynamic (focus-tag-extra-icons t)) - (assuming (let* ((start (texmacs-time)) - (r (cursor-inside? t))) - (let ((ms (- (texmacs-time) start))) - (when (> ms 1) (display* " focus-bench cursor-inside?=" ms "ms\n")) - r)) + (assuming (cursor-inside? t) ((balloon (icon "tm_exit_left.xpm") "Exit tag on the left") (structured-exit-left) ) ; @@ -981,20 +977,12 @@ ) ; ((balloon (icon "tm_focus_delete.xpm") "Remove tag") (remove-structure-upwards)) ) ;assuming - (assuming (let* ((start (texmacs-time)) - (r (focus-has-preferences? t))) - (let ((ms (- (texmacs-time) start))) - (when (> ms 1) (display* " focus-bench focus-has-preferences?=" ms "ms\n")) - r)) + (assuming (focus-has-preferences? t) (=> (balloon (icon "tm_focus_prefs.xpm") "Preferences for tag") (dynamic (focus-preferences-menu t)) ) ;=> ) ;assuming - (assuming (let* ((start (texmacs-time)) - (r (focus-has-parameters? t))) - (let ((ms (- (texmacs-time) start))) - (when (> ms 1) (display* " focus-bench focus-has-parameters?=" ms "ms\n")) - r)) + (assuming (focus-has-parameters? t) (=> (balloon (icon "tm_theme.xpm") "Rendering options for tag") (dynamic (focus-rendering-menu t)) ) ;=> From c357191bde10e115ef3c6ddea26c44ac018516aa Mon Sep 17 00:00:00 2001 From: Da Shen Date: Wed, 20 May 2026 22:58:36 +0800 Subject: [PATCH 07/10] =?UTF-8?q?[0146]=20=E8=BF=98=E5=8E=9F=20document-me?= =?UTF-8?q?nu.scm=20=E6=A0=BC=E5=BC=8F=E5=8C=96=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- TeXmacs/progs/generic/document-menu.scm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/TeXmacs/progs/generic/document-menu.scm b/TeXmacs/progs/generic/document-menu.scm index 73dd6f009a..4af18f1291 100644 --- a/TeXmacs/progs/generic/document-menu.scm +++ b/TeXmacs/progs/generic/document-menu.scm @@ -1285,8 +1285,7 @@ ) ;define (tm-menu (focus-style-icons t) - (minibar (let* ((st* (get-style-list)) - (st (if (null? st*) (list "no style") st*))) + (minibar (let* ((st* (get-style-list)) (st (if (null? st*) (list "no style") st*))) (=> (balloon (eval (style-menu-name (car st))) "Document style") (link style-menu) --- From fe4346313061884fa08f23a85e13c0226dd4c9d3 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Wed, 20 May 2026 23:00:21 +0800 Subject: [PATCH 08/10] =?UTF-8?q?[0146]=20bin/format=20=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- TeXmacs/progs/kernel/gui/menu-widget.scm | 64 ++++++++++++++++-------- src/Data/Document/new_style.cpp | 10 ++-- 2 files changed, 49 insertions(+), 25 deletions(-) diff --git a/TeXmacs/progs/kernel/gui/menu-widget.scm b/TeXmacs/progs/kernel/gui/menu-widget.scm index 017f48f6b9..65de54048a 100644 --- a/TeXmacs/progs/kernel/gui/menu-widget.scm +++ b/TeXmacs/progs/kernel/gui/menu-widget.scm @@ -1248,32 +1248,54 @@ (define (static-menu-link? name) "Menus whose expanded result never changes at runtime." - (in? name '(style-menu add-package-menu remove-package-menu - toggle-package-menu basic-theme-menu - document-page-size-menu document-language-menu - document-short-font-menu document-font-base-size-menu - page-rendering-menu page-layout-menu document-columns-menu - print-menu-inline new-file-menu load-menu save-menu - close-menu cite-texmacs-menu cite-texmacs-related-menu - color-menu document-encryption-menu - document-columns-menu))) + (in? name + '(style-menu add-package-menu + remove-package-menu + toggle-package-menu + basic-theme-menu + document-page-size-menu + document-language-menu + document-short-font-menu + document-font-base-size-menu + page-rendering-menu + page-layout-menu + document-columns-menu + print-menu-inline + new-file-menu + load-menu + save-menu + close-menu + cite-texmacs-menu + cite-texmacs-related-menu + color-menu + document-encryption-menu + document-columns-menu) + ) ;in? +) ;define (define (menu-expand-link p) "Expand menu link @p." (let* ((name (cadr p)) - (cached (and (static-menu-link? name) (ahash-ref menu-expand-link-cache name)))) - (if cached cached - (let* ((linked ((eval name))) - (result (if linked (menu-expand linked) p))) + (cached (and (static-menu-link? name) (ahash-ref menu-expand-link-cache name))) + ) ; + (if cached + cached + (let* ((linked ((eval name))) (result (if linked (menu-expand linked) p))) (when (and (static-menu-link? name) linked) - (ahash-set! menu-expand-link-cache name result)) - result)))) + (ahash-set! menu-expand-link-cache name result) + ) ;when + result + ) ;let* + ) ;if + ) ;let* +) ;define (define (menu-expand-dynamic p) "Expand menu link @p." - (let* ((dyn (eval (cadr p))) - (result (if dyn (menu-expand dyn) p))) - result)) + (let* ((dyn (eval (cadr p))) (result (if dyn (menu-expand dyn) p))) + result + ) ;let* +) ;define (define (menu-expand-resize p) "Expand resize menu @p." @@ -1394,8 +1416,10 @@ "Expand links and conditional menus in list of menus @l." (map (lambda (item) (set! menu-expand-count (+ menu-expand-count 1)) - (menu-expand item)) - l) + (menu-expand item) + ) ;lambda + l + ) ;map ) ;define (define must-eval-list '(input enum choice filtered-choice toggle)) diff --git a/src/Data/Document/new_style.cpp b/src/Data/Document/new_style.cpp index d6bd75b494..ff165120ac 100644 --- a/src/Data/Document/new_style.cpp +++ b/src/Data/Document/new_style.cpp @@ -383,7 +383,7 @@ bool hidden_package (string name) { if (name == "std-latex") return false; if (!hidden_packages->contains (name)) { - static url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); + static url pck_u = descendance ("$TEXMACS_PACKAGE_ROOT"); hidden_packages (name)= hidden_package (pck_u, name, false); } return hidden_packages[name]; @@ -432,7 +432,7 @@ get_style_menu () { if (cache != null_object ()) return cache; url sty_u= descendance ("$TEXMACS_STYLE_ROOT"); string sty = compute_style_menu (sty_u, 0); - cache= eval ("(menu-dynamic " * sty * ")"); + cache = eval ("(menu-dynamic " * sty * ")"); return cache; } @@ -442,7 +442,7 @@ get_add_package_menu () { if (cache != null_object ()) return cache; url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); string pck = compute_style_menu (pck_u, 1); - cache= eval ("(menu-dynamic " * pck * ")"); + cache = eval ("(menu-dynamic " * pck * ")"); return cache; } @@ -452,7 +452,7 @@ get_remove_package_menu () { if (cache != null_object ()) return cache; url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); string pck = compute_style_menu (pck_u, 2); - cache= eval ("(menu-dynamic " * pck * ")"); + cache = eval ("(menu-dynamic " * pck * ")"); return cache; } @@ -462,6 +462,6 @@ get_toggle_package_menu () { if (cache != null_object ()) return cache; url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); string pck = compute_style_menu (pck_u, 3); - cache= eval ("(menu-dynamic " * pck * ")"); + cache = eval ("(menu-dynamic " * pck * ")"); return cache; } From 3d58712336891c41d64605f1cf6db7903be85b26 Mon Sep 17 00:00:00 2001 From: Da Shen Date: Wed, 20 May 2026 23:20:11 +0800 Subject: [PATCH 09/10] wip --- src/Data/Document/new_style.cpp | 63 ++++++++++++++++++++++---------- src/Data/Document/new_style.hpp | 1 + src/System/Boot/init_texmacs.cpp | 2 + 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/Data/Document/new_style.cpp b/src/Data/Document/new_style.cpp index ff165120ac..5aba105a99 100644 --- a/src/Data/Document/new_style.cpp +++ b/src/Data/Document/new_style.cpp @@ -58,6 +58,8 @@ init_style_data () { extern hashmap style_tree_cache; hashmap hidden_packages (false); +static hashmap hidden_package_set (false); +static bool hidden_package_set_initialized= false; static url resolve_local_style (string style_name) { @@ -172,10 +174,14 @@ cache_file_name (tree t) { return lolly::hash::md5_hexdigest (tmp) * ".scm"; } +void ensure_hidden_package_set (); + void style_invalidate_cache () { - style_tree_cache= hashmap (); - hidden_packages = hashmap (false); + style_tree_cache = hashmap (); + hidden_packages = hashmap (false); + hidden_package_set = hashmap (false); + hidden_package_set_initialized= false; if (sd != NULL) { tm_delete (sd); sd= NULL; @@ -359,34 +365,45 @@ ignore_dir (string dir) { (dir == "Standard") || (dir == "Test") || (dir == "Themes"); } -static bool -hidden_package (url u, string name, bool hidden) { - if (is_or (u)) - return hidden_package (u[1], name, hidden) || - hidden_package (u[2], name, hidden); +static void +collect_hidden_packages (url u, bool hidden, hashmap& pkgs) { + if (is_or (u)) { + collect_hidden_packages (u[1], hidden, pkgs); + collect_hidden_packages (u[2], hidden, pkgs); + return; + } if (is_concat (u)) { string dir= upcase_first (as_string (u[1])); - if (dir == "CVS" || dir == ".svn") return false; - return hidden_package (u[2], name, hidden || ignore_dir (dir)); + if (dir == "CVS" || dir == ".svn") return; + collect_hidden_packages (u[2], hidden || ignore_dir (dir), pkgs); + return; } if (hidden && is_atomic (u)) { string l= as_string (u); if (ends (l, ".ts")) l= l (0, N (l) - 3); else if (ends (l, ".hook")) l= l (0, N (l) - 5); - else return false; - return name == l; + else return; + pkgs (l)= true; + } +} + +static url get_package_root (); + +void +ensure_hidden_package_set () { + if (!hidden_package_set_initialized) { + bench_start ("hidden_package_init"); + collect_hidden_packages (get_package_root (), false, hidden_package_set); + hidden_package_set_initialized= true; + bench_end ("hidden_package_init"); } - return false; } bool hidden_package (string name) { if (name == "std-latex") return false; - if (!hidden_packages->contains (name)) { - static url pck_u = descendance ("$TEXMACS_PACKAGE_ROOT"); - hidden_packages (name)= hidden_package (pck_u, name, false); - } - return hidden_packages[name]; + ensure_hidden_package_set (); + return hidden_package_set->contains (name); } static string @@ -426,6 +443,12 @@ compute_style_menu (url u, int kind) { return ""; } +static url +get_package_root () { + static url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); + return pck_u; +} + object get_style_menu () { static object cache; @@ -440,7 +463,7 @@ object get_add_package_menu () { static object cache; if (cache != null_object ()) return cache; - url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); + url pck_u= get_package_root (); string pck = compute_style_menu (pck_u, 1); cache = eval ("(menu-dynamic " * pck * ")"); return cache; @@ -450,7 +473,7 @@ object get_remove_package_menu () { static object cache; if (cache != null_object ()) return cache; - url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); + url pck_u= get_package_root (); string pck = compute_style_menu (pck_u, 2); cache = eval ("(menu-dynamic " * pck * ")"); return cache; @@ -460,7 +483,7 @@ object get_toggle_package_menu () { static object cache; if (cache != null_object ()) return cache; - url pck_u= descendance ("$TEXMACS_PACKAGE_ROOT"); + url pck_u= get_package_root (); string pck = compute_style_menu (pck_u, 3); cache = eval ("(menu-dynamic " * pck * ")"); return cache; diff --git a/src/Data/Document/new_style.hpp b/src/Data/Document/new_style.hpp index ed85a50f23..8c52f42c16 100644 --- a/src/Data/Document/new_style.hpp +++ b/src/Data/Document/new_style.hpp @@ -33,6 +33,7 @@ tree get_document_preamble (tree t); drd_info get_document_drd (tree doc); object get_style_menu (); +void ensure_hidden_package_set (); bool hidden_package (string name); object get_add_package_menu (); object get_remove_package_menu (); diff --git a/src/System/Boot/init_texmacs.cpp b/src/System/Boot/init_texmacs.cpp index 767792d689..aef1d38e10 100644 --- a/src/System/Boot/init_texmacs.cpp +++ b/src/System/Boot/init_texmacs.cpp @@ -18,6 +18,7 @@ #include "merge_sort.hpp" #include "moebius/tree_label.hpp" #include "new_buffer.hpp" +#include "new_style.hpp" #include "new_window.hpp" #include "preferences.hpp" #include "server.hpp" @@ -969,6 +970,7 @@ TeXmacs_main (int argc, char** argv) { #endif if (N (extra_init_cmd) > 0) exec_delayed (scheme_cmd (extra_init_cmd)); + ensure_hidden_package_set (); gui_start_loop (); if (DEBUG_STD) debug_boot << "Stopping server...\n"; From 68a9e9029a64688cb57c82dc4adcff0e96b4beea Mon Sep 17 00:00:00 2001 From: Da Shen Date: Wed, 20 May 2026 23:20:47 +0800 Subject: [PATCH 10/10] =?UTF-8?q?[0146]=20hidden=5Fpackage=20=E9=A2=84?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=8F=8A=20descendance=20=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 hidden_package 从逐包递归遍历改为预构建 hash set,查找 O(1) - 复用 descendance("$TEXMACS_PACKAGE_ROOT") 结果,避免重复扫描 - 在 init_texmacs 启动阶段触发 ensure_hidden_package_set,不再延迟到菜单展开 Co-Authored-By: Claude Opus 4.7 --- src/Data/Document/new_style.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Data/Document/new_style.cpp b/src/Data/Document/new_style.cpp index 5aba105a99..950c15bf27 100644 --- a/src/Data/Document/new_style.cpp +++ b/src/Data/Document/new_style.cpp @@ -178,9 +178,9 @@ void ensure_hidden_package_set (); void style_invalidate_cache () { - style_tree_cache = hashmap (); - hidden_packages = hashmap (false); - hidden_package_set = hashmap (false); + style_tree_cache = hashmap (); + hidden_packages = hashmap (false); + hidden_package_set = hashmap (false); hidden_package_set_initialized= false; if (sd != NULL) { tm_delete (sd);