Skip to content

Commit e267a1e

Browse files
add yabai and skhd configs for macos
1 parent 61028e6 commit e267a1e

File tree

10 files changed

+242
-0
lines changed

10 files changed

+242
-0
lines changed

config/skhd/skhdrc

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# Pop Shell-like bindings for yabai.
2+
# Place in ~/.config/skhd/skhdrc (or include from your main skhdrc).
3+
# Assumes helper scripts exist in ~/.config/yabai/scripts/.
4+
5+
# Modes
6+
:: default
7+
:: pop_manage @
8+
9+
# Focus (Pop: Super + direction)
10+
cmd - h : yabai -m window --focus west
11+
cmd - j : yabai -m window --focus south
12+
cmd - k : yabai -m window --focus north
13+
cmd - l : yabai -m window --focus east
14+
cmd - left : yabai -m window --focus west
15+
cmd - down : yabai -m window --focus south
16+
cmd - up : yabai -m window --focus north
17+
cmd - right : yabai -m window --focus east
18+
19+
# Launcher (Pop: Super + /)
20+
cmd - slash : ~/.config/yabai/scripts/launcher.sh
21+
22+
# App launchers
23+
shift + alt + cmd - t : open /Applications/kitty.app
24+
shift + alt + cmd - c : open /Applications/Browsers.app
25+
26+
# Toggle floating/orientation/tiling/stacking (Pop: Super + g/o/y/s)
27+
cmd - g : yabai -m window --toggle float
28+
cmd - o : yabai -m window --toggle split
29+
cmd - y : ~/.config/yabai/scripts/toggle_tiling.sh
30+
cmd - s : ~/.config/yabai/scripts/toggle_stacking.sh
31+
32+
# Enter/leave management mode (Pop: Super + Return)
33+
cmd - return : true ; pop_manage
34+
pop_manage < return : true ; default
35+
pop_manage < escape : true ; default
36+
37+
# Move focused window across spaces (Pop workspace up/down).
38+
shift + cmd - k : ~/.config/yabai/scripts/move_window_space_follow.sh prev
39+
shift + cmd - j : ~/.config/yabai/scripts/move_window_space_follow.sh next
40+
shift + cmd - up : ~/.config/yabai/scripts/move_window_space_follow.sh prev
41+
shift + cmd - down : ~/.config/yabai/scripts/move_window_space_follow.sh next
42+
43+
# Move focused window across displays (Pop monitor shortcuts).
44+
shift + cmd - h : ~/.config/yabai/scripts/move_window_display_follow.sh west
45+
shift + cmd - l : ~/.config/yabai/scripts/move_window_display_follow.sh east
46+
shift + cmd - left : ~/.config/yabai/scripts/move_window_display_follow.sh west
47+
shift + cmd - right : ~/.config/yabai/scripts/move_window_display_follow.sh east
48+
shift + ctrl + cmd - k : ~/.config/yabai/scripts/move_window_display_follow.sh north
49+
shift + ctrl + cmd - j : ~/.config/yabai/scripts/move_window_display_follow.sh south
50+
shift + ctrl + cmd - up : ~/.config/yabai/scripts/move_window_display_follow.sh north
51+
shift + ctrl + cmd - down : ~/.config/yabai/scripts/move_window_display_follow.sh south
52+
53+
# Management mode approximation:
54+
# plain direction = move (warp)
55+
# ctrl + direction = swap
56+
# shift + direction = grow
57+
# shift + ctrl + direction = shrink
58+
# o/s/g/~ = orientation/stacking/float toggles
59+
pop_manage < h : yabai -m window --warp west
60+
pop_manage < j : yabai -m window --warp south
61+
pop_manage < k : yabai -m window --warp north
62+
pop_manage < l : yabai -m window --warp east
63+
pop_manage < left : yabai -m window --warp west
64+
pop_manage < down : yabai -m window --warp south
65+
pop_manage < up : yabai -m window --warp north
66+
pop_manage < right : yabai -m window --warp east
67+
68+
pop_manage < ctrl - h : yabai -m window --swap west
69+
pop_manage < ctrl - j : yabai -m window --swap south
70+
pop_manage < ctrl - k : yabai -m window --swap north
71+
pop_manage < ctrl - l : yabai -m window --swap east
72+
pop_manage < ctrl - left : yabai -m window --swap west
73+
pop_manage < ctrl - down : yabai -m window --swap south
74+
pop_manage < ctrl - up : yabai -m window --swap north
75+
pop_manage < ctrl - right : yabai -m window --swap east
76+
77+
pop_manage < shift - h : yabai -m window --resize left:40:0
78+
pop_manage < shift - j : yabai -m window --resize bottom:0:40
79+
pop_manage < shift - k : yabai -m window --resize top:0:-40
80+
pop_manage < shift - l : yabai -m window --resize right:40:0
81+
pop_manage < shift - left : yabai -m window --resize left:40:0
82+
pop_manage < shift - down : yabai -m window --resize bottom:0:40
83+
pop_manage < shift - up : yabai -m window --resize top:0:-40
84+
pop_manage < shift - right : yabai -m window --resize right:40:0
85+
86+
pop_manage < shift + ctrl - h : yabai -m window --resize left:-40:0
87+
pop_manage < shift + ctrl - j : yabai -m window --resize bottom:0:-40
88+
pop_manage < shift + ctrl - k : yabai -m window --resize top:0:40
89+
pop_manage < shift + ctrl - l : yabai -m window --resize right:-40:0
90+
pop_manage < shift + ctrl - left : yabai -m window --resize left:-40:0
91+
pop_manage < shift + ctrl - down : yabai -m window --resize bottom:0:-40
92+
pop_manage < shift + ctrl - up : yabai -m window --resize top:0:40
93+
pop_manage < shift + ctrl - right : yabai -m window --resize right:-40:0
94+
95+
pop_manage < o : yabai -m window --toggle split
96+
pop_manage < s : ~/.config/yabai/scripts/toggle_stacking.sh
97+
pop_manage < g : yabai -m window --toggle float
98+
pop_manage < grave : yabai -m window --toggle float
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/usr/bin/env sh
2+
3+
# Copy this file to ~/.config/yabai/rules.local.sh and adapt to your apps.
4+
# Use `yabai -m query --windows --window | jq .app,.title` to inspect names.
5+
6+
# Example: float browser picture-in-picture windows
7+
# yabai -m rule --add app="^Safari$" title="^Picture in Picture$" manage=off
8+
9+
# Example: float password prompts
10+
# yabai -m rule --add app="^KeePassXC$" title="^Unlock Database.*" manage=off
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#!/usr/bin/env sh
2+
3+
set -eu
4+
5+
: "${POP_INITIAL_LAYOUT:=bsp}"
6+
: "${POP_OUTER_GAP:=2}"
7+
: "${POP_INNER_GAP:=2}"
8+
9+
apply_space() {
10+
sid="$1"
11+
yabai -m config --space "${sid}" layout "${POP_INITIAL_LAYOUT}" >/dev/null 2>&1 || true
12+
yabai -m config --space "${sid}" top_padding "${POP_OUTER_GAP}" >/dev/null 2>&1 || true
13+
yabai -m config --space "${sid}" bottom_padding "${POP_OUTER_GAP}" >/dev/null 2>&1 || true
14+
yabai -m config --space "${sid}" left_padding "${POP_OUTER_GAP}" >/dev/null 2>&1 || true
15+
yabai -m config --space "${sid}" right_padding "${POP_OUTER_GAP}" >/dev/null 2>&1 || true
16+
yabai -m config --space "${sid}" window_gap "${POP_INNER_GAP}" >/dev/null 2>&1 || true
17+
}
18+
19+
if [ "${1:-}" != "" ]; then
20+
apply_space "$1"
21+
exit 0
22+
fi
23+
24+
# Apply to a reasonable range of spaces without requiring jq.
25+
for sid in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; do
26+
apply_space "${sid}"
27+
done

