🔤

en_USで頑張るArch Linux日記 9日目:pywal

に公開

en_USで頑張るArch Linux日記の9日目です。

今日はpywalをやります。

そもそもpywalとは

pywalは壁紙に使われている色調からカラーパレットを生成するツールです。

pywalを使うことで、壁紙を変えるとすぐにボタンやテキストボックスの色をいい感じに変更することが出来ます。

ML4Wのhyprdotにはpywalが入っており、ウィンドウ枠の色やプリインストールのアプリは壁紙に連動して色が変わるように設定されています。

しかし、自分でインストールしたアプリにはpywalの設定がないので自前でやる必要があります。

この記事では新しくアプリをインストールして、そのアプリ用の設定をしてみます。
とはいうものの、pywalのテンプレート機能を使えばそれほど難しくありません。

テンプレートの使い方

pywalのテンプレートはウェブアプリのそれに比べると簡素なものです。

pywalは、あるフォルダに置かれたテキストファイルの{colorN}[1]という文字列を、壁紙から抽出した色コードに置換して別の場所に書き出します。pywalの仕事はそれだけです。

それぞれのフォルダは下表のようになっています。

テンプレートフォルダ ~/.config/wal/templates/
出力フォルダ ~/.cache/wal/

あとは、目的のアプリが起動したときに、その書き出されたファイルを設定ファイルとして読み込むとその色が反映されますが、それはそのアプリの仕事になります。

使用例

pywalの具体的な動作は既存の設定を見ると分かりやすいです。

たとえば、プリインストールされているRofiというアプリケーションランチャーのテンプレートファイルは下のようになっています。

cat ~/.config/wal/templates/colors-rofi-pywal.rasi

* {{
    background: rgba(0,0,1,0.5);
    foreground: #FFFFFF;
    color0:     {color0};
    color1:     {color1};
     :
    color15:    {color15};
}}

対して、pywalが出力したファイルは次のとおりです。

cat ~/.cache/wal/colors-rofi-pywal.rasi

* {
    background: rgba(0,0,1,0.5);
    foreground: #FFFFFF;
    color0:     #2e211f;          # 値は使用中の壁紙によって異なる
    color1:     #53A3B4;
     :
    color15:    #c5dddc;
}

このように、テンプレートにあったcolor0color15がすべてHEX値に置換されています。

最後に、このpywalの出力ファイルを読み込んでいる部分を確認しておきます。

rg colors-rofi-pywal ~/dotfiles      # ml4w

~/dotfiles/.config/rofi/config.rasi:35:@theme "~/.cache/wal/colors-rofi-pywal"
     :

これを見ると、置換後のファイルは Rofiがconfig.rasiという設定ファイルの中で@theme文を使って読み込んでいることがわかると思います。

つまり、テンプレートファイルの書式はそのアプリが直接読める形式(jsonやtoml、cssなど)にする必要がある(大半はそのアプリの設定ファイルの一部を抜き出したものになる)ということです。

また、置換後のファイル名はテンプレートファイルと同じということにも注意しておきます。

Fuzzel

テンプレートの基本が分かったので、Fuzzelというアプリをインストールしてpywalの色を設定してみます。

ちなみに、FuzzelはRofiと似たアプリケーションランチャーです。

インストール

下記の1行で完了です。

paru -S fuzzel

Fuzzelの設定ファイルは~/.config/fuzzel/fuzzel.iniです。
もし、ない場合は次のような内容のファイルを作っておきます。

~/.config/fuzzel/fuzzel.ini
[main]
font=JetBrainsMono-Regular:size=14
dpi-aware=no
prompt="❯❯ "
terminal=kitty

lines=16
width=50
tabs=4
horizontal-pad=50
vertical-pad=18
inner-pad=10

image-size-ratio=.25

[border]
width=6
radius=20

