yabai と skhd を最近は利用している
yabai という mac で動く tiling window manager を活用している。これと、同じ作者の skhd というショートカットマネージャーを組み合わせることで、ウィンドウの操作をほぼ全てキーボードで実施できるので鬼便利。 僕は ratpoison とかを長年使ってた経験あるので、この手の window manager は結構好き。
.yabairc を以下のように設定している。
# global settings
yabai -m config mouse_follows_focus off
yabai -m config focus_follows_mouse off
yabai -m config window_origin_display default
yabai -m config window_placement second_child
yabai -m config window_topmost off
yabai -m config window_shadow on
yabai -m config window_opacity off
yabai -m config window_opacity_duration 0.0
yabai -m config active_window_opacity 1.0
yabai -m config normal_window_opacity 0.60
yabai -m config window_border on
yabai -m config window_border_width 6
yabai -m config active_window_border_color 0xff775759
yabai -m config normal_window_border_color 0xff555555
yabai -m config insert_feedback_color 0xffd75f5f
yabai -m config split_ratio 0.50
yabai -m config auto_balance off
yabai -m config mouse_modifier fn
yabai -m config mouse_action1 move
yabai -m config mouse_action2 resize
yabai -m config mouse_drop_action swap
# general space settings
yabai -m config layout bsp
yabai -m config top_padding 0
yabai -m config bottom_padding 0
yabai -m config left_padding 0
yabai -m config right_padding 0
yabai -m config window_gap 0
yabai -m rule --add app="^System Preferences$" manage=off
yabai -m rule --add app="^Skitch$" manage=off
yabai -m rule --add app="^Zoom.*$" manage=off
echo "yabai configuration loaded.."
.skhdrc を以下のようにしている。
# focus window
alt - j : ~/dotfiles/bin/yabai-focus.pl
alt - k : ~/dotfiles/bin/yabai-focus.pl -r
# 画面を大きく3つのfloating window で占めて表示させる。
# 一番左に LINE アプリを表示。LINE アプリで本文が表示されるギリギリの横幅がこれ。
alt - 1: yabai -m window --toggle float && yabai -m window --grid 1:10:0:0:3:1
alt - 2: yabai -m window --toggle float && yabai -m window --grid 1:10:3:0:4:1
alt - 3: yabai -m window --toggle float && yabai -m window --grid 1:10:7:0:3:1
# swap window(よく使う)
shift + alt - h : yabai -m window --swap west
shift + alt - j : yabai -m window --swap south
shift + alt - k : yabai -m window --swap north
shift + alt - l : yabai -m window --swap east
# move window
shift + cmd - h : yabai -m window --warp west
shift + cmd - j : yabai -m window --warp south
shift + cmd - k : yabai -m window --warp north
shift + cmd - l : yabai -m window --warp east
# move window
shift + ctrl - a : yabai -m window --move rel:-20:0
shift + ctrl - s : yabai -m window --move rel:0:20
shift + ctrl - w : yabai -m window --move rel:0:-20
shift + ctrl - d : yabai -m window --move rel:20:0
# increase window size(よく使う)
shift + alt - a : yabai -m window --resize left:-20:0
shift + alt - s : yabai -m window --resize bottom:0:20
shift + alt - w : yabai -m window --resize top:0:-20
shift + alt - d : yabai -m window --resize right:20:0
# decrease window size
shift + cmd - a : yabai -m window --resize left:20:0
shift + cmd - s : yabai -m window --resize bottom:0:-20
shift + cmd - w : yabai -m window --resize top:0:20
shift + cmd - d : yabai -m window --resize right:-20:0
# rotate tree
alt - r : yabai -m space --rotate 90
# mirror tree y-axis
alt - y : yabai -m space --mirror y-axis
# mirror tree x-axis
alt - x : yabai -m space --mirror x-axis
# toggle desktop offset
alt - a : yabai -m space --toggle padding && yabai -m space --toggle gap
# toggle window fullscreen zoom
alt - f : yabai -m window --toggle zoom-fullscreen
# toggle window native fullscreen
shift + alt - f : yabai -m window --toggle float
# toggle window split type
alt - e : yabai -m window --toggle split
alt - o : yabai -m space --focus 2
alt - i : yabai -m space --move 2
# https://iter01.com/667321.html
で、ウィンドウの切り替えに以下のスクリプトを利用。
#!/usr/bin/perl
use strict;
use warnings;
use JSON::PP qw/decode_json/;
my $reversed = 0;
if (@ARGV == 1 && $ARGV[0] eq '-r') {
$reversed = 1;
}
my $json = `yabai -m query --windows --space`;
my @dat = @{decode_json($json)};
my @sorted = sort {
$a->{'is-floating'} <=> $b->{'is-floating'}
|| $a->{'frame'}{x} <=> $b->{'frame'}{x}
|| $a->{'frame'}{y} <=> $b->{'frame'}{y}
|| $a->{'frame'}{w} <=> $b->{'frame'}{w}
|| $a->{'frame'}{h} <=> $b->{'frame'}{h}
|| $a->{'id'} <=> $b->{'id'}
} @dat;
my $prev_is_focused = 0;
my @targets = 0..@sorted-1;
if ($reversed) {
@targets = reverse @targets;
}
for my $i (@targets) {
if ($prev_is_focused != 0) {
focus($sorted[$i]->{id});
exit 0;
}
if ($sorted[$i]->{'has-focus'}) {
$prev_is_focused++;
}
}
focus($sorted[$reversed ? -1 : 0]->{id});
exit 0;
sub focus {
my $id = shift;
system("yabai -m window --focus $id");
}
僕は、一般的なタイリングウィンドウマネージャー的な使い方ではなく、ちょっと変わった使い方をしている。 つかっているのがウルトラワイドモニターなので、フツウに bsp にすると画面を有効に使えてない気がするので、ちょいとした工夫をしている。 alt+1,alt+2,alt+3 で、ウィンドウをほぼ3分割して表示するようにしている。中央はやや広め。で、この3つはfloating windowとする。 alt+j, alt+k でのウィンドウの切り替えをするのだが、floating window を左から順番に切り替えて、その後 bsp を左から順番に切り替えるという設定にすることにより、ウィンドウの切り替えが速くなった。