我一直在为 dwm 6.3 开发一个带有一堆补丁的配置(在 GuixSD 上,如果重要的话)。其中大多数尚未更新为可在 6.3 上运行,因此需要付出很大的努力才能解决所有问题。
尝试正确设置我的状态栏(dualstatus 和 pango 补丁是相关的),我遇到了一个问题,似乎是由 xsetroot -name 中的字符限制、shell 行长度限制、pango 处理限制引起的, ETC。
第一的,我的 dwm 构建,以防出现错误。我正在尝试将底部栏文本设置为包含股票行情代码,并根据每日变化的迹象进行着色。我发现这脚本在某处查询某个 API 中的数字,并将它们格式化后呈现给终端。这是我的脚本版本,我通过将终端颜色命令替换为 pango 标记字段来更改它。
#!/usr/bin/env bash
set -e
LANG=C
LC_NUMERIC=C
SYMBOLS=("$@")
if ! $(type jq > /dev/null 2>&1); then
echo "'jq' is not in the PATH. (See: https://stedolan.github.io/jq/)"
exit 1
fi
if [ -z "$SYMBOLS" ]; then
echo "Usage: ./ticker.sh AAPL MSFT GOOG BTC-USD"
exit
fi
FIELDS=(symbol marketState regularMarketPrice regularMarketChange regularMarketChangePercent \
preMarketPrice preMarketChange preMarketChangePercent postMarketPrice postMarketChange postMarketChangePercent)
API_ENDPOINT="https://query1.finance.yahoo.com/v7/finance/quote?lang=en-US®ion=US&corsDomain=finance.yahoo.com"
COLOR_BOLD='<span weight="bold">'
COLOR_GREEN='<span foreground="green">'
COLOR_RED='<span foreground="red">'
COLOR_RESET='</span>'
symbols=$(IFS=,; echo "${SYMBOLS[*]}")
fields=$(IFS=,; echo "${FIELDS[*]}")
results=$(curl --silent "$API_ENDPOINT&fields=$fields&symbols=$symbols" \
| jq '.quoteResponse .result')
query () {
echo $results | jq -r ".[] | select(.symbol == \"$1\") | .$2"
}
for symbol in $(IFS=' '; echo "${SYMBOLS[*]}" | tr '[:lower:]' '[:upper:]'); do
marketState="$(query $symbol 'marketState')"
if [ -z $marketState ]; then
printf 'No results for symbol "%s"\n' $symbol
continue
fi
preMarketChange="$(query $symbol 'preMarketChange')"
postMarketChange="$(query $symbol 'postMarketChange')"
if [ $marketState == "PRE" ] \
&& [ $preMarketChange != "0" ] \
&& [ $preMarketChange != "null" ]; then
nonRegularMarketSign='\*'
price=$(query $symbol 'preMarketPrice')
diff=$preMarketChange
percent=$(query $symbol 'preMarketChangePercent')
elif [ $marketState != "REGULAR" ] \
&& [ $postMarketChange != "0" ] \
&& [ $postMarketChange != "null" ]; then
nonRegularMarketSign='*'
price=$(query $symbol 'postMarketPrice')
diff=$postMarketChange
percent=$(query $symbol 'postMarketChangePercent')
else
nonRegularMarketSign=''
price=$(query $symbol 'regularMarketPrice')
diff=$(query $symbol 'regularMarketChange')
percent=$(query $symbol 'regularMarketChangePercent')
fi
if [ "$diff" == "0" ] || [ "$diff" == "0.0" ]; then
color=
elif ( echo "$diff" | grep -q ^- ); then
color=$COLOR_RED
else
color=$COLOR_GREEN
fi
if [ "$price" != "null" ]; then
printf "%-10s$COLOR_BOLD%8.2f$COLOR_RESET" $symbol $price
printf "$color%10.2f%12s$COLOR_RESET" $diff $(printf "(%.2f%%)" $percent)
printf " %s" "${nonRegularMarketSign}"
fi
done
为了将该错误与状态脚本所做的其他 12 件事隔离开来,我编写了以下测试脚本:
#!/bin/bash
set -f
ticker="$(bash /home/dnw/ticker.sh DIA) | $(bash /home/dnw/ticker.sh VOO) | $(bash /home/dnw/ticker.sh QQQ) | $(bash /home/dnw/ticker.sh BTC-USD)"
echo "${ticker}"
xsetroot -name ";${ticker}"
执行该命令会产生正确的回显文本,但状态栏上显示的文本几乎无法打印出 QQQ 值。我通过关闭 pango 标记并在行中的变量扩展之前添加一个空格来确保它是基于长度而不是基于时间的截断xsetroot
;输出丢失了一个字符(最初认为它是基于时间的;我的 status.sh 现在是多线程的,coprocess
哈哈)。
你们谁知道其中哪一部分有字符限制?我该如何解决这个问题?
谢谢。
答案1
弄清楚了;我想我会为有类似问题的人发帖。
这是一个 dwm 的事情; Pango 补丁将数组大小加倍stext
以适应标记字符,但 extrabar 补丁并未将其数组大小加倍。