From c7c80c81409faf0402047c7af63bca8812c14199 Mon Sep 17 00:00:00 2001 From: Drew Haven Date: Mon, 10 Feb 2025 10:34:24 -0800 Subject: [PATCH] [MacOS] Adds Yabai and Skhd --- home-manager/features/macos/config/skhdrc | 176 +++++++++++++++++++++ home-manager/features/macos/config/yabairc | 45 ++++++ home-manager/features/macos/default.nix | 10 ++ system/hosts/tarro-mbp/drew.nix | 1 + 4 files changed, 232 insertions(+) create mode 100755 home-manager/features/macos/config/skhdrc create mode 100755 home-manager/features/macos/config/yabairc create mode 100644 home-manager/features/macos/default.nix diff --git a/home-manager/features/macos/config/skhdrc b/home-manager/features/macos/config/skhdrc new file mode 100755 index 0000000..74b8dc3 --- /dev/null +++ b/home-manager/features/macos/config/skhdrc @@ -0,0 +1,176 @@ +# ################################################################ # +# THE FOLLOWING IS AN EXPLANATION OF THE GRAMMAR THAT SKHD PARSES. # +# FOR SIMPLE EXAMPLE MAPPINGS LOOK FURTHER DOWN THIS FILE.. # +# ################################################################ # + +# A list of all built-in modifier and literal keywords can +# be found at https://github.com/koekeishiya/skhd/issues/1 +# +# A hotkey is written according to the following rules: +# +# hotkey = '<' | +# +# mode = 'name of mode' | ',' +# +# action = '[' ']' | '->' '[' ']' +# ':' | '->' ':' +# ';' | '->' ';' +# +# keysym = '-' | +# +# mod = 'modifier keyword' | '+' +# +# key = | +# +# literal = 'single letter or built-in keyword' +# +# keycode = 'apple keyboard kVK_ values (0x3C)' +# +# proc_map_lst = * +# +# proc_map = ':' | '~' | +# '*' ':' | '*' '~' +# +# string = '"' 'sequence of characters' '"' +# +# command = command is executed through '$SHELL -c' and +# follows valid shell syntax. if the $SHELL environment +# variable is not set, it will default to '/bin/bash'. +# when bash is used, the ';' delimeter can be specified +# to chain commands. +# +# to allow a command to extend into multiple lines, +# prepend '\' at the end of the previous line. +# +# an EOL character signifies the end of the bind. +# +# -> = keypress is not consumed by skhd +# +# * = matches every application not specified in +# +# ~ = application is unbound and keypress is forwarded per usual, when specified in a +# +# A mode is declared according to the following rules: +# +# mode_decl = '::' '@' ':' | '::' ':' | +# '::' '@' | '::' +# +# name = desired name for this mode, +# +# @ = capture keypresses regardless of being bound to an action +# +# command = command is executed through '$SHELL -c' and +# follows valid shell syntax. if the $SHELL environment +# variable is not set, it will default to '/bin/bash'. +# when bash is used, the ';' delimeter can be specified +# to chain commands. +# +# to allow a command to extend into multiple lines, +# prepend '\' at the end of the previous line. +# +# an EOL character signifies the end of the bind. + +############# +# Launchers # +############# + +cmd + alt - t : open -na "alacritty" +cmd + alt - b : open -na "Google Chrome" --args --new-window + +######### +# Yabai # +######### + +# focus window +cmd + alt - right : /opt/homebrew/bin/yabai -m window --focus east +cmd + alt - left : /opt/homebrew/bin/yabai -m window --focus west +cmd + alt - up : /opt/homebrew/bin/yabai -m window --focus north +cmd + alt - down : /opt/homebrew/bin/yabai -m window --focus south +# These are 7 and 8 because that's what the keyboard layout has there in window mode. +cmd + alt - 7 : /opt/homebrew/bin/yabai -m window --focus stack.next +cmd + alt - 8 : /opt/homebrew/bin/yabai -m window --focus stack.prev + +# swap managed window +# shift + alt - h : /opt/homebrew/bin/yabai -m window --swap north + +# move managed window +shift + cmd + alt - right : /opt/homebrew/bin/yabai -m window --warp east +shift + cmd + alt - left : /opt/homebrew/bin/yabai -m window --warp west +shift + cmd + alt - up : /opt/homebrew/bin/yabai -m window --warp north +shift + cmd + alt - down : /opt/homebrew/bin/yabai -m window --warp south +# These are 7 and 8 because that's what the keyboard layout has there in window mode. +shift + cmd + alt - 7 : /opt/homebrew/bin/yabai -m window --stack next +shift + cmd + alt - 8 : /opt/homebrew/bin/yabai -m window --stack prev + +# balance size of windows +shift + alt - i : /opt/homebrew/bin/yabai -m space --balance + +# make floating window fill screen +# shift + alt - up : /opt/homebrew/bin/yabai -m window --grid 1:1:0:0:1:1 + +# make floating window fill left-half of screen +# shift + alt - left : /opt/homebrew/bin/yabai -m window --grid 1:2:0:0:1:1 + +# create desktop, move window and follow focus - uses jq for parsing json (brew install jq) +# shift + cmd - n : /opt/homebrew/bin/yabai -m space --create && \ +# index="$(/opt/homebrew/bin/yabai -m query --spaces --display | jq 'map(select(."is-native-fullscreen" == false))[-1].index')" && \ +# /opt/homebrew/bin/yabai -m window --space "${index}" && \ +# /opt/homebrew/bin/yabai -m space --focus "${index}" + +# fast focus desktop +# cmd + alt - x : /opt/homebrew/bin/yabai -m space --focus recent +# cmd + alt - 1 : /opt/homebrew/bin/yabai -m space --focus 1 +# cmd + alt - 2 : /opt/homebrew/bin/yabai -m space --focus 2 +# cmd + alt - 3 : /opt/homebrew/bin/yabai -m space --focus 3 +# cmd + alt - 4 : /opt/homebrew/bin/yabai -m space --focus 4 +# cmd + alt - 5 : /opt/homebrew/bin/yabai -m space --focus 5 + +# send window to desktop and follow focus +# shift + cmd - z : /opt/homebrew/bin/yabai -m window --space next; yabai -m space --focus next +# shift + cmd - 5 : /opt/homebrew/bin/yabai -m window --space 2; yabai -m space --focus 2 +shift + cmd + alt - 1 : /opt/homebrew/bin/yabai -m window --space 1; yabai -m space --focus 1 +shift + cmd + alt - 2 : /opt/homebrew/bin/yabai -m window --space 2; yabai -m space --focus 2 +shift + cmd + alt - 3 : /opt/homebrew/bin/yabai -m window --space 3; yabai -m space --focus 3 +shift + cmd + alt - 4 : /opt/homebrew/bin/yabai -m window --space 4; yabai -m space --focus 4 +shift + cmd + alt - 5 : /opt/homebrew/bin/yabai -m window --space 5; yabai -m space --focus 5 + +# focus monitor +# ctrl + alt - z : /opt/homebrew/bin/yabai -m display --focus prev +# ctrl + alt - 3 : /opt/homebrew/bin/yabai -m display --focus 3 + +# send window to monitor and follow focus +# ctrl + cmd - c : /opt/homebrew/bin/yabai -m window --display next; yabai -m display --focus next +# ctrl + cmd - 1 : /opt/homebrew/bin/yabai -m window --display 1; yabai -m display --focus 1 + +# move floating window +# shift + ctrl - a : /opt/homebrew/bin/yabai -m window --move rel:-20:0 +# shift + ctrl - s : /opt/homebrew/bin/yabai -m window --move rel:0:20 + +# increase window size +# shift + alt - a : /opt/homebrew/bin/yabai -m window --resize left:-20:0 +# shift + alt - w : /opt/homebrew/bin/yabai -m window --resize top:0:-20 +cmd + alt - 9 : /opt/homebrew/bin/yabai -m window --resize right:20:0 +cmd + alt - 8 : /opt/homebrew/bin/yabai -m window --resize bottom:20:0 +cmd + alt - 7 : /opt/homebrew/bin/yabai -m window --resize top:-20:0 +cmd + alt - 6 : /opt/homebrew/bin/yabai -m window --resize left:-20:0 + +# decrease window size +# shift + cmd - s : /opt/homebrew/bin/yabai -m window --resize bottom:0:-20 +# shift + cmd - w : /opt/homebrew/bin/yabai -m window --resize top:0:20 + +# set insertion point in focused container +# ctrl + alt - h : /opt/homebrew/bin/yabai -m window --insert west + +# toggle window zoom +# alt - d : /opt/homebrew/bin/yabai -m window --toggle zoom-parent +# alt - f : /opt/homebrew/bin/yabai -m window --toggle zoom-fullscreen + +# toggle window split type +# alt - e : /opt/homebrew/bin/yabai -m window --toggle split +cmd + alt - o : /opt/homebrew/bin/yabai -m window --toggle split + +# float / unfloat window and center on screen +cmd + alt - f : /opt/homebrew/bin/yabai -m window --toggle float --grid 4:4:1:1:2:2 + +# toggle sticky(+float), picture-in-picture +# alt - p : /opt/homebrew/bin/yabai -m window --toggle sticky --toggle pip diff --git a/home-manager/features/macos/config/yabairc b/home-manager/features/macos/config/yabairc new file mode 100755 index 0000000..a73349f --- /dev/null +++ b/home-manager/features/macos/config/yabairc @@ -0,0 +1,45 @@ +#!/usr/bin/env sh + +# +# for this to work you must configure sudo such that +# it will be able to run the command without password +# +# see this wiki page for information: +# - https://github.com/koekeishiya/yabai/wiki/Installing-yabai-(latest-release)#configure-scripting-addition +# +yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa" +sudo yabai --load-sa + +# global settings +yabai -m config \ + external_bar all:40:0 \ + menubar_opacity 1.0 \ + mouse_follows_focus off \ + focus_follows_mouse off \ + display_arrangement_order default \ + window_origin_display default \ + window_placement second_child \ + window_zoom_persist on \ + window_shadow on \ + window_animation_duration 0.0 \ + window_animation_easing ease_out_circ \ + window_opacity_duration 0.0 \ + active_window_opacity 1.0 \ + normal_window_opacity 0.90 \ + window_opacity off \ + insert_feedback_color 0xffd75f5f \ + split_ratio 0.50 \ + split_type auto \ + auto_balance off \ + top_padding 12 \ + bottom_padding 12 \ + left_padding 12 \ + right_padding 12 \ + window_gap 06 \ + layout bsp \ + mouse_modifier fn \ + mouse_action1 move \ + mouse_action2 resize \ + mouse_drop_action swap + +echo "yabai configuration loaded.." diff --git a/home-manager/features/macos/default.nix b/home-manager/features/macos/default.nix new file mode 100644 index 0000000..4cd4c78 --- /dev/null +++ b/home-manager/features/macos/default.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + yabai + skhd + ]; + + home.file.".yabairc".source = ./config/yabairc; + home.file.".skhdrc".source = ./config/skhdrc; +} diff --git a/system/hosts/tarro-mbp/drew.nix b/system/hosts/tarro-mbp/drew.nix index 7a2bb61..20eca91 100644 --- a/system/hosts/tarro-mbp/drew.nix +++ b/system/hosts/tarro-mbp/drew.nix @@ -4,6 +4,7 @@ ../../../home-manager/features/shell.nix ../../../home-manager/features/terminal.nix ../../../home-manager/features/neovim.nix + ../../../home-manager/features/macos ]; home.username = "drew";