comfortable-motion.vim API完全手册flick()平滑滚动函数与7个全局变量逐项详解【免费下载链接】comfortable-motion.vimBrings physics-based smooth scrolling to the Vim world!项目地址: https://gitcode.com/gh_mirrors/co/comfortable-motion.vimcomfortable-motion.vim 是一款为 Vim/Neovim 带来基于物理的平滑滚动的 Vim 插件。本文作为 API 完全手册逐项详解核心flick()平滑滚动函数与 7 个全局变量帮助你快速上手并按手感偏好自由调参。一、30 秒认识 comfortable-motion.vimVim 原生的C-d/C-u/C-f/C-b滚动是瞬间跳转式的长时间阅读容易累眼。comfortable-motion.vim 借鉴了 Emacs 的惯性滚动体验屏幕不再直接跳页而是先加速、再减速地平滑滑动模拟真实世界的惯性物理过程。运行要求依赖 timer APIVim 7.4.1578 或更高版本Neovim 0.1.5 或更高版本安装方式任选其一 以 vim-plug 为例 Plug yuttie/comfortable-motion.vim或者用 git 克隆仓库到插件目录git clone https://gitcode.com/gh_mirrors/co/comfortable-motion.vim项目结构一览代码非常精炼核心只有两个文件文件作用plugin/comfortable_motion.vim插件入口定义默认按键映射autoload/comfortable_motion.vim核心实现flick()函数 物理模拟循环README.md官方文档含配置说明与效果演示二、核心 APIflick(impulse) 平滑滚动函数flick(impulse)是插件唯一对外暴露的公共函数也是所有平滑滚动行为的总入口。call comfortable_motion#flick(100) 向下滚动冲量 100 call comfortable_motion#flick(-100) 向上滚动冲量 -1004 个使用要点正负号决定方向正值为向下滚负值为向上滚绝对值决定甩动力度数值越大滚得越远可叠加函数内部只把冲量累加到状态中见 autoload/comfortable_motion.vim不会打断已有的滚动动画懒启动定时器首次调用flick()时才以 60fps 启动定时模拟循环速度衰减到接近静止后自动停止零空闲开销。默认按键映射定义于 plugin/comfortable_motion.vim按键等价调用效果C-dflick(100)平滑向下滚动约半屏C-uflick(-100)平滑向上滚动约半屏C-fflick(200)平滑向下滚动约一屏C-bflick(-200)平滑向上滚动约一屏⚠️ 注意这里的C-d/C-u并不是标准的滚动半窗。如果你希望它们保留 Vim 原生行为可用全局变量关闭默认映射见下文第 6 项。鼠标滚轮也能接入平滑滚动noremap silent ScrollWheelDown :call comfortable_motion#flick(40)CR noremap silent ScrollWheelUp :call comfortable_motion#flick(-40)CR需要鼠标支持时可加set mousea。三、7 个全局变量逐项详解#全局变量默认值作用1g:comfortable_motion_interval1000.0 / 60模拟步长间隔毫秒2g:comfortable_motion_friction80.0摩擦力恒定减速3g:comfortable_motion_air_drag2.0空气阻力与速度成正比4g:comfortable_motion_scroll_down_keyC-e实际执行下行滚动的按键5g:comfortable_motion_scroll_up_keyC-y实际执行上行滚动的按键6g:comfortable_motion_no_default_key_mappings未设置置 1 后不定义C-d/C-u/C-f/C-b7g:comfortable_motion_impulse_multiplier1自定义值冲量倍率配合自定义映射使用1️⃣ g:comfortable_motion_interval控制滚动流畅度物理模拟的每一步时间间隔毫秒默认1000.0 / 60即约 16.67ms 一帧、60fps。它同时决定定时器的触发频率。调小数值滚动会更细腻一般无需修改默认值已足够顺滑。2️⃣ g:comfortable_motion_friction摩擦力恒定减速模拟接触面摩擦每个时间步施加大小恒定的反向力无论当前速度多快。值越大减速越快、滚动距离越短。3️⃣ g:comfortable_motion_air_drag空气阻力与速度成正比模拟空气阻力阻力大小与当前速度成正比速度越快阻力越大收尾阶段阻力很小。因此摩擦为主起势短促、收得干脆阻力为主初段惯性足、收尾柔和绵长。两者搭配即 s:tick() 中计算的反作用力之和是调整手感的核心旋钮。4️⃣ g:comfortable_motion_scroll_down_key下行滚动真实按键插件并不直接调用窗口滚动命令而是模拟按下该按键默认C-e来实现每一帧的下滚。想改成用j/k平滑滚动let g:comfortable_motion_scroll_down_key j let g:comfortable_motion_scroll_up_key k⚠️ 注意不能选择多个动作组成的复杂键序列如$j因为插件会把滚动行数拼在键前、每个时间步执行一次如5$j复杂序列会导致行为不可预期。5️⃣ g:comfortable_motion_scroll_up_key上行滚动真实按键与下行键同理默认C-y。两者需成对设置保持上下滚动使用的动作一致。6️⃣ g:comfortable_motion_no_default_key_mappings关闭默认按键映射置为 1 后插件不再定义C-d/C-u/C-f/C-b的映射见 plugin/comfortable_motion.vim 的判断逻辑。适用场景希望C-d/C-u保留 Vim 原生滚动半窗行为想完全自定义按键例如与窗口高度联动见下文进阶配置。7️⃣ g:comfortable_motion_impulse_multiplier冲量倍率这是配合自定义映射使用的辅助变量。它本身不参与物理计算而是作为映射表达式中的可调倍率方便一处修改、全局生效详见下节进阶配置。四、3 组手感预设摩擦与阻力如何搭配官方文档 README.md 给出三组调至C-d/C-u滚动约 25 行的等价参数恰好对应三种典型手感预设frictionair_drag手感特征摩擦 阻力80.02.0均衡顺滑默认风格仅摩擦200.00.0干脆利落停得果断仅阻力0.04.0惯性充足收尾柔和tastes are different口味不同——建议以默认值为起点每次只调一个参数找到最适合自己的组合。五、进阶配置让滚动距离与窗口高度成比例想让一屏在任何窗口高度下都恰好是一屏可关闭默认映射用winheight(0)动态计算冲量let g:comfortable_motion_no_default_key_mappings 1 let g:comfortable_motion_impulse_multiplier 1 随手增减小即可整体调节力度 nnoremap silent C-d :call comfortable_motion#flick(g:comfortable_motion_impulse_multiplier * winheight(0) * 2)CR nnoremap silent C-u :call comfortable_motion#flick(g:comfortable_motion_impulse_multiplier * winheight(0) * -2)CR nnoremap silent C-f :call comfortable_motion#flick(g:comfortable_motion_impulse_multiplier * winheight(0) * 4)CR nnoremap silent C-b :call comfortable_motion#flick(g:comfortable_motion_impulse_multiplier * winheight(0) * -4)CR六、工作原理一览60fps 物理模拟循环整个插件的运行流程非常直观完整实现见 autoload/comfortable_motion.vim用户按下C-d→ 触发flick(100)冲量累加进状态定时器每个时间步唤醒 s:tick() 函数计算摩擦力与空气阻力两个反作用力更新速度velocity与累计位移delta将delta中的整行数取出执行normal!加上下行/上行键完成实际滚动并redraw刷新当速度低于 1 且无冲量时停止定时器状态归零动画结束。七、常见问题 FAQQ1为什么我的C-d不是滚动半窗插件重新定义了C-d/C-u/C-f/C-b。设置let g:comfortable_motion_no_default_key_mappings 1即可恢复 Vim 原生行为。Q2插件没有反应屏幕不滚动请确认 Vim/Neovim 版本满足要求依赖 timer API低版本无法创建定时器动画不会启动。Q3能否让j/k也变成平滑滚动键可以通过g:comfortable_motion_scroll_down_key/g:comfortable_motion_scroll_up_key改为j/k即可注意避免使用多动作组合键。Q4滚动距离感觉太近/太远三个方向可调增大flick()的冲量、降低friction与air_drag或提高interval的步长。结语comfortable-motion.vim 用不到 150 行代码就把物理引擎搬进了 Vim一个flick(impulse)函数 7 个全局变量就构成了它的完整 API 面。掌握本文的函数用法与变量含义后你只需在.vimrc中微调摩擦、阻力与冲量即可把 Vim 的阅读体验调校到最舒适的节奏。项目采用 MIT License 发布可自由使用与二次开发。【免费下载链接】comfortable-motion.vimBrings physics-based smooth scrolling to the Vim world!项目地址: https://gitcode.com/gh_mirrors/co/comfortable-motion.vim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考