config/yabai/scripts/launcher.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/usr/bin/env sh
2+
3+
set -eu
4+
5+
# Prefer an installed app launcher; fallback to Spotlight hotkey.
6+
if open -Ra "Raycast" >/dev/null 2>&1; then
7+
open -a "Raycast"
8+
elif open -Ra "Alfred 5" >/dev/null 2>&1; then
9+
open -a "Alfred 5"
10+
else
11+
osascript -e 'tell application "System Events" to key code 49 using {command down}'
12+
fi
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env sh
2+
3+
set -eu
4+
5+
target="${1:-east}"
6+
7+
yabai -m window --display "${target}"
8+
yabai -m display --focus "${target}"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env sh
2+
3+
set -eu
4+
5+
target="${1:-next}"
6+
7+
yabai -m window --space "${target}"
8+
yabai -m space --focus "${target}"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/usr/bin/env sh
2+
3+
set -eu
4+
5+
space_type="$(yabai -m query --spaces --space | sed -n 's/.*"type"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n1)"
6+
7+
if [ "${space_type}" = "stack" ]; then
8+
yabai -m space --layout bsp
9+
else
10+
yabai -m space --layout stack
11+
fi
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/usr/bin/env sh
2+
3+
set -eu
4+
5+
space_type="$(yabai -m query --spaces --space | sed -n 's/.*"type"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n1)"
6+
7+
if [ "${space_type}" = "float" ]; then
8+
yabai -m space --layout bsp
9+
else
10+
yabai -m space --layout float
11+
fi

