conkyに複数のカレンダーを表示し、当日だけを確実にカラーにする

1.カレンダーって複数表示が絶対必要だ・・・と思う

年が明けての初めての投稿です。本年もよろしくお願いしま

さて、conky にカレンダーを表示させ、ちょっとした日付の確認に複数月のカレンダーを表示、当日の曜日の色を変えて運用していました(https://github.com/xyphanajay/conky/blob/master/.conkyrcを借用)。が、この変数方式では、当日だけでなく翌月の同じ日付をマークしたりするので、何とか当日だけをマークするように設定できないかと考えていました。

完成形は、こんな状態です。

2.完成したコード

  • cal from util-linux 2.39.3
  • sed (GNU sed) 4.9
  • conky 1.19.6_pre compiled 2023-12-22 for Linux x86_64
${execpi 60 cal -n 2  --color=always | sed -r 's/\x1b\[7m(\s[0-9]{1}|[0-9]{2})\x1b\[0m/${color red}\1${color}/g'}

カレンダー(2ヶ月表示)を60秒ごとに更新し、当日だけを赤色で表示するもの。

3.ちょっと解説

このコードを分解してみます

conkyの命令${execpi 60${color red}${color}|
cal,sedの命令cal -n 2 –color=always | sed -r ‘s/\x1b\[7m(\s[0-9]{1}|[0-9]{2})\x1b\[0m/\1/g’

(1)Conky の命令

${execpi 60 ・A・${color red} ・B・ ${color}}

「conkyが 60秒ごとにA を実行し、Bを赤色で表示しなさい」

(2)cal と sed の命令

cal -n 2 –color=always

cal – n 2 は 当月と翌月 cal -n 3 なら翌々月まで表示します。 なお、cal -3 オプションは前月、当月、翌月の3ヶ月表示が可能です。

cal –color=always で無理やり制御文字を表示させます。これをsed変換に使用するためです。

|

パイプ処理です。「左側の命令 | 右側の命令」で、左側の処理結果を右側の処理に渡します。

sed -r ‘s/\x1b\[7m(\s[0-9]{1}|[0-9]{2})\x1b\[0m//g’

cal -n 2 –color=always の出力結果は、以下のように半角スペース数字を基本に、当日だけをカラー化する制御文字と色番号で成り立っています。制御文字分だけ表示が横にずれています。この制御文字だけを消去し、それをconkyでカラー化すれば、当日だけが確実にカラー化されます

※ 0m/ と /g’の間には、\1 が記載されていますが、ワードプレス上では無視されて表示されていません。

  • sed -r ‘ s/ 制御文字文のパターン / 置換パターン / g ‘ が基本形で、
  • 制御文字分のパターンは \x1b\[7m ・・・\x1b\[0m の分は、^[[7m ^[[0m が当日の数字を反転表示する制御文字とカラーコード
  • (\s[0-9]{1}|[0-9]{2}) はスペースと1桁数字 または 2桁数字
  • \1 は前段で処理したものを後ろで参照すること。「後方参照」というらしい。

このあたりは「正規表現」というパターン処理技術を利用して、マッチした制御コードとカラーコードを削除し、conkyが表示するところで「参照」させるというもの

4.参考ページ

コメント

タイトルとURLをコピーしました