Skip to content

PgUp/PgDown 在主文档编辑区无法上下翻屏(期望:整屏滚动 + 光标跟随) #4543

Description

@da-liii

问题描述

主文档编辑区按 PageUp / PageDown 无任何反应,无法上下翻屏。

复现步骤

  1. 打开或新建文档(.tmu),输入超过一屏的内容
  2. 将光标置于正文中
  3. PageUp / PageDown

实际行为

视图不滚动、光标不移动,等同于没有按下按键。

期望行为

与 Windows/macOS 通用编辑器一致:PageUp / PageDown 向上 / 下滚动一整屏,光标跟随移动到新一屏中的对应位置。

补充信息

环境:Windows,master 分支构建(5e8259ae3)。

初步分析(代码层线索,未做运行期验证):

  1. Qt 层键名映射正常:src/Plugins/Qt/qt_utilities.cpp:133-134Qt::Key_PageUp → "pageup"Qt::Key_PageDown → "pagedown"
  2. 通用翻屏绑定本身是存在的:
    • TeXmacs/progs/generic/generic-kbd.scm:79-80("pageup" (kbd-page-up))("pagedown" (kbd-page-down))
    • TeXmacs/progs/generic/generic-edit.scm:87-88kbd-page-up/downgo-page-up / go-page-down
    • src/Edit/Interface/edit_cursor.cpp:301-329go_page_up/downget_visible_height () 移动光标并带动视图,语义正是「翻一屏 + 光标跟随」
  3. 怀疑被 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),因此后注册者生效
  4. 加载顺序上 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,保证主文档里仍是翻屏。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions