大家好,我是 @洛竹
本文首发于 洛竹的官方网站
本文同步于公众号『洛竹早茶馆』,转载请联系作者。
创作不易,养成习惯,素质三连!
spinner 是一个简单的包,可以向任何终端应用程序中添加一个 spinner /progress 指示器。可以在下面找到示例,也可以在 examples 目录中找到完整的示例。
有关该库及其功能的更多详细信息,请在安装后参考本地的 godoc。
安装
go get github.com/briandowns/spinner
可用的字符集
(由其切片索引编号)
| 索引 | 字符集 | GIF |
|---|---|---|
| 0 | ←↖↑↗→↘↓↙ | |
| 1 | ▁▃▄▅▆▇█▇▆▅▄▃▁ | |
| 2 | ▖▘▝▗ | |
| 3 | ┤┘┴└├┌┬┐ | |
| 4 | ◢◣◤◥ | |
| 5 | ◰◳◲◱ | |
| 6 | ◴◷◶◵ | |
| 7 | ◐◓◑◒ | |
| 8 | .oO@* | |
| 9 | |/-\ | |
| 10 | ◡◡⊙⊙◠◠ | |
| 11 | ⣾⣽⣻⢿⡿⣟⣯⣷ | |
| 12 | >))'> >))'> >))'> >))'> >))'> <'((< <'((< <'((< | |
| 13 | ⠁⠂⠄⡀⢀⠠⠐⠈ | |
| 14 | ⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏ | |
| 15 | abcdefghijklmnopqrstuvwxyz | |
| 16 | ▉▊▋▌▍▎▏▎▍▌▋▊▉ | |
| 17 | ■□▪▫ | |
| 18 | ←↑→↓ | |
| 19 | ╫╪ | |
| 20 | ⇐⇖⇑⇗⇒⇘⇓⇙ | |
| 21 | ⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈ | |
| 22 | ⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈ | |
| 23 | ⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁ | |
| 24 | ⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋ | |
| 25 | ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン | |
| 26 | . .. ... | |
| 27 | ▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▏▎▍▌▋▊▉█▇▆▅▄▃▂▁ | |
| 28 | .oO°Oo. | |
| 29 | +x | |
| 30 | v<^> | |
| 31 | >>---> >>---> >>---> >>---> >>---> <---<< <---<< <---<< <---<< <---<< | |
| 32 | | || ||| |||| ||||| |||||| ||||| |||| ||| || | | |
| 33 | [] [=] [==] [===] [====] [=====] [======] [=======] [========] [=========] [==========] | |
| 34 | (*---------) (-*--------) (--*-------) (---*------) (----*-----) (-----*----) (------*---) (-------*--) (--------*-) (---------*) | |
| 35 | █▒▒▒▒▒▒▒▒▒ ███▒▒▒▒▒▒▒ █████▒▒▒▒▒ ███████▒▒▒ ██████████ | |
| 36 | [ ] [=> ] [===> ] [=====> ] [======> ] [========> ] [==========> ] [============> ] [==============> ] [================> ] [==================> ] [===================>] | |
| 37 | 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 | |
| 38 | 🕐 🕜 🕑 🕝 🕒 🕞 🕓 🕟 🕔 🕠 🕕 🕡 🕖 🕢 🕗 🕣 🕘 🕤 🕙 🕥 🕚 🕦 🕛 🕧 | |
| 39 | 🌍 🌎 🌏 | |
| 40 | ◜ ◝ ◞ ◟ | |
| 41 | ⬒ ⬔ ⬓ ⬕ | |
| 42 | ⬖ ⬘ ⬗ ⬙ | |
| 43 | [>>> >] []>>>> [] [] >>>> [] [] >>>> [] [] >>>> [] [] >>>>[] [>> >>] |
特性
- 开始
- 停止
- 重启
- 反转方向
- 更新 spinner 字符集
- 更新 spinner 速度
- 前缀或者后缀文字
- 修改 spinner 颜色、背景色和文字属性
- 获取 spinner 状态
- 链,管道,重定向输出
- 在 spinner 完成时输出最终字符串
示例
package main
import (
"github.com/briandowns/spinner"
"time"
)
func main() {
s := spinner.New(spinner.CharSets[9], 100*time.Millisecond) // 构建新的 spinner
s.Start() // 开始
time.Sleep(4 * time.Second) // 模拟真实的工作
s.Stop()
}
更新字符集并重启 spinner
s.UpdateCharSet(spinner.CharSets[1]) // 用不同的字符集更新 spinner
s.Restart() // 重启 spinner
time.Sleep(4 * time.Second)
s.Stop()
更新旋转速度并重新启动微调器
s.UpdateSpeed(200 * time.Millisecond) // 更新 spinner 转动的速度
s.Restart()
time.Sleep(4 * time.Second)
s.Stop()
反转 spinner 旋转的方向
s.Reverse() // 反转 spinner 旋转的方向
s.Restart()
time.Sleep(4 * time.Second)
s.Stop()
提供你自己的 spinner
或者给我发送一个 issue 或者 pull request 添加到项目里。
someSet := []string{"+", "-"}
s := spinner.New(someSet, 100*time.Millisecond)
spinner 的前缀和后缀文字
s.Prefix = "prefixed text: " // spinner 前缀
s.Suffix = " :appended text" // spinner 后缀
设置或改变 spinner 的颜色
默认颜色是 white。spinner 需要重启来应用改变。
s.Color("red") // 设置 spinner 颜色为 red
您可以同时指定背景色和前景色,以及其他属性,例如 bold 或 underline。
s.Color("red", "bold") // Set the spinner color to a bold red 设置 spinner 为粗体红色
或将背景设置为黑色,将前景设置为粗体红色:
s.Color("bgBlack", "bold", "fgRed")
下面是完整的 color 和属性列表:
// default colors
red
black
green
yellow
blue
magenta
cyan
white
// attributes
reset
bold
faint
italic
underline
blinkslow
blinkrapid
reversevideo
concealed
crossedout
// foreground text
fgBlack
fgRed
fgGreen
fgYellow
fgBlue
fgMagenta
fgCyan
fgWhite
// foreground Hi-Intensity text
fgHiBlack
fgHiRed
fgHiGreen
fgHiYellow
fgHiBlue
fgHiMagenta
fgHiCyan
fgHiWhite
// background text
bgBlack
bgRed
bgGreen
bgYellow
bgBlue
bgMagenta
bgCyan
bgWhite
// background Hi-Intensity text
bgHiBlack
bgHiRed
bgHiGreen
bgHiYellow
bgHiBlue
bgHiMagenta
bgHiCyan
bgHiWhite
生成数字序列
setOfDigits := spinner.GenerateNumberSequence(25) // 生成25位数字的字符串
s := spinner.New(setOfDigits, 100*time.Millisecond)
获取 spinner 状态
fmt.Println(s.Active())
Unix管道和重定向
由 dekz 建议并撰写的功能
将 Spinner Writer 设置为 Stderr 可以增强向链,管道或重定向输出的功能,从而向用户显示进度。
这是此时设置 Writer 的首选方法。
s := spinner.New(spinner.CharSets[11], 100*time.Millisecond, spinner.WithWriter(os.Stderr))
s.Suffix = " Encrypting data..."
s.Start()
// Encrypt the data into ciphertext
fmt.Println(os.Stdout, ciphertext)
> myprog encrypt "Secret text" > encrypted.txt
⣯ Encrypting data...
> cat encrypted.txt
1243hjkbas23i9ah27sj39jghv237n2oa93hg83
最终字符串输出
spinner/indicator 完成后添加其他输出。最终输出字符串可以是多行的,并将被写入配置了 io.Writer 的任何地方。
s := spinner.New(spinner.CharSets[9], 100*time.Millisecond)
s.FinalMSG = "Complete!\nNew line!\nAnother one!\n"
s.Start()
time.Sleep(4 * time.Second)
s.Stop()
输出:
Complete!
New line!
Another one!