diff --git a/TeXmacs/progs/math/math-edit.scm b/TeXmacs/progs/math/math-edit.scm index b35c424c0d8c2adf6eb64a464faccf1bdc916fe0..6b6ef7a46e5acf15e7fc8fcf1458fec4f4bd928a 100644 --- a/TeXmacs/progs/math/math-edit.scm +++ b/TeXmacs/progs/math/math-edit.scm @@ -764,18 +764,22 @@ (tm-define (tabcycle-symbols comb) ;; 根据按键序列获取数学符号Tab循环展示的列表 ;; 输入: - ;; comb: 按键序列,类型为string,如"b tab" + ;; comb: 按键序列,类型为string,如"< tab tab = tab" ;; 处理过程: - ;; 1. 裁剪comb获得最基本的按键序列,例如“space b tab” -> "b" - ;; 2. 查找该按键序列对应的符号绑定 + ;; 1. 递归删除末尾所有的 " tab",得到基本序列 + ;; 例如: "< tab tab = tab tab" -> "< tab tab =" + ;; 2. 查找该基本序列对应的符号绑定 ;; 3. 如果绑定不存在,返回空列表 - ;; 4. 如果绑定存在,继续查找所有以该按键序列为前缀的符号绑定 + ;; 4. 如果绑定存在,继续查找所有以该基本序列为前缀的符号绑定 ;; 5. 返回找到的所有直接的符号绑定列表,按照键盘组合序列长度排序, ;; 例如((symbol-completion "")) - ;; 输出: - ;; 符号列表,格式为((symbol-completion "符号") ...) + ;; 输出:zg (if (not (kbd-find-key-binding comb)) '() - (let* ((pre (string-replace (string-replace comb " tab" "") "space " "")) + (let* ((pre (let loop ((s comb)) + (if (string-ends? s " tab") + (loop (substring s 0 (- (string-length s) 4))) + s))) + (pre (string-replace pre "space " "")) (kbd-res (kbd-find-key-binding pre)) (kbd-sym (and (pair? kbd-res) (car kbd-res)))) (if (and kbd-sym (string? kbd-sym)) @@ -789,7 +793,12 @@ (string? (car x)) (string? (cadadr x)) (string-ends? (car x) "tab") - (string=? (string-replace (car x) " tab" "") pre))) + (let* ((key (car x)) + (key-without-tab (let loop ((s key)) + (if (string-ends? s " tab") + (loop (substring s 0 (- (string-length s) 4))) + s)))) + (string=? key-without-tab pre)))) (kbd-find-prefix pre)) (lambda (x y) (and (pair? x) (pair? y) diff --git a/devel/202_62.md b/devel/202_62.md index 52e764c190dbcbab78582ae4653979f89aa4a3da..0d97f1a357d19af8704cbba15e662db5656ac71f 100644 --- a/devel/202_62.md +++ b/devel/202_62.md @@ -3,9 +3,17 @@ ## 如何测试 进入数学模式:$,输入<,按tab键,观察提示浮动窗口的位置,挡住最下面的内容。 +## 2025/11/23 +### Why +修复Tab序列解析错误:输入 `< tab tab = tab` 时,原代码删除所有 ` tab`,导致只基于 `<` 查找符号,而不是基于完整的 `< tab tab =` 序列。 + +### How +`TeXmacs/progs/math/math-edit.scm` 的 `tabcycle-symbols` 函数中,将 `string-replace` 删除所有 ` tab` 改为递归删除末尾的 ` tab`: + + ## 2024/11/04 ### Why Tab cycling Popup 显示的数学提示浮动窗口会小小挡住最下面的内容,影响用户体验 ### How -`src/Plugins/Qt/QTMMathCompletionPopup.cpp`里添加 `y+= 10;`,在 `getCachedPosition` 方法中,计算 y 坐标后添加 `y += 10;` 将提示窗口向下偏移 10 像素,避免遮挡下方内容。 +`src/Plugins/Qt/QTMMathCompletionPopup.cpp`里添加 `y+= 10;`,在 `getCachedPosition` 方法中,计算 y 坐标后添加 `y += 10;` 将提示窗口向下偏移 10 像素,避免遮挡下方内容。 \ No newline at end of file