Xsetroot出力の切り捨て?

Xsetroot出力の切り捨て?

私はいくつかのパッチ(必要に応じてGuixSDで)を使ってdwm 6.3の設定を開発してきました。ほとんどはまだ6.3で実行するように更新されていないため、すべての問題を解決するには多くの労力が必要です。

ステータスバーを正しく設定しようとすると(dualstatusとpangoのパッチが関係している)、xsetroot -nameの文字制限、シェルラインの長さの制限、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&region=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マーカー文字を収容するために配列サイズを 2 倍に増やしますが、 extrabar パッチは配列サイズを 2 倍にしません。

関連情報