探秘Whirly:终端彩色动态加载指示器
在如今的命令行开发中,一个生动有趣的加载指示器能够极大地提升用户体验。Whirly就是这样一款专为Ruby设计的简单、多彩且可定制的终端加载指示器库,它内置了24种自定义动画和来自cli-spinners项目的更多样式。
动态演示
查看以下精彩演示:

或者在asciinema上直接体验全部预设的Whirly样式。
此外,还可以查看由cli-spinners提供的额外样式:

在这个asciinema中也能找到他们的实际运行效果。
快速上手
在你的Gemfile里添加如下代码:
gem 'whirly'
gem 'paint' # 让Whirly支持颜色(推荐)
之后,就可以愉快地使用Whirly啦!
基本用法
将下面的代码块放在你需要显示加载指示器的地方:
Whirly.start do
# 在这里执行耗时操作
sleep 5
end
可以随时更新指示器的文字信息:
Whirly.start do
Whirly.status = "设置一些文本与加载符号一起显示"
sleep 3
Whirly.status = "更新它"
sleep 2
end
如果你不喜欢使用代码块的形式,也可以手动控制开始和停止:
Whirly.start
sleep 5
Whirly.stop
start方法接受很多选项以定制你的指示器,如指定动画样式、初始状态等。详细信息见下文。
例如,这样设置一个使用"Pong"动画且无色的状态:
Whirly.start spinner: "pong", color: false, status: "游戏乒乓" do
sleep 10
end
查看示例目录获取更多的应用场景。
配置Whirly
通过调用.configure方法,你可以设置一个持久化的配置,这将在所有的.start调用中应用:
Whirly.configure spinner: "dots"
Whirly.start do
sleep 3 # 将使用dots动画
end
Whirly.start do
sleep 3 # 再次使用dots动画
end
调用.reset会恢复到未配置的状态:
Whirly.configure spinner: "dots"
Whirly.reset
Whirly.start do
sleep 3 # 将使用默认动画
end
动画样式
内置样式
详情可查阅以下文件:
data/whirly-static-spinners.json-lib/whirly/spinners/whirly.rb- cli-spinners项目。要观看所有内置样式的演示,请运行脚本
examples/all_spinners.rb。
Whirly.start 和 Whirly.configure 的配置选项
主要选项
spinner:
默认: "whirly"
你可以通过以下方式设定使用的动画:
- 使用内置动画名
- 提供一个动画帧数组
- 定义一个动态生成动画帧的Proc对象
- 直接提供一个完整的动画哈希对象(参阅下方“完整动画哈希格式”)
status:
默认: 无
用于直接设置初始状态文本,以显示在加载符号旁。
interval:
默认: 100
每帧动画之间的时间间隔,单位是毫秒。
进阶选项
ambiguous_characters_width:
默认: 1
如果设置为2,则异形Unicode字符会被视为宽度为2列。
ansi_escape_mode:
默认: "restore"
可选择为"line"来尝试另一种ANSI转义序列的生成方式(实验性功能)。
append_newline:
默认: true
当Whirly块结束(或调用了.stop)时,将会打印一个换行符。若不想换行,请将其设为false。
color:
默认: 如果已定义Paint常量,则启用
该选项控制是否以随机颜色显示加载符号。若不希望有色彩,设为false。另外还有color_change_rate选项。
color_change_rate:
默认: 30
颜色变化的速率值。
hide_cursor:
默认: true
默认情况下,加载期间会隐藏终端光标,退出程序时会自动恢复。如不想隐藏光标,将此选项设为false。
mode:
默认: "linear"
指示如何播放帧。可能的值有:"linear","reverse","swing"和"random"。参阅"模式"部分了解详情。
non_tty:
默认: false
Whirly仅在真正的终端环境下工作。如果你想在非终端环境中激活它,将此选项设为true。
position:
默认: "normal"
设为"below"可以让Whirly出现在正常位置的下一行。
remove_after_stop:
默认: false
停止后移除最后一个帧。
stop:
默认: 无
你可以指定一个自定义帧作为动画结束的标志,例如:
Whirly.start spinner: "clock", interval: 1000, stop: "⏰" do
sleep 12
end
spinner_packs:
默认: [:whirly, :cli]
Whirly包含了来自不同源的动画。此选项指定要考虑的源及其顺序(值对应Whirly::Spinners的大写字母常量)。
stream:
默认: $stdout
你可以传入一个兼容IO的对象,让Whirly在其他流上显示。
完整动画哈希格式
完整的动画是一个哈希,它可以有以下几个键值对。请注意,为了保持格式更通用,所有键都是字符串,而不是Ruby符号。除了"frames"和"proc"外,所有其他选项在启动或配置Whirly时都可覆盖。参考内置动画以获取样例定义。
"frames"
"proc"
替代"frames":一个每次调用都会生成下一帧的Proc。
"interval"
帧间切换的毫秒数。
"mode"
播放帧的顺序。可以是以下之一:
"linear":按正常顺序循环"reverse":反向循环"swing":先正向循环,再反向循环,但每个回合只播放第一帧和最后一帧一次"random":随机播放帧
请注意:"linear"模式下,即使帧仅为枚举对象也可工作,而其他帧模式要求能表示为数组。
"stop"
用来结束动画的帧。
注意事项、问题解决与限制
- 间隔时间是毫秒,但不要依赖精确计时
- 如果流不是真实的终端(或者传递了
non_tty: true),Whirly将不会有任何动作 - 颜色无法显示?确保在你的Gemfile中引入了paint库
- 不要设置太短的间隔(可能会显著影响性能)
许可证
- Whirly由Jan Lelis(https://janlelis.com)于2016年发布,并遵循MIT许可证。
- 包含来自cli-spinners的数据:MIT许可,Sindre Sorhus(sindresorhus@gmail.com)拥有版权(sindresorhus.com)。
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
atomcodeAn open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust019
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
HY-Embodied-0.5这是一套专为现实世界具身智能打造的基础模型。该系列模型采用创新的混合Transformer(Mixture-of-Transformers, MoT) 架构,通过潜在令牌实现模态特异性计算,显著提升了细粒度感知能力。Jinja00
LongCat-AudioDiT-1BLongCat-AudioDiT 是一款基于扩散模型的文本转语音(TTS)模型,代表了当前该领域的最高水平(SOTA),它直接在波形潜空间中进行操作。00
ERNIE-ImageERNIE-Image 是由百度 ERNIE-Image 团队开发的开源文本到图像生成模型。它基于单流扩散 Transformer(DiT)构建,并配备了轻量级的提示增强器,可将用户的简短输入扩展为更丰富的结构化描述。凭借仅 80 亿的 DiT 参数,它在开源文本到图像模型中达到了最先进的性能。该模型的设计不仅追求强大的视觉质量,还注重实际生成场景中的可控性,在这些场景中,准确的内容呈现与美观同等重要。特别是,ERNIE-Image 在复杂指令遵循、文本渲染和结构化图像生成方面表现出色,使其非常适合商业海报、漫画、多格布局以及其他需要兼具视觉质量和精确控制的内容创作任务。它还支持广泛的视觉风格,包括写实摄影、设计导向图像以及更多风格化的美学输出。Jinja00