「Bspwm」の版間の差分
Kusakata.bot (トーク | 投稿記録) Pkg/AUR テンプレートの更新 |
→設定: 同期 |
||
| (3人の利用者による、間の21版が非表示) | |||
| 9行目: | 9行目: | ||
{{Related articles end}} |
{{Related articles end}} |
||
''bspwm'' はウィンドウがフルバイナリツリーの葉となるタイル型ウィンドウマネージャです。[ |
''bspwm'' はウィンドウがフルバイナリツリーの葉となるタイル型ウィンドウマネージャです。[https://standards.freedesktop.org/wm-spec/wm-spec-1.3.html EWMH] やマルチモニターに対応しており、メッセージで設定したり制御することができます。 |
||
== インストール == |
== インストール == |
||
{{Pkg|bspwm}} と {{Pkg|sxhkd}} を[[インストール]]してください。あるいは開発版も存在します: {{AUR|bspwm-git}} と {{AUR|sxhkd-git}} |
{{Pkg|bspwm}} と {{Pkg|sxhkd}} を[[インストール]]してください。あるいは開発版も存在します: {{AUR|bspwm-git}} と {{AUR|sxhkd-git}} Sxhkd はシンプルな X ホットキーデーモンで、{{ic|bspc}} で bspwm と対話したりアプリケーションを起動したりするのに使います。 |
||
{{Note|2020年8月以降リリースはありません。問題が発生した場合、または不足している機能が必要な場合は、Git パッケージをインストールして下さい。}} |
|||
ログイン時に bspwm を起動させるには、以下を {{ic|~/.xinitrc}} や {{ic|~/.xprofile}} に追加してください (設定するファイルは X を起動する方法やディスプレイマネージャによって異なります): |
|||
==スタート== |
|||
{{bc| |
|||
sxhkd & |
|||
exec bspwm |
|||
}} |
|||
[[xinit]] を使用して {{ic|bspwm}} を実行します。 |
|||
設定ファイルの bspwmrc で sxhkd を起動する場合は最初の行は省いてください。 |
|||
== |
==設定== |
||
設定例は |
設定例は {{ic|/usr/share/doc/bspwm/examples/}} にあります。 |
||
そこから {{ic|bspwmrc}} を {{ic|~/.config/bspwm/}} にコピー/インストールし、{{ic|sxhkdrc}} を {{ic|~/.config/sxhkd/}} にコピー/インストールします。 |
|||
'''重要:''' $XDG_CONFIG_HOME 環境変数を設定しないと bspwmrc が認識されません。{{ic|1=XDG_CONFIG_HOME="$HOME/.config"}} や {{ic|export XDG_CONFIG_HOME}} を {{ic|~/.profile}} に追加してください。 |
|||
ファイル {{ic|bspwmrc}} に実行可能権限を付与して下さい。これは、デフォルトの例が単純にシェルスクリプトであるためです。 |
|||
{{ic|~/.config/bspwm/}} と {{ic|~/.config/sxhkd/}} を作成して、{{ic|/usr/share/doc/bspwm/examples/bspwmrc}} を {{ic|~/.config/bspwm/}} に、{{ic|/usr/share/doc/bspwm/examples/sxhkdrc}} を {{ic|~/.config/sxhkd/}} にコピーしてください。そして {{ic|chmod +x ~/.config/bspwm/bspwmrc}} で bspwmrc に実行可能権限を付与してください。 |
|||
{{ic|bspc}} コマンドを使用して bspwm を設定します。 |
|||
$ install -Dm755 /usr/share/doc/bspwm/examples/bspwmrc ~/.config/bspwm/bspwmrc |
|||
ウィンドウマネージャの設定やキーバインドを設定するファイルは2つ存在します。[[en2:bspwm/Example configurations|bspwm/設定例]]に注釈付きのサンプルがあります。 |
|||
$ install -Dm644 /usr/share/doc/bspwm/examples/sxhkdrc ~/.config/sxhkd/sxhkdrc |
|||
これら2つのファイルは、それぞれ wm 設定とキー割り当てを設定する場所です。 |
|||
bspwm のドキュメントは {{ic|man bspwm}} を実行することで確認できます。 |
|||
詳細なドキュメントについては、{{man|1|bspwm}} および {{man|1|sxhkd}} のマニュアルを参照してください。 |
|||
==== マルチモニターの設定 ==== |
==== マルチモニターの設定 ==== |
||
| 52行目: | 51行目: | ||
上記の例では、使用するデスクトップの合計は10なので、sxhkdrc で 'super + {1-9,0}' とそれぞれのデスクトップを指定することができます。 |
上記の例では、使用するデスクトップの合計は10なので、sxhkdrc で 'super + {1-9,0}' とそれぞれのデスクトップを指定することができます。 |
||
=== |
===ルール=== |
||
bspwmは、[[Wikipedia:Inter-Client Communication Conventions Manual|ICCM]] で指定された WM_CLASS プロパティ内の2番目の文字列(クラス名)に基づいてウィンドウにルールを適用できます。クラス名を確認するには、次の方法を使用できます: |
|||
ウィンドウルールを設定する方法は2つあります ([https://github.com/baskerville/bspwm/commit/cd97a3290aa8d36346deb706fa307f5f8faa2f34 cd97a32])。 |
|||
# {{Pkg|xorg-xprop}} を [[インストール]] |
|||
# {{ic|xprop {{!}} grep WM_CLASS}} を実行します。 |
|||
# 対象のウィンドウをクリックして、それを {{ic|xprop}} に指示します。 |
|||
# コマンドの出力から "2番目" の文字列を記録します。 |
|||
ウィンドウルールを設定する方法は2つあります ([https://github.com/baskerville/bspwm/commit/cd97a3290aa8d36346deb706fa307f5f8faa2f34 cd97a32]) |
|||
1つ目は、bspwmrc の例に示すように、組み込みのルールコマンドを使用する方法です: |
|||
1番目の方法は組み込まれている rule コマンドを使う方法です。bspwmrc のサンプルでも使われています: |
|||
{{bc|<nowiki> |
{{bc|<nowiki> |
||
bspc rule -a Gimp desktop=^8 follow=on state=floating |
bspc rule -a Gimp desktop=^8 follow=on state=floating |
||
| 65行目: | 72行目: | ||
</nowiki>}} |
</nowiki>}} |
||
2番目の方法は外部の rule コマンドを使う方法です。こちらの方法は複雑ですが、 |
2番目の方法は外部の rule コマンドを使う方法です。こちらの方法は複雑ですが、多様ななウィンドウルールを作成することができます。ルールコマンドの例は [https://github.com/baskerville/bspwm/tree/master/examples/external_rules こちらのサンプル] を見て下さい。 |
||
===パネル=== |
|||
特定のウィンドウが設定したルールのとおりに動かない場合、プログラムのクラス名を確認してください。{{ic|xprop <nowiki>|</nowiki> grep WM_CLASS}} を実行することでクラス名を確認することができます。 |
|||
=== |
==== lemonbar を使用する ==== |
||
{{AUR|lemonbar}}{{Broken package link|パッケージが存在しません}} のパネルのサンプルが GitHub ページの examples フォルダに存在します。[[Lemonbar]] の wiki ページで何か考えが得られるかもしれません。パネルは bspwmrc の {{ic|panel &}} を置き換えることで実行できます。bspwm パッケージの opt-depends を確認して、必要なパッケージをチェックしてください。 |
|||
{{AUR|lemonbar-git}} 用のサンプルパネルは、GitHub ページの examples フォルダに用意されています。また、[[lemonbar]] の Wiki ページからも参考になる情報が得られるかもしれません。このパネルは、bspwmrc に {{ic|panel &}} を配置することで実行されます。必要になる可能性がある依存関係については、{{Pkg|bspwm}} パッケージの [[optdepends]] を確認してください。 |
|||
様々なシステムコールを使うことでステータスバーにシステム情報を表示することが可能です。以下の例では {{ic|panel}} を編集して BAR にボリュームの情報を表示します: |
|||
ステータス バーにシステム情報を表示するには、さまざまなシステム コールを使用できます。この例では、{{ic|panel}} を編集して BAR の音量ステータスを取得する方法を示します: |
|||
{{bc|<nowiki> |
{{bc|<nowiki> |
||
| 89行目: | 97行目: | ||
}</nowiki>}} |
}</nowiki>}} |
||
次に、 |
次に、それが呼び出され、{{ic|$PANEL_FIFO}} にリダイレクトされていることを確認する必要があります: |
||
{{bc|<nowiki> |
{{bc|<nowiki> |
||
| 98行目: | 106行目: | ||
</nowiki>}} |
</nowiki>}} |
||
==== polybar を使用する ==== |
|||
=== スクラッチパッド === |
|||
[[Polybar]] を使用するには、bspwmrc 設定ファイルに {{ic|polybar ''example'' &}} を追加します。{{ic|''example''}} はバーの名前です。 |
|||
bspwm のウィンドウフラグを使うことで (i3 のスクラッチパッド機能でターミナルを表示したときのような) ドロップダウンターミナルを模す事ができます。bspwm の設定ファイルの末尾に以下を追加してください (使用しているターミナルエミュレータに置き換えてください): |
|||
===スクラッチパッド=== |
|||
====pid を使う==== |
|||
ドロップダウンターミナルをエミュレートできます。 |
|||
まず、{{ic|/usr/local/bin/scratch}} というファイルを作成します: |
|||
{{bc|<nowiki> |
{{bc|<nowiki> |
||
#!/bin/bash |
|||
bspc rule -a scratchpad sticky=on state=floating hidden=on |
|||
st -c scratchpad -e ~/bin/scratch & |
|||
name="$1" |
|||
filename=/tmp/"$1" |
|||
bspc_write_nodeid() { |
|||
while true |
|||
do |
|||
flag=false |
|||
for id in $(bspc query -d focused -N -n .floating.sticky.hidden) |
|||
do |
|||
bspc query --node $id -T | grep -q $name && { echo $id > $filename; flag=true; break; } |
|||
done |
|||
[[ "$flag" == "true" ]] && break |
|||
sleep 0.1s |
|||
done |
|||
} |
|||
hide_all_except_current(){ |
|||
for id in $(bspc query -d focused -N -n .floating.sticky.!hidden) |
|||
do |
|||
bspc query --node $id -T | grep -qv $name && bspc node $id --flag hidden=on |
|||
done |
|||
} |
|||
toggle_hidden() { |
|||
[ -e "$filename" ] || exit 1 |
|||
hide_all_except_current |
|||
id=$(<$filename) |
|||
bspc node $id --flag hidden -f |
|||
} |
|||
create_terminal(){ |
|||
alacritty --class="$name","$name" -e $1 & |
|||
} |
|||
if ! ps -ef | grep -q "[c]lass=$name" |
|||
then |
|||
bspc rule -a "$name" --one-shot state=floating sticky=on hidden=on |
|||
case "$name" in |
|||
"htop") |
|||
create_terminal htop |
|||
;; |
|||
"neomutt") |
|||
create_terminal neomutt |
|||
;; |
|||
"newsboat") |
|||
create_terminal newsboat |
|||
;; |
|||
"ranger") |
|||
create_terminal ranger |
|||
;; |
|||
"terminal") |
|||
create_terminal $SHELL |
|||
;; |
|||
*) |
|||
exit 1 |
|||
esac |
|||
dunstify "Scratch: starting $name" |
|||
bspc_write_nodeid |
|||
toggle_hidden |
|||
else |
|||
toggle_hidden |
|||
fi |
|||
</nowiki>}} |
|||
ここでは、{{ic|terminal}} アプリケーションは Alacritty を使っています。スクリプト内のクラス指定やコマンド実行を使用する他のターミナルに変更してください: |
|||
{{bc|<nowiki> |
|||
alacritty --class="$name","$name" -e $1 & |
|||
</nowiki>}} |
</nowiki>}} |
||
スクラッチパッドを切り替えるには、{{ic|~/.config/sxhkd/sxhkdrc}} を変更します: |
|||
スティッキーフラグによってウィンドウが常時デスクトップに表示されるようになります。そして {{ic|~/bin/scratch}} は以下のようにします: |
|||
{{bc|<nowiki> |
{{bc|<nowiki> |
||
# scratchpads |
|||
#!/usr/bin/sh |
|||
super + alt + {b,g,i,space,t} |
|||
bspc query -N -n .floating > /tmp/scratchid |
|||
scratch {newsboat,neomutt,ranger,terminal,htop} |
|||
$SHELL |
|||
</nowiki>}} |
</nowiki>}} |
||
スクラッチパッド |
===== Polybar を使用したスクラッチパッドのステータス ===== |
||
polybar の設定を次のように変更します: |
|||
{{bc | <nowiki> |
|||
modules-left = scratchpad |
|||
[module/scratchpad] |
|||
type = custom/script |
|||
interval = 0.1 |
|||
exec = $XDG_CONFIG_HOME/polybar/scratchpads_status.sh |
|||
</nowiki>}} |
|||
そして、次の内容でファイル {{ic|$XDG_CONFIG_HOME/polybar/scratchpads_status.sh}} を作成します。 |
|||
{{bc | <nowiki> |
|||
#!/bin/bash |
|||
names=" |
|||
htop H |
|||
neomutt M |
|||
newsboat N |
|||
ranger R |
|||
terminal T |
|||
" |
|||
status="" |
|||
cmd=$(ps -ef) |
|||
check_scratchpad() { |
|||
grep -q "[c]lass=$1" <<< "$cmd" |
|||
} |
|||
IFS=$'\n' |
|||
for name in $names |
|||
do |
|||
status+=$(check_scratchpad ${name% *} && echo ${name#* }) |
|||
done |
|||
if [ -n "$status" ] |
|||
then |
|||
echo "[$status]" |
|||
else |
|||
echo "" |
|||
fi |
|||
</nowiki>}} |
|||
====クラス名を使う==== |
|||
この例では、ドロップダウン端末としてカスタムクラス名を持つ ''termite'' を使用します。 ''termite'' である必要はありません。 |
|||
まず、次の内容のファイルをパスに作成し、実行可能にします。この例では、これを {{ic|scratchpad.sh}} と呼びます。 |
|||
{{bc|<nowiki> |
{{bc|<nowiki> |
||
#!/usr/bin/bash |
|||
id=$(cat /tmp/scratchid);\ |
|||
bspc node $id --flag hidden;bspc node -f $id |
|||
if [ -z $1 ]; then |
|||
echo "Usage: $0 <name of hidden scratchpad window>" |
|||
exit 1 |
|||
fi |
|||
pids=$(xdotool search --class ${1}) |
|||
for pid in $pids; do |
|||
echo "Toggle $pid" |
|||
bspc node $pid --flag hidden -f |
|||
done |
|||
</nowiki>}} |
</nowiki>}} |
||
次に、これを bspwm の設定に追加します。 |
|||
スクラッチパッドでは定義済みのルールがないどんなウィンドウタイプでも使うことができます。参照: [https://www.reddit.com/r/bspwm/comments/3xnwdf/i3_like_scratch_for_any_window_possible/cy6i585]。 |
|||
{{bc|<nowiki> |
|||
... |
|||
bspc rule -a dropdown sticky=on state=floating hidden=on |
|||
termite --class dropdown -e "zsh -i" & |
|||
... |
|||
</nowiki>}} |
|||
ウィンドウを切り替えるには、 [[sxhkd]] のカスタムルールが必要です。パラメータとしてカスタムクラス名を指定します。 |
|||
{{bc|<nowiki> |
|||
super + u |
|||
scratchpad.sh dropdown |
|||
</nowiki>}} |
|||
====その他==== |
|||
事前定義されたルールなしで任意のウィンドウタイプを使用できるスクラッチパッドについては、 [https://www.reddit.com/r/bspwm/comments/3xnwdf/i3_like_scratch_for_any_window_possible/cy6i585] を参照してください。 |
|||
多 |
多くの端末を最初からサポートし、オプションで tmuxinator/tmux セッションを開始したり、任意のウィンドウをその場でスクラッチパッドにしたり、現在のモニタに合うように自動的にスクラッチパッドのサイズを変更したりするためのフラグを持つ、より洗練されたスクラッチパッドスクリプトについては、 {{AUR|tdrop-git}} を参照してください。 |
||
=== |
===マシンごとにモニターの設定を変える=== |
||
{{ic|bspwmrc}} はシェルスクリプトなので、以下のように設定することができます: |
{{ic|bspwmrc}} はシェルスクリプトなので、以下のように設定することができます: |
||
| 132行目: | 290行目: | ||
#! /bin/sh |
#! /bin/sh |
||
<nowiki> |
<nowiki> |
||
if [[ $(hostname) == 'myhost' ]]; then |
|||
bspc monitor eDP1 -d I II III IV V VI VII VIII IX X |
bspc monitor eDP1 -d I II III IV V VI VII VIII IX X |
||
elif [[ $(hostname) == 'otherhost' ]]; then |
|||
bspc monitor VGA-0 -d I II III IV V |
bspc monitor VGA-0 -d I II III IV V |
||
bspc monitor VGA-1 -d VI VII VIII IX X |
bspc monitor VGA-1 -d VI VII VIII IX X |
||
elif [[ $(hostname) == 'yetanotherhost' ]]; then |
|||
bspc monitor DVI-I-3 -d VI VII VIII IX X |
bspc monitor DVI-I-3 -d VI VII VIII IX X |
||
bspc monitor DVI-I-2 -d I II III IV V |
bspc monitor DVI-I-2 -d I II III IV V |
||
fi |
|||
</nowiki> |
|||
=== |
===全てのウィンドウがフロートするデスクトップの設定=== |
||
以下はフリーティングウィンドウだけを表示するデスクトップ3を設定するスクリプトです。マルチウィンドウの GIMP などのアプリケーションで役に立ちます。 |
以下はフリーティングウィンドウだけを表示するデスクトップ3を設定するスクリプトです。マルチウィンドウの GIMP などのアプリケーションで役に立ちます。 |
||
| 151行目: | 309行目: | ||
#!/bin/bash |
#!/bin/bash |
||
<nowiki> |
<nowiki> |
||
# change the desktop number here |
|||
FLOATING_DESKTOP_ID=$(bspc query -D -d '^3') |
|||
bspc subscribe node_manage | while read -a msg ; do |
|||
desk_id=${msg[2]} |
desk_id=${msg[2]} |
||
wid=${msg[3]} |
wid=${msg[3]} |
||
[ "$FLOATING_DESKTOP_ID" = "$desk_id" ] && bspc node "$wid" -t floating |
[ "$FLOATING_DESKTOP_ID" = "$desk_id" ] && bspc node "$wid" -t floating |
||
done |
|||
</nowiki> |
|||
([https://github.com/baskerville/bspwm/issues/428#issuecomment-199985423 ソース]) |
([https://github.com/baskerville/bspwm/issues/428#issuecomment-199985423 ソース]) |
||
===キーボード=== |
|||
== トラブルシューティング == |
|||
Bspwm はキーボード入力を一切扱わず、代わりに ''bspc'' プログラムをインタフェースとして提供します。 |
|||
キーボードショートカットを使用するには、{{Pkg|sxhkd}} (開発版は {{AUR|sxhkd-git}}) のようなホットキーデーモンを設定する必要があります。 |
|||
==トラブルシューティング== |
|||
=== |
===画面が表示されずキーバインドが機能しない=== |
||
デバッグする方法はあまりありません。まず、画面が表示されないのは問題ありません。bspwm が動いているということだからです。 |
デバッグする方法はあまりありません。まず、画面が表示されないのは問題ありません。bspwm が動いているということだからです。 |
||
| 188行目: | 352行目: | ||
次に、表示されたターミナルに {{ic|pidof sxhkd}} と入力してみてください。数字が返ってくるはずです。返ってこない場合、sxhd が動いていません。{{ic|sxhkd -c ~/.config/sxhkd/sxhkdrc}} で明示的に実行してみてください。sxhkdrc で Super キーを Alt キーなどに変更して何か変わらないかも確認してください。また、サンプルファイルから (物理的にファイルをコピーしないで) テキストをコピーしたときに何か問題があった可能性もあります。コードをコピーアンドペーストするとインデントに何か不具合が生じることがあり、sxhkd はそれによって上手く動作しなくなったのかもしれません。 |
次に、表示されたターミナルに {{ic|pidof sxhkd}} と入力してみてください。数字が返ってくるはずです。返ってこない場合、sxhd が動いていません。{{ic|sxhkd -c ~/.config/sxhkd/sxhkdrc}} で明示的に実行してみてください。sxhkdrc で Super キーを Alt キーなどに変更して何か変わらないかも確認してください。また、サンプルファイルから (物理的にファイルをコピーしないで) テキストをコピーしたときに何か問題があった可能性もあります。コードをコピーアンドペーストするとインデントに何か不具合が生じることがあり、sxhkd はそれによって上手く動作しなくなったのかもしれません。 |
||
===カーソルテーマがデスクトップに適用されない=== |
|||
=== ウィンドウボックスがアプリケーションよりも大きく表示される === |
|||
こちらを参照、 [[カーソルテーマ#形が X のデフォルトカーソルの変更]] |
|||
===ウィンドウボックスがアプリケーションよりも大きく表示される=== |
|||
GTK3 アプリを使っている場合にダイアログボックスでこの問題が起こることがあります。gtk3 のテーマファイル ({{ic|~/.config/gtk-3.0/gtk.css}}) に以下を作成・追加することで解決できます: |
GTK3 アプリを使っている場合にダイアログボックスでこの問題が起こることがあります。gtk3 のテーマファイル ({{ic|~/.config/gtk-3.0/gtk.css}}) に以下を作成・追加することで解決できます: |
||
| 207行目: | 375行目: | ||
(ソース: [https://bbs.archlinux.org/viewtopic.php?pid=1404973#p1404973 Bspwm フォーラムスレッド]) |
(ソース: [https://bbs.archlinux.org/viewtopic.php?pid=1404973#p1404973 Bspwm フォーラムスレッド]) |
||
=== |
===Java アプリケーションの問題=== |
||
Java アプリケーションのウィンドウがリサイズできない、メニューがクリックするとすぐ閉じてしまうなどの問題が起こる場合、[[Java]] を見て下さい。 |
Java アプリケーションのウィンドウがリサイズできない、メニューがクリックするとすぐ閉じてしまうなどの問題が起こる場合、[[Java]] を見て下さい。 |
||
=== |
===fish を使用する場合のキーバインドの問題=== |
||
[[fish]] を使うと、デスクトップが切り替えられなくなります。これは bspc が ^ 文字を使っており fish と互換性がないためです。コマンドを実行するときは bash を使うように sxhkd を設定することで解決できます: |
[[fish]] を使うと、デスクトップが切り替えられなくなります。これは bspc が ^ 文字を使っており fish と互換性がないためです。コマンドを実行するときは bash を使うように sxhkd を設定することで解決できます: |
||
$ set -U SXHKD_SHELL /usr/bin/bash |
$ set -U SXHKD_SHELL /usr/bin/bash |
||
| 216行目: | 384行目: | ||
もしくは、sxhkdrc ファイルの ^ 文字をバックスラッシュでエスケープすることもできます。 |
もしくは、sxhkdrc ファイルの ^ 文字をバックスラッシュでエスケープすることもできます。 |
||
===fish を使用した時のパフォーマンスの問題=== |
|||
=== 起動時に "Could not grab key 43 with modfield 68" というエラーメッセージ === |
|||
[[sxhkd]] は、SHELL 環境変数に設定されたシェルを使用してコマンドを実行します。[[fish]] は、設定ファイルが大きいか不適切に設定されているため、初期化に時間がかかる場合があります。そのため、すべての sxhkd コマンドは、他のシェルよりも実行に時間がかかる場合があります。デフォルトのシェルを変更せずにこれを修正するには、sxhkd に明示的に bash を使うように指示するか、別のより高速なシェルでコマンドを実行するように指示します (たとえば、sh) |
|||
$ set -U SXHKD_SHELL sh |
|||
===起動時に "Could not grab key 43 with modfield 68" というエラーメッセージ=== |
|||
同じキーを二回使用としたか、sxhkd を二回起動しようとしています。bspwmrc や {{ic | ~/.profile}}、{{ic | ~/.bash_profile}} などをチェックして sxhkd を二重に起動してないか確認してください。 |
同じキーを二回使用としたか、sxhkd を二回起動しようとしています。bspwmrc や {{ic | ~/.profile}}、{{ic | ~/.bash_profile}} などをチェックして sxhkd を二重に起動してないか確認してください。 |
||
== |
==参照== |
||
* |
*メーリングリスト: bspwm ''at'' librelist.com. |
||
* |
*{{ic|#bspwm}} - IRC チャンネル at irc.freenode.net |
||
* |
*https://bbs.archlinux.org/viewtopic.php?id=149444 - Arch フォーラムスレッド |
||
* |
*https://github.com/baskerville/bspwm - GitHub プロジェクト |
||
* |
*https://github.com/windelicato/dotfiles/wiki/bspwm-for-dummies - earsplit's "bspwm for dummies" |
||
* |
*https://github.com/smlb/dotfiles/wiki/Bspwm - smlb の wiki |
||
2025年1月18日 (土) 04:51時点における最新版
bspwm はウィンドウがフルバイナリツリーの葉となるタイル型ウィンドウマネージャです。EWMH やマルチモニターに対応しており、メッセージで設定したり制御することができます。
インストール
bspwm と sxhkd をインストールしてください。あるいは開発版も存在します: bspwm-gitAUR と sxhkd-gitAUR Sxhkd はシンプルな X ホットキーデーモンで、bspc で bspwm と対話したりアプリケーションを起動したりするのに使います。
スタート
xinit を使用して bspwm を実行します。
設定
設定例は /usr/share/doc/bspwm/examples/ にあります。
そこから bspwmrc を ~/.config/bspwm/ にコピー/インストールし、sxhkdrc を ~/.config/sxhkd/ にコピー/インストールします。
ファイル bspwmrc に実行可能権限を付与して下さい。これは、デフォルトの例が単純にシェルスクリプトであるためです。
bspc コマンドを使用して bspwm を設定します。
$ install -Dm755 /usr/share/doc/bspwm/examples/bspwmrc ~/.config/bspwm/bspwmrc $ install -Dm644 /usr/share/doc/bspwm/examples/sxhkdrc ~/.config/sxhkd/sxhkdrc
これら2つのファイルは、それぞれ wm 設定とキー割り当てを設定する場所です。
詳細なドキュメントについては、bspwm(1) および sxhkd(1) のマニュアルを参照してください。
マルチモニターの設定
1つのモニターに10のデスクトップを設定する bspwmrc の例:
bspc monitor -d I II III IV V VI VII VIII IX X
上記の行を修正して、以下のようにモニターごとにデスクトップを追加してください:
bspc monitor DVI-I-1 -d I II III IV bspc monitor DVI-I-2 -d V VI VII bspc monitor DP-1 -d VIII IX X
`xrandr -q` や `bspc query -M` を使うことでモニターの名前を確認できます。
上記の例では、使用するデスクトップの合計は10なので、sxhkdrc で 'super + {1-9,0}' とそれぞれのデスクトップを指定することができます。
ルール
bspwmは、ICCM で指定された WM_CLASS プロパティ内の2番目の文字列(クラス名)に基づいてウィンドウにルールを適用できます。クラス名を確認するには、次の方法を使用できます:
- xorg-xprop を インストール
xprop | grep WM_CLASSを実行します。- 対象のウィンドウをクリックして、それを
xpropに指示します。 - コマンドの出力から "2番目" の文字列を記録します。
ウィンドウルールを設定する方法は2つあります (cd97a32)
1つ目は、bspwmrc の例に示すように、組み込みのルールコマンドを使用する方法です:
bspc rule -a Gimp desktop=^8 follow=on state=floating bspc rule -a Chromium desktop=^2 bspc rule -a mplayer2 state=floating bspc rule -a Kupfer.py focus=on bspc rule -a Screenkey manage=off
2番目の方法は外部の rule コマンドを使う方法です。こちらの方法は複雑ですが、多様ななウィンドウルールを作成することができます。ルールコマンドの例は こちらのサンプル を見て下さい。
パネル
lemonbar を使用する
lemonbar-gitAUR 用のサンプルパネルは、GitHub ページの examples フォルダに用意されています。また、lemonbar の Wiki ページからも参考になる情報が得られるかもしれません。このパネルは、bspwmrc に panel & を配置することで実行されます。必要になる可能性がある依存関係については、bspwm パッケージの optdepends を確認してください。
ステータス バーにシステム情報を表示するには、さまざまなシステム コールを使用できます。この例では、panel を編集して BAR の音量ステータスを取得する方法を示します:
panel_volume()
{
volStatus=$(amixer get Master | tail -n 1 | cut -d '[' -f 4 | sed 's/].*//g')
volLevel=$(amixer get Master | tail -n 1 | cut -d '[' -f 2 | sed 's/%.*//g')
# is alsa muted or not muted?
if [ "$volStatus" == "on" ]
then
echo "%{Fyellowgreen} $volLevel %{F-}"
else
# If it is muted, make the font red
echo "%{Findianred} $volLevel %{F-}"
fi
}
次に、それが呼び出され、$PANEL_FIFO にリダイレクトされていることを確認する必要があります:
while true; do
echo "S" "$(panel_volume) $(panel_clock)" > "$PANEL_FIFO"
sleep 1s
done &
polybar を使用する
Polybar を使用するには、bspwmrc 設定ファイルに polybar example & を追加します。example はバーの名前です。
スクラッチパッド
pid を使う
ドロップダウンターミナルをエミュレートできます。
まず、/usr/local/bin/scratch というファイルを作成します:
#!/bin/bash
name="$1"
filename=/tmp/"$1"
bspc_write_nodeid() {
while true
do
flag=false
for id in $(bspc query -d focused -N -n .floating.sticky.hidden)
do
bspc query --node $id -T | grep -q $name && { echo $id > $filename; flag=true; break; }
done
[[ "$flag" == "true" ]] && break
sleep 0.1s
done
}
hide_all_except_current(){
for id in $(bspc query -d focused -N -n .floating.sticky.!hidden)
do
bspc query --node $id -T | grep -qv $name && bspc node $id --flag hidden=on
done
}
toggle_hidden() {
[ -e "$filename" ] || exit 1
hide_all_except_current
id=$(<$filename)
bspc node $id --flag hidden -f
}
create_terminal(){
alacritty --class="$name","$name" -e $1 &
}
if ! ps -ef | grep -q "[c]lass=$name"
then
bspc rule -a "$name" --one-shot state=floating sticky=on hidden=on
case "$name" in
"htop")
create_terminal htop
;;
"neomutt")
create_terminal neomutt
;;
"newsboat")
create_terminal newsboat
;;
"ranger")
create_terminal ranger
;;
"terminal")
create_terminal $SHELL
;;
*)
exit 1
esac
dunstify "Scratch: starting $name"
bspc_write_nodeid
toggle_hidden
else
toggle_hidden
fi
ここでは、terminal アプリケーションは Alacritty を使っています。スクリプト内のクラス指定やコマンド実行を使用する他のターミナルに変更してください:
alacritty --class="$name","$name" -e $1 &
スクラッチパッドを切り替えるには、~/.config/sxhkd/sxhkdrc を変更します:
# scratchpads
super + alt + {b,g,i,space,t}
scratch {newsboat,neomutt,ranger,terminal,htop}
Polybar を使用したスクラッチパッドのステータス
polybar の設定を次のように変更します:
modules-left = scratchpad [module/scratchpad] type = custom/script interval = 0.1 exec = $XDG_CONFIG_HOME/polybar/scratchpads_status.sh
そして、次の内容でファイル $XDG_CONFIG_HOME/polybar/scratchpads_status.sh を作成します。
#!/bin/bash
names="
htop H
neomutt M
newsboat N
ranger R
terminal T
"
status=""
cmd=$(ps -ef)
check_scratchpad() {
grep -q "[c]lass=$1" <<< "$cmd"
}
IFS=$'\n'
for name in $names
do
status+=$(check_scratchpad ${name% *} && echo ${name#* })
done
if [ -n "$status" ]
then
echo "[$status]"
else
echo ""
fi
クラス名を使う
この例では、ドロップダウン端末としてカスタムクラス名を持つ termite を使用します。 termite である必要はありません。
まず、次の内容のファイルをパスに作成し、実行可能にします。この例では、これを scratchpad.sh と呼びます。
#!/usr/bin/bash
if [ -z $1 ]; then
echo "Usage: $0 <name of hidden scratchpad window>"
exit 1
fi
pids=$(xdotool search --class ${1})
for pid in $pids; do
echo "Toggle $pid"
bspc node $pid --flag hidden -f
done
次に、これを bspwm の設定に追加します。
... bspc rule -a dropdown sticky=on state=floating hidden=on termite --class dropdown -e "zsh -i" & ...
ウィンドウを切り替えるには、 sxhkd のカスタムルールが必要です。パラメータとしてカスタムクラス名を指定します。
super + u
scratchpad.sh dropdown
その他
事前定義されたルールなしで任意のウィンドウタイプを使用できるスクラッチパッドについては、 [1] を参照してください。
多くの端末を最初からサポートし、オプションで tmuxinator/tmux セッションを開始したり、任意のウィンドウをその場でスクラッチパッドにしたり、現在のモニタに合うように自動的にスクラッチパッドのサイズを変更したりするためのフラグを持つ、より洗練されたスクラッチパッドスクリプトについては、 tdrop-gitAUR を参照してください。
マシンごとにモニターの設定を変える
bspwmrc はシェルスクリプトなので、以下のように設定することができます:
#! /bin/sh
if [[ $(hostname) == 'myhost' ]]; then
bspc monitor eDP1 -d I II III IV V VI VII VIII IX X
elif [[ $(hostname) == 'otherhost' ]]; then
bspc monitor VGA-0 -d I II III IV V
bspc monitor VGA-1 -d VI VII VIII IX X
elif [[ $(hostname) == 'yetanotherhost' ]]; then
bspc monitor DVI-I-3 -d VI VII VIII IX X
bspc monitor DVI-I-2 -d I II III IV V
fi
全てのウィンドウがフロートするデスクトップの設定
以下はフリーティングウィンドウだけを表示するデスクトップ3を設定するスクリプトです。マルチウィンドウの GIMP などのアプリケーションで役に立ちます。
$PATH の通っているディレクトリに以下のスクリプトを配置して .xinitrc などから呼び出してください (呼び出すときは末尾に & を付けます):
#!/bin/bash
# change the desktop number here
FLOATING_DESKTOP_ID=$(bspc query -D -d '^3')
bspc subscribe node_manage | while read -a msg ; do
desk_id=${msg[2]}
wid=${msg[3]}
[ "$FLOATING_DESKTOP_ID" = "$desk_id" ] && bspc node "$wid" -t floating
done
(ソース)
キーボード
Bspwm はキーボード入力を一切扱わず、代わりに bspc プログラムをインタフェースとして提供します。
キーボードショートカットを使用するには、sxhkd (開発版は sxhkd-gitAUR) のようなホットキーデーモンを設定する必要があります。
トラブルシューティング
画面が表示されずキーバインドが機能しない
デバッグする方法はあまりありません。まず、画面が表示されないのは問題ありません。bspwm が動いているということだからです。
xinitrc が以下のようになっているか確認してください:
sxhkd & exec bspwm
アンパサンド (&) は重要です。次に、xinitrc でターミナルを実行して正しく位置取りがされるか確認してください。画面の"中心"に表示されるはずです。ターミナルを実行するには、.xinitrc に以下を記述します:
sxhkd & urxvt & exec bspwm
何も表示されない場合、おそらく urxvt がインストールされていません。表示はされるが画面全体を覆ってしまう場合、BSPWM が正しく起動していません。chmod +x ~/.config/bspwm/bspwmrc を実行したか確認してください。
次に、表示されたターミナルに pidof sxhkd と入力してみてください。数字が返ってくるはずです。返ってこない場合、sxhd が動いていません。sxhkd -c ~/.config/sxhkd/sxhkdrc で明示的に実行してみてください。sxhkdrc で Super キーを Alt キーなどに変更して何か変わらないかも確認してください。また、サンプルファイルから (物理的にファイルをコピーしないで) テキストをコピーしたときに何か問題があった可能性もあります。コードをコピーアンドペーストするとインデントに何か不具合が生じることがあり、sxhkd はそれによって上手く動作しなくなったのかもしれません。
カーソルテーマがデスクトップに適用されない
こちらを参照、 カーソルテーマ#形が X のデフォルトカーソルの変更
ウィンドウボックスがアプリケーションよりも大きく表示される
GTK3 アプリを使っている場合にダイアログボックスでこの問題が起こることがあります。gtk3 のテーマファイル (~/.config/gtk-3.0/gtk.css) に以下を作成・追加することで解決できます:
.window-frame, .window-frame:backdrop {
box-shadow: 0 0 0 black;
border-style: none;
margin: 0;
border-radius: 0;
}
.titlebar {
border-radius: 0;
}
(ソース: Bspwm フォーラムスレッド)
Java アプリケーションの問題
Java アプリケーションのウィンドウがリサイズできない、メニューがクリックするとすぐ閉じてしまうなどの問題が起こる場合、Java を見て下さい。
fish を使用する場合のキーバインドの問題
fish を使うと、デスクトップが切り替えられなくなります。これは bspc が ^ 文字を使っており fish と互換性がないためです。コマンドを実行するときは bash を使うように sxhkd を設定することで解決できます:
$ set -U SXHKD_SHELL /usr/bin/bash
もしくは、sxhkdrc ファイルの ^ 文字をバックスラッシュでエスケープすることもできます。
fish を使用した時のパフォーマンスの問題
sxhkd は、SHELL 環境変数に設定されたシェルを使用してコマンドを実行します。fish は、設定ファイルが大きいか不適切に設定されているため、初期化に時間がかかる場合があります。そのため、すべての sxhkd コマンドは、他のシェルよりも実行に時間がかかる場合があります。デフォルトのシェルを変更せずにこれを修正するには、sxhkd に明示的に bash を使うように指示するか、別のより高速なシェルでコマンドを実行するように指示します (たとえば、sh)
$ set -U SXHKD_SHELL sh
起動時に "Could not grab key 43 with modfield 68" というエラーメッセージ
同じキーを二回使用としたか、sxhkd を二回起動しようとしています。bspwmrc や ~/.profile、 ~/.bash_profile などをチェックして sxhkd を二重に起動してないか確認してください。
参照
- メーリングリスト: bspwm at librelist.com.
#bspwm- IRC チャンネル at irc.freenode.net- https://bbs.archlinux.org/viewtopic.php?id=149444 - Arch フォーラムスレッド
- https://github.com/baskerville/bspwm - GitHub プロジェクト
- https://github.com/windelicato/dotfiles/wiki/bspwm-for-dummies - earsplit's "bspwm for dummies"
- https://github.com/smlb/dotfiles/wiki/Bspwm - smlb の wiki