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;
}
このように、テンプレートにあったcolor0
~color15
がすべて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
です。
もし、ない場合は次のような内容のファイルを作っておきます。
[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/
に作ります。
[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
の末尾を修正します。
:
# border=FF0000ff # 念のためコメントアウト
# prompt=FF0000ff #
# input=FF0000ff #
# selection=FF000088 #
[main] # 追記
include=~/.cache/wal/colors-fuzzel.ini # 追記
ファイルの末尾でinclude
という設定項目を使ってpywalの出力ファイルを読み込むようにしました。
先頭で読むか、末尾で読むか
ここでは設定ファイルの末尾でpywalの出力ファイルを読み込んでいますが、どこで読み込むかはそのアプリによります。
同じ設定項目が複数あるときを考えて、この例のようにコメントアウトしておくのが安全ですが、あらかじめそのアプリが前優先で設定値を読み込むのか後優先なのかを確かめておくとハマりにくいと思います。
作業は以上です。
動作確認
- Rofiで
waypaper
と入力して壁紙を変更 - Rofiで
fuzzel
と入力してFuzzelを起動
Fuzzelのウィンドウ枠やプロンプトがHyprlandのウィンドウ枠の色と同じになっていたら成功です。
pywalにはテンプレートの他にも多くの機能があります。
もし今後も使いそうなら、Wikiに目を通しておくことをおすすめします。
pywalのパレット一覧
最後にpywalを使うときに便利なスクリプトを紹介します。
#!/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はとても便利ですが、自動で色を取得するという性格上、使う壁紙によっては見づらいパレットになることもあります。
あまり凝りすぎると時間が溶けてしまうので、ほどほどにしたいところです。
Discussion