[colors]
background=1E3234ee
text=E3E3EAff
match=DDCC66ff
selection-match=DDCC66ff
selection-text=FFFFFFff
border=FF0000ff               # わかりやすいように赤にしておく
prompt=FF0000ff               #
input=FF0000ff                #
selection=FF000088            #

末尾の4行がテンプレートで設定する項目です。

この状態で元のランチャー(Rofi)でfuzzelと打ち込んでFuzzelを起動することを確認しておきます。

このように、ウィンドウ枠とプロンプト、入力文字列が赤く表示されていたらひとまずOKです。

Fuzzel用のテンプレート

まず、以下のようなテンプレートファイルを~/.config/wal/templates/に作ります。

~/.config/wal/templates/colors-fuzzel.ini
[colors]
border={color11}ff
prompt={color11}ff
input={color11}ff
selection={color11}88

置換の間違いを防ぐため、できるだけ変更する色に関わる部分だけにします。

採用する色は、Hyprlandのウィンドウ枠と同じ色のcolor11のみとしました。

ここで一点注意があります。
pywalのパレットでは色コードを#RRGGBBで表し、アルファは含まれません。
それに対して、Fuzzelの設定ファイルではアルファを含めたRRGGBBAA形式(#ありも可)で指定します。

上記の{color11}ff#RRGGBB#RRGGBBAA変換のために使っています[2]

テンプレートファイルができたら、先ほど赤色に設定したfuzzel.iniの末尾を修正します。

~/.config/fuzzel/fuzzel.ini
   :
# border=FF0000ff               # 念のためコメントアウト
# prompt=FF0000ff               #
# input=FF0000ff                #
# selection=FF000088            #

[main]                                       # 追記
include=~/.cache/wal/colors-fuzzel.ini       # 追記

ファイルの末尾でincludeという設定項目を使ってpywalの出力ファイルを読み込むようにしました。

先頭で読むか、末尾で読むか

ここでは設定ファイルの末尾でpywalの出力ファイルを読み込んでいますが、どこで読み込むかはそのアプリによります。
同じ設定項目が複数あるときを考えて、この例のようにコメントアウトしておくのが安全ですが、あらかじめそのアプリが前優先で設定値を読み込むのか後優先なのかを確かめておくとハマりにくいと思います。

作業は以上です。

動作確認

  1. Rofiでwaypaperと入力して壁紙を変更
  2. Rofiでfuzzelと入力してFuzzelを起動

Fuzzelのウィンドウ枠やプロンプトがHyprlandのウィンドウ枠の色と同じになっていたら成功です。


pywalにはテンプレートの他にも多くの機能があります。
もし今後も使いそうなら、Wikiに目を通しておくことをおすすめします。

pywalのパレット一覧

最後にpywalを使うときに便利なスクリプトを紹介します。

pywal-colors
#!/usr/bin/zsh

for i in {0..7}; do; printf "%4d\t" "${i}"; done
echo
wal --preview | tail -n3 | head -n2 | sed -E "s/ {4}/        /g"
for i in {8..15}; do; printf "%4d\t" "${i}"; done
echo \\n
cat ~/.cache/wal/colors | tr "\n" " " | sed -z "s/\s/\n/8" && echo \\n

これを使うとカラーパレットと番号の一覧がターミナルに表示されます。

テンプレートに設定したい色がcolor何番なのか迷ったら使ってください。

`colorN`以外は?

pywalのパレットにはcolorNの他にもエイリアス的な色名があります。

色名 colorN
background color0
foreground

cursor
color15

これらの色名はシェルやエディタなどに使われていることもあるようです。

Refer to: https://github.com/dylanaraps/pywal/issues/663


pywalはとても便利ですが、自動で色を取得するという性格上、使う壁紙によっては見づらいパレットになることもあります。

あまり凝りすぎると時間が溶けてしまうので、ほどほどにしたいところです。

→10日目

脚注
  1. {color0}{color15} ↩︎

  2. ちなみにアルファ値は0x00が透明で、0xffが最も濃い色になります。 ↩︎

Discussion