我一直在为dwm 6.3开发一个配置,它有很多补丁(如果有关系的话,可以在GuixSD上使用)。它们中的大多数还没有更新到6.3版本上,所以为了解决所有问题都付出了很大的努力。
为了正确设置状态栏(双状态和pango补丁是相关的),我遇到了一个问题,它似乎是由xsetroot -name中的字符限制、shell行长度限制、pango处理限制等引起的。
首先是我的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=''
COLOR_GREEN=''
COLOR_RED=''
COLOR_RESET=''
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 lol)。
你们知道这其中哪一部分有字符限制吗?我该怎么处理呢?
谢谢。
发布于 2022-03-10 12:16:51
我想我会给任何有类似问题的人发帖子。
这是一个dwm问题;Pango补丁使数组stext的大小加倍以适应标记字符,但该条外补丁并没有使其数组大小加倍。
https://unix.stackexchange.com/questions/693662
复制相似问题