Skip to content

[209_21] 添加算法宏方向键右键导航并修复 algo-else 支持#3430

Open
JackYansongLi wants to merge 20 commits into
mainfrom
jl/algoif
Open

[209_21] 添加算法宏方向键右键导航并修复 algo-else 支持#3430
JackYansongLi wants to merge 20 commits into
mainfrom
jl/algoif

Conversation

@JackYansongLi
Copy link
Copy Markdown
Contributor

如何测试

  1. 清除缓存并重启 Mogan
    • macOS: 删除 ~/Library/Caches/MoganLab,然后重启 Mogan
    • Windows: 删除 %appdata%/MoganLab%localappdata%/MoganLab,然后重启 Mogan
    • Linux: 删除 ~/.cache/MoganLab,然后重启 Mogan
  2. 打开测试文件 TeXmacs/tests/tmu/209_21.tmu
  3. listing 环境中插入 \algo-if,按 Enter 进入 body,输入一行内容
  4. 在 body 行末尾按 方向键右键,光标应直接退出 \algo-if 并保留在 \listing
  5. 此时按 回车,应能在 \listing 中创建新的一行(有连续行号)
  6. 同样测试 \algo-while\algo-for 等宏

What

listing 环境中,为 algo-ifalgo-whilealgo-for 等算法宏添加方向键右键导航支持。在宏的 body 末尾按右键时,光标直接退出该宏并保留在 listing 中。

Why

用户在算法宏的 body 中编辑完后,通常想退出该宏并在 listing 中继续输入下一行。但默认行为中,从 body 末尾按右键需要经过多个中间位置(body document 的 :after、算法宏的 :after、listing document 的 :after 等),很容易按过头直接跳出 listing。特别是在 listing 中只有该算法宏一行时,从 body 中出来后再按一次右键就直接退出了 listing,用户体验很差。

How

TeXmacs/progs/generic/generic-edit.scm 中:

  1. 新增 cursor-in-algo-macro-body-end?:判断光标是否在当前算法宏的最后一个参数(body)的末尾
  2. 新增 kbd-horizontal 多态定义:当在 listing 环境中、光标在算法宏 body 末尾、按右键时,直接调用 (tree-go-to t :after) 将光标跳到算法宏之后,而不是继续默认的递归向上行为
  3. 光标在算法宏内部但不在 body 末尾时,调用 (go-right) 保持默认单步右移

本 PR 基于 #3276 继续工作。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@JackYansongLi JackYansongLi marked this pull request as draft May 20, 2026 09:51
在 listing 环境中,algo-if、algo-while、algo-for 等宏的 body 末尾按方向键右键时,
光标直接退出该算法宏并保留在 listing 中,而不会继续跳出 listing。

新增 cursor-in-algo-macro-body-end? 用于判断光标是否在算法宏 body 末尾。
新增 kbd-horizontal 多态定义,在 listing 中的算法宏 body 末尾按右键时,
直接调用 tree-go-to 跳到算法宏的 :after 位置。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@JackYansongLi JackYansongLi changed the title [209_21] 添加算法宏方向键右键导航 [209_21] 添加算法宏方向键右键导航并修复 algo-else 支持 May 20, 2026
修复 tree-go-to 不支持 :after 位置的问题。之前直接用
(tree-go-to t :after) 会因 tree->path 返回 #f 而不执行任何操作,
导致光标未移动并跟随默认递归行为跳出 listing。

改为先 (tree-go-to t body-idx :end) 跳到 body 参数末尾,
再调用 (go-right) 一步到达算法宏之后。

同时将 algo-else 加入 algo-macro-tags,使其也支持方向键导航。
在测试文件末尾添加 listing 包裹的 algo-else 测试案例。
更新 devel/209_21.md 测试说明。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
JackYansongLi and others added 17 commits May 20, 2026 19:19
在 kbd-right 中打印 focus-tree 标签,以便诊断 algo-else
右键导航不生效的问题。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
cursor-in-algo-macro-body-end? 函数在添加 DEBUG 日志时缺少一个关闭
括号,导致 generic-edit.scm 无法正确加载,进而使所有算法宏的右键
导航和 Enter 导航失效,并引发大量 unbound variable 错误。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
光标在 algo-else body 末尾时,cursor-path 的最后一个元素可能
是整数(等于 last-child 的 arity),而不是 :end 符号。

原代码只检查 (== (cAr path) :end),导致光标在单参数宏
(如 algo-else)的 body 末尾时判断失败,右键直接跳出 listing。

现在同时检查两种末尾位置:
- :end 符号(直接位于子节点末尾)
- 整数等于 tree-arity last-child(位于最后一个子节点之后的
  :after 等价位置)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
在 tree-go-to 和 go-right 后打印 cursor-path,以诊断 algo-else
右键导航的具体光标移动路径。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
tree-go-to t 0 :end 未移动光标,改为先获取 body 节点再调用
(tree-go-to body :end)。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
tree-go-to 对 document 节点不生效(光标位置不变)。改为直接计算
algo-macro 之后的位置(parent-path + t-index + 1),用 go-to 直接跳转。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1. 新增 is-end-relative-path? 递归函数,支持判断任意深度嵌套节点的末尾位置
2. 新增 cursor-in-algo-macro-condition-end?,支持从条件参数末尾导航到 body
3. 重写 cursor-in-algo-macro-body-end?,使用 is-end-relative-path? 替代简单 arity 比较
4. 修改 kbd-horizontal 为 cond 结构,同时处理 body 末尾和条件末尾的导航

修复了在 algo-if/algo-else 的 body 中包含 math 等嵌套原子节点时,
在原子节点末尾按右键会错误跳出 listing 环境的问题。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
当 algo-if、algo-while、algo-for、algo-else 等宏是 listing 中
document 的最后一个子节点时,在 body 末尾按右键不再跳到 :after
退出 listing,而是 insert-return 创建一个新的空段落,保留在
listing 内供用户继续输入。

同时移除所有 DEBUG 日志。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 修复 algo-macro body 末尾右方向键分支缺少一个右括号的问题
- 添加 write/newline 调试日志以便验证函数是否被调用

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 第 242 行缺少一个右括号,导致 cond case 未正确关闭
- 整个函数因此多出一个未匹配的左括号,balance 从 1 修正为 0

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 添加 set-message 调试日志以追踪右键导航行为
- 修复 cond case 未正确关闭的括号不匹配问题

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
set-message 只在 UI 状态栏显示,终端看不到。改为 debug-message
"debug-io" 后日志会输出到终端,便于调试分析。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
添加 after goto / after go-right 日志,用于追踪光标实际位置。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@JackYansongLi JackYansongLi marked this pull request as ready for review May 21, 2026 07:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant