Sublime如何启用自动滚动时保持光标居中?(阅读舒适性)

sublime text 默认不支持滚动时自动居中光标,需安装 scrolltocenter 插件实现;该插件监听所有滚动事件并调用 show_at_center,使光标始终位于视口中央,st4 全支持,st3 需旧版。

Sublime如何启用自动滚动时保持光标居中?(阅读舒适性)

Sublime Text 滚动时怎么让光标始终在视口中央?

默认情况下,Sublime Text 滚动不会自动调整光标位置——你按 Ctrl+Down 或鼠标滚轮往下,光标会跟着内容“掉下去”,很快跑到视口顶部甚至看不见。要实现“滚动即居中”,得靠 scroll_to_point 配合监听事件,但更简单直接的办法是启用内置的 always_show_cursor 行为 + 调整 follow_cursor 逻辑。

实际生效的关键不是某个开关,而是组合两个设置:

  • "follow_cursor": true:开启后,光标移动(比如跳转到定义、搜索匹配)会自动滚动使光标居中
  • "scroll_past_end": false:避免底部留白干扰视觉重心(否则即使居中,底部空行会让“居中感”失真)
  • 真正解决“手动滚动时居中”的,其实是 "auto_complete_commit_on_tab": false 这类无关项?不,别被误导——Sublime 本身不支持“每次滚轮都强制居中”,必须用插件或命令模拟

为什么原生设置 follow_cursor 不够用?

因为 follow_cursor 只响应“光标位置变化”,不响应“视口滚动”。你用鼠标拖滚动条、按 PageDown、或触控板滑动,Sublime 认为“光标没动”,就不会重居中。

常见错误现象:follow_cursor 设为 true 后,按 Ctrl+G 跳行能居中,但滚轮一划,光标就偏了——这不是 bug,是设计如此。

本质原因:Sublime 的滚动和光标定位是两套独立逻辑,没有提供“滚动钩子”供原生设置触发居中。

ScrollToCenter 插件最省事

这是目前最稳定、零配置的方案。它监听所有滚动动作(包括滚轮、PageUp/Down、方向键),并在每次滚动结束后执行 view.show_at_center(view.sel()[0].begin())

安装与启用步骤:

  • 用 Package Control 安装插件:Package Control: Install Package → 搜 ScrollToCenter
  • 安装后无需重启,立即生效;无配置项,默认行为就是“每次滚动后居中光标”
  • 如果想禁用,直接删掉插件目录,或在命令面板运行 ScrollToCenter: Toggle
  • 注意兼容性:Sublime Text 4 全支持;ST3 需用 v1.2.0 以前的版本(新版已放弃 ST3 支持)

示例效果:你快速按 3 下 PageDown,光标会逐次出现在每页正中央,而不是堆在底部。

自己写命令也能做,但容易踩坑

有人尝试用 sublime_plugin.TextCommand 绑定 scroll_lines,再调用 show_at_center。问题在于:

  • 滚动命令(如 scroll_lines)本身不触发 on_modifiedon_selection_modified,无法可靠拦截
  • on_activated 或定时器轮询性能差,且会干扰快速滚动的手感
  • 触控板惯性滚动会产生连续多次 scroll 事件,未加防抖会导致光标“抽搐”
  • 路径上不能依赖 view.viewport_position() 直接算中心点——Sublime 的 viewport 坐标系和字符坐标系单位不同,换行、缩进、字体宽度都会导致偏差

所以除非你明确需要定制居中偏移量(比如上移 2 行避开标题栏),否则别自己造轮子。插件已处理好这些边界。

复杂点在于:居中是“视觉居中”,不是“行号居中”。当有长行折行、高亮标记、或行内小部件时,show_at_center 仍以字符位置为准,可能看起来略偏——这属于 Sublime 渲染层限制,没法绕过。