config/yabai/yabairc

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#!/usr/bin/env sh
2+
3+
set -eu
4+
5+
# Pop Shell-like defaults, but for yabai's BSP model.
6+
# Override any of these with env vars before starting yabai.
7+
: "${POP_INITIAL_LAYOUT:=bsp}" # bsp|float
8+
: "${POP_OUTER_GAP:=2}" # Pop Shell default gap-outer is 2
9+
: "${POP_INNER_GAP:=2}" # Pop Shell default gap-inner is 2
10+
: "${POP_MOUSE_FOLLOWS_FOCUS:=on}"
11+
12+
SCRIPT_DIR="$(cd -- "$(dirname -- "$0")" && pwd)"
13+
14+
yabai -m config \
15+
mouse_follows_focus "${POP_MOUSE_FOLLOWS_FOCUS}" \
16+
focus_follows_mouse off \
17+
window_origin_display focused \
18+
window_placement second_child \
19+
window_insertion_point focused \
20+
window_zoom_persist on \
21+
split_ratio 0.50 \
22+
split_type auto \
23+
auto_balance off \
24+
mouse_modifier cmd \
25+
mouse_action1 move \
26+
mouse_action2 resize \
27+
mouse_drop_action stack
28+
29+
# Apply per-space defaults on startup.
30+
"${SCRIPT_DIR}/scripts/apply_space_defaults.sh"
31+
32+
# Keep new spaces aligned with defaults.
33+
yabai -m signal --remove pop_space_defaults >/dev/null 2>&1 || true
34+
yabai -m signal --add label=pop_space_defaults event=space_created \
35+
action="${SCRIPT_DIR}/scripts/apply_space_defaults.sh \"\${YABAI_SPACE_INDEX}\""
36+
37+
# Minimal float rules for macOS utility/dialog apps.
38+
yabai -m rule --remove pop_float_system_settings >/dev/null 2>&1 || true
39+
yabai -m rule --remove pop_float_about_panel >/dev/null 2>&1 || true
40+
yabai -m rule --remove pop_float_calculator >/dev/null 2>&1 || true
41+
yabai -m rule --remove pop_float_archive_utility >/dev/null 2>&1 || true
42+
yabai -m rule --add label=pop_float_system_settings app="^System Settings$" manage=off
43+
yabai -m rule --add label=pop_float_about_panel title="^About .*" manage=off
44+
yabai -m rule --add label=pop_float_calculator app="^Calculator$" manage=off
45+
yabai -m rule --add label=pop_float_archive_utility app="^Archive Utility$" manage=off
46+
47+
# Optional local overrides: ~/.config/yabai/rules.local.sh
48+
if [ -f "${SCRIPT_DIR}/rules.local.sh" ]; then
49+
# shellcheck source=/dev/null
50+
. "${SCRIPT_DIR}/rules.local.sh"
51+
fi
52+
53+
echo "yabai pop-shell profile loaded"

install.conf.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@
7777
path: config/containers/*
7878
~/.config/tealdeer/:
7979
path: config/tealdeer/*
80+
~/.config/yabai/:
81+
path: config/yabai/*
82+
~/.config/skhd/:
83+
path: config/skhd/*
8084
~/Templates:
8185
path: Templates/*
8286

0 commit comments

Comments
 (0)