Skip to content

[Feature] 终端滚动条支持「悬停显示 / 始终显示」选项 #425

Description

@emo172

Summary (EN) — The terminal scrollbar is an overlay that is only drawn while the viewport is scrolled back into history: it auto-hides at the live bottom, and is never drawn when there is no scrollback. This request asks for a scrollbar visibility option — auto-hide (current, default) / show while hovering / always show — so that scrollback is discoverable and the scrollbar stays grabbable in mouse-first workflows. This is an enhancement request; the current behavior is understood to be by design and unrelated to the shell (e.g. PowerShell) running inside.

背景

  • 现象:终端滚动条(overlay 细条)在视口回到最底部(实时位置)后自动隐藏;即使上方仍有回滚历史。
  • 已确认与运行在其中的 shell 无关:滚动条由 Pebrel 的终端渲染层绘制,显隐只取决于 Pebrel 自身的视口偏移与回滚历史量;shell(PowerShell 等)向 PTY 输出的文本无法控制宿主终端滚动条的显隐。因此该问题不涉及 PowerShell / Windows Terminal 等其他项目。
  • 也非缺陷:源码注释明确写明「贴着底部时自动隐藏,没有回滚历史时也不画」,属既定设计;本请求是希望把它做成可配置项。

现状(当前版本的行为)

  • 滚动条为 overlay 风格:约 4 逻辑 px 宽,浮在网格右缘、不占列宽、无轨道;最小拇指高度 24px;命中带在拇指左右各放宽 8px(SCROLLBAR_W / SCROLLBAR_MIN_THUMB / SCROLLBAR_SLOP)。
  • 仅在「存在回滚历史 且 视口已上翻」时绘制(display_offset > 0);视口贴底(display_offset == 0)时不绘制;没有回滚历史时也不绘制。
  • 由此有两个不便:
    1. 贴底时完全看不到滚动条:无法一眼判断当前会话是否有回滚历史;想用鼠标拖着回看,必须先滚轮/键盘上翻一点、让滚动条出现,才能抓住它;
    2. 用鼠标把拇指拖到最底部时,拇指在到达底部的一瞬消失(拖拽状态仍在、继续上拖会重新出现,但过程中丢失视觉反馈)。

实现定位(供参考):

  • 显示判定与几何真值源:nebula_app/src/gpui_shell/terminal/view/pointer.rs 的 scrollbar_thumb()(贴底或无历史时返回 None;渲染与命中测试共用同一矩形);
  • 绘制:nebula_app/src/gpui_shell/terminal/element.rs(「贴着底部时拇指为 None 不画,滚进历史才浮在网格右缘」);
  • 相关设置现状:只有「回滚行数」「滚动速度」(nebula_app/src/gpui_shell/settings_pane/scrolling.rs),没有滚动条可见性选项。

需求(建议)

新增「滚动条显示方式」设置(与「回滚行数 / 滚动速度」同区),建议三档:

  1. 自动隐藏(现状,默认)——仅在回滚历史中显示;
  2. 悬停显示——鼠标悬停终端右缘 / 滚动条区域时显示(贴底也显示),移开后隐藏;
  3. 始终显示——只要存在回滚历史就常显(贴底时拇指停在轨道底部);无历史时不绘制(或按维护者判断显示禁用态)。

若希望范围更小,也可以先加一个布尔开关「滚动条常显(有回滚历史时)」,之后再扩展悬停档。

参考实现

  • kitty:scrollbar 选项,取值 scrolled(默认)/ always / never / hovered / scrolled-and-hovered / scrolled-or-hovered;另有 scrollbar_hover_width 等配套项(kitty/options/definition.py);
  • Windows Terminal:scrollbarState,取值 visible(默认)/ hidden / always(1.17+)。

兼容性

  • 默认值保持现状(自动隐藏),存量用户无感知;
  • 建议新键 scrollbar_visibility(auto / hover / always),沿用现有 key=value 持久化;
  • 改动点集中:只需放宽 scrollbar_thumb() 的早退条件,不影响现有拖拽 / 轨道点击 / 命中几何。

开放问题(请维护者定夺)

  1. 默认档保持「自动隐藏」?
  2. 「始终显示」在无回滚历史时:不画,还是画禁用态?
  3. 悬停热区沿用现有 8px 放宽,还是与 hover 加宽联动?

环境

  • Pebrel 2.1.0,Windows 11(x64),默认 shell:PowerShell 7.6.6;
  • 使用场景:希望贴底时滚动条也可感知、可抓取(至少悬停可见),避免「先滚动才能找到滚动条」以及拖到底部时失去反馈。

本请求由社区用户整理;若以上「建议」与项目既定方向冲突,以维护者方案为准。

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions