问题描述
主文档编辑区按 PageUp / PageDown 无任何反应,无法上下翻屏。
复现步骤
- 打开或新建文档(
.tmu),输入超过一屏的内容
- 将光标置于正文中
- 按
PageUp / PageDown
实际行为
视图不滚动、光标不移动,等同于没有按下按键。
期望行为
与 Windows/macOS 通用编辑器一致:PageUp / PageDown 向上 / 下滚动一整屏,光标跟随移动到新一屏中的对应位置。
补充信息
环境:Windows,master 分支构建(5e8259ae3)。
初步分析(代码层线索,未做运行期验证):
- Qt 层键名映射正常:
src/Plugins/Qt/qt_utilities.cpp:133-134,Qt::Key_PageUp → "pageup"、Qt::Key_PageDown → "pagedown"。
- 通用翻屏绑定本身是存在的:
TeXmacs/progs/generic/generic-kbd.scm:79-80:("pageup" (kbd-page-up))、("pagedown" (kbd-page-down))
TeXmacs/progs/generic/generic-edit.scm:87-88:kbd-page-up/down → go-page-up / go-page-down
src/Edit/Interface/edit_cursor.cpp:301-329:go_page_up/down 按 get_visible_height () 移动光标并带动视图,语义正是「翻一屏 + 光标跟随」
- 怀疑被
fold-kbd 全局覆盖:TeXmacs/progs/dynamic/fold-kbd.scm:33-34 用无条件(没有 :mode 守卫,也没有 :require)的 kbd-map 绑定了同名的 ("pageup" (dynamic-traverse-buffer :previous)) / ("pagedown" (dynamic-traverse-buffer :next))。其条件与 generic-kbd 的完全相同(均为空),而 kbd-insert-key-binding 对同条件同键会先删旧绑定再插入(TeXmacs/progs/kernel/gui/kbd-define.scm:281-292),因此后注册者生效。
- 加载顺序上 fold-kbd 更晚:
init-research.scm:614 通过 lazy-plugin-initialize 初始化插件,内部是 (delayed (:idle 10) ...)(kernel/texmacs/tm-plugins.scm:744-752)
plugins/keyboard/progs/init-keyboard.scm:24 在此时才注册 (lazy-keyboard (dynamic fold-kbd) always?),展开后是 (delayed (:idle 250) ...)
- 而
(lazy-keyboard (generic generic-kbd) always?) 在 init-research.scm:658(启动时即注册,更早到期)
- 于是 fold-kbd 后注册,覆盖掉翻屏绑定;在普通文档中
dynamic-traverse-buffer 找不到 fold / traversed 节点,什么都不做,「无反应」由此而来
- 相关改动:
[1189] generic-kbd 按 look-and-feel 拆分为 profile 插件(devel/1189.md)把 generic-kbd 的 lazy-keyboard 注册从 keyboard 插件挪到了 init-research.scm 末尾,可能加剧了这一先后关系
修复方向(待讨论)
- 给
fold-kbd 里的 pageup / pagedown(以及同批的 F9 / F12 / ir-* 等)补上 mode 守卫,只在含 fold / slide 的缓冲区生效;
- 或在非 fold 上下文回退到
kbd-page-up / kbd-page-down,保证主文档里仍是翻屏。
问题描述
主文档编辑区按
PageUp/PageDown无任何反应,无法上下翻屏。复现步骤
.tmu),输入超过一屏的内容PageUp/PageDown实际行为
视图不滚动、光标不移动,等同于没有按下按键。
期望行为
与 Windows/macOS 通用编辑器一致:
PageUp/PageDown向上 / 下滚动一整屏,光标跟随移动到新一屏中的对应位置。补充信息
环境:Windows,master 分支构建(
5e8259ae3)。初步分析(代码层线索,未做运行期验证):
src/Plugins/Qt/qt_utilities.cpp:133-134,Qt::Key_PageUp → "pageup"、Qt::Key_PageDown → "pagedown"。TeXmacs/progs/generic/generic-kbd.scm:79-80:("pageup" (kbd-page-up))、("pagedown" (kbd-page-down))TeXmacs/progs/generic/generic-edit.scm:87-88:kbd-page-up/down→go-page-up/go-page-downsrc/Edit/Interface/edit_cursor.cpp:301-329:go_page_up/down按get_visible_height ()移动光标并带动视图,语义正是「翻一屏 + 光标跟随」fold-kbd全局覆盖:TeXmacs/progs/dynamic/fold-kbd.scm:33-34用无条件(没有:mode守卫,也没有:require)的kbd-map绑定了同名的("pageup" (dynamic-traverse-buffer :previous))/("pagedown" (dynamic-traverse-buffer :next))。其条件与 generic-kbd 的完全相同(均为空),而kbd-insert-key-binding对同条件同键会先删旧绑定再插入(TeXmacs/progs/kernel/gui/kbd-define.scm:281-292),因此后注册者生效。init-research.scm:614通过lazy-plugin-initialize初始化插件,内部是(delayed (:idle 10) ...)(kernel/texmacs/tm-plugins.scm:744-752)plugins/keyboard/progs/init-keyboard.scm:24在此时才注册(lazy-keyboard (dynamic fold-kbd) always?),展开后是(delayed (:idle 250) ...)(lazy-keyboard (generic generic-kbd) always?)在init-research.scm:658(启动时即注册,更早到期)dynamic-traverse-buffer找不到 fold / traversed 节点,什么都不做,「无反应」由此而来[1189] generic-kbd 按 look-and-feel 拆分为 profile 插件(devel/1189.md)把 generic-kbd 的lazy-keyboard注册从 keyboard 插件挪到了init-research.scm末尾,可能加剧了这一先后关系修复方向(待讨论)
fold-kbd里的pageup/pagedown(以及同批的F9/F12/ir-*等)补上 mode 守卫,只在含 fold / slide 的缓冲区生效;kbd-page-up/kbd-page-down,保证主文档里仍是翻屏。