Rust编写的Shell Prompt: Starship上手体验


图片来自《Sixtar Gate: STARTRAIL》,是一款以星空为主题的音乐游戏,在名字和风格上和starship都有异曲同工之妙,所以我TM在干嘛
starship官网:https://starship.rs/

前几天又是无聊翻Github,看看有没有什么比较好玩的项目。于是就翻到了这个Starship,用于定制你的shell prompt(说起来,shell prompt到底应该怎么翻译为好,shell提示符?)。
之前尝试过fishzsh的一些主题,感觉没有特别中意的,想要自己写一个,又因为对bash编程着实苦手,更遑论fish自己的那套语法了。突然发现一个看起来很舒服的shell prompt,自然要试着玩一玩,刚好改善一下工作心情。


图片来自starship官网,Github图片加载可能会慢

安装

安装很简单,跟着使用指导走,一步搞定。
我在Windows(Powershell)WSL(fish)MacOS(zsh)里都尝试安装了。需要两步

  1. 下载starship并安装,可以通过cargobrewwinget或者官网的bash安装脚本来解决。
  2. 在对应shell的配置文件中启用starship

好,现在你有了一个看起来还算不错的shell prompt。

来个舒服的配置

初始的配置也还算好看,但是如果你打开某些项目,它可能会长这样

好长,并且中间的 onisvia有一些占据空间。
幸运的是,starship官方还提供了一些预设,免去我动脑子以及上班摸鱼被抓的功夫。使用起来也是比较简单的,已经内置在命令里了。比如执行

starship preset bracketed-segments > ~/.config/starship.toml

就可以轻松更换成预设样式。
不知道为什么,我通过winget下载的starship版本只有1.9.1,而最新是1.10.1,根本就没有preset这个命令。

舒服很多,好耶。

微调一下

但是还有一些东西不太爽,比如我完全不需要package version,以及想要在prompt上显示出当前时间。
开整,修改下配置就好了

vim ~/.config/starship.toml

没有执行上面修改预设的话,文件可能会不存在,新建一个就好。

package version不想要,就禁用掉。同理,想显示时间,就把它启用。

[package]
disabled = true
format = '\[[$symbol$version]($style)\]'

[time]
disabled = false
format = '\[[$time]($style)\]'

相关的配置都可以在官方文档上找到

保存后立即生效,舒适.jpg

感觉时间放在前面怪怪的?通过prompt的format参数调整下位置吧。

format = "$time $all"

自己整个活

starship的文档,发现可以添加自己自定义的内容,那不来整个活。
之前一直觉得,如果能在控制台里实时显示天气感觉是不是很炫酷?

刚好之前有收藏过一个非常好玩的天气网站,wttr.in,大概是这么玩的:

除此之外,它还可以自定义显示语言和显示格式,比如 http://wttr.in?lang=zh&format=%C%c+%T

好,就是它了。

但是,我不可能每次输出prompt都去请求下网站吧?请求一次可能要卡个1秒,感觉有点无法接受。折中下吧,显示通过读文件的形式,而更新通过定时任务来完成。可以通过调整定时任务的时间,来达到近似实时的效果。

先简单写个脚本,获得天气信息,并且写入到文件里。

#!/usr/bin/bash
curl "https://wttr.in/?lang=zh&format=%c%C+%t" | sponge /tmp/weather

结果保存到/tmp/weather文件中。至于为什么不用管道重定向,而是用sponge命令,是我在测试的时候发现,如果你刚好在脚本执行的时候读取/tmp/weather文件时,这个文件的内容会变成空的,因为文件已经在执行的时候被提前清空准备写内容了。而sponge就能够解决这个问题,它会在读取完输入内容后再去写文件。

给它加上执行权限,随便扔个地方。我就直接放在/usr/local/bin了。执行下试试。

[00:43:36] ~
❯ getweather
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    21  100    21    0     0     20      0  0:00:01  0:00:01 --:--:--    20

[00:43:39] ~
❯ cat /tmp/weather
☀️  晴朗 +16°C⏎

看起来不错。

然后写个crontab命令。这里推荐下crontab.guru,能帮助你节省下编纂crontab命令的掉发:)

0/15 * * * * /usr/local/bin/getweather

我还是比较怂的,写了个每15分钟更新一次。crontab -e一下,把写好的指令扔进去。
(btw,如果crontab命令跑失败了,可以尝试把curl或者sponge改成绝对路径)

然后就是在starship.toml里写个自定义命令了。

format = "${custom.weather}$time$all" # 把天气显示提到最前

[custom.weather]
when = '''test -e /tmp/weather''' # 当/tmp/weather存在的时候才会显示
command = '''cat /tmp/weather''' # 读取文件内容
format = '\[[$output]($style)\]' # 设置输出格式

保存,出来看效果~

再explain下看看处理时间

挺快的哦!

结语

折腾还是开心的,虽然也许没啥用,但是看着就很开心,说不定能提高工作效率~
其实原本还想写一下prompt显示的原理,以及像starship这种插件是如何挂载进你的shell的,但是字数太多了,并且我自己还没搞得太明白,就下回分解吧!

发表回复

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据