我想要一个基于夜班(日出/设置)的条件终端颜色。
我使用的是 macOS BigSur 11.2.3 和带有 zsh 的默认终端。
答案1
我不知道你的具体终端模拟器,但是在xterm
(许多终端模拟器已经复制了其API)中,你可以这样做:
printf '\e]11;%s\a' colorname
设置背景颜色。在哪里颜色名称可以是 X 库函数支持的任何颜色规范XParseColor()
。
然后,您可以zsh
在每个提示之前发送带有与太阳在天空中的位置相对应的颜色的转义序列,如下所示:
MY_LONGITUDE=$(curl -s 'http://ip-api.com/line?fields=lon')
# sanitise to avoid command injection vulnerability
[[ $MY_LONGITUDE = (-|)<0-180>(.<->|) ]] || MY_LONGITUDE=0
zmodload zsh/datetime
settermbg() {
local sun_time distance_to_noon hue value chroma
(( sun_time = (${1-EPOCHSECONDS} + MY_LONGITUDE * 86400 / 360) % 86400 ))
(( distance_to_noon = (sun_time - 43200. ) / 43200 )) # between -1 and 1
(( hue = (distance_to_noon + 1) * 180 ))
(( value = 100 - distance_to_noon ** 2 * 50 ))
(( chroma = distance_to_noon ** 2 * 60 ))
printf '\e]11;TekHVC:%5g/%5g/%5g\a' $hue $value $chroma
}
precmd_functions+=(settermbg)
这里使用的TekHVC:hue/value/chroma
颜色规范的值是根据到中午(太阳时间)的距离计算的,当太阳在天空中最高时,背景最亮、最白。
在这里,您的经度(用于确定太阳何时在天空中最高)是使用 提供的在线服务根据您的 IP 地址确定的ip-api.com
。它可能并不总是为您提供正确的值。如果您不旅行,您可能需要对其进行硬编码。