From 14840838bc727b9ab20be665c8e3a90cdb0eb433 Mon Sep 17 00:00:00 2001 From: Simon Rieger Date: Mon, 28 Aug 2023 21:09:38 +0200 Subject: [PATCH] add yabai and skhd config for macos --- dot_config/skhd/skhdrc | 292 ++++++++++++++++++++++++++++ dot_config/yabai/executable_yabairc | 74 +++++++ 2 files changed, 366 insertions(+) create mode 100644 dot_config/skhd/skhdrc create mode 100644 dot_config/yabai/executable_yabairc diff --git a/dot_config/skhd/skhdrc b/dot_config/skhd/skhdrc new file mode 100644 index 0000000..6855497 --- /dev/null +++ b/dot_config/skhd/skhdrc @@ -0,0 +1,292 @@ +# ################################################################ # +# 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. + +# add an on_enter command to the default mode +# :: default : yabai -m config active_window_border_color 0xff775759 +# +# defines a new mode 'test' with an on_enter command, that captures keypresses +# :: test @ : yabai -m config active_window_border_color 0xff24ccaa +# +# from 'default' mode, activate mode 'test' +# cmd - x ; test +# +# from 'test' mode, activate mode 'default' +# test < cmd - x ; default +# +# launch a new terminal instance when in either 'default' or 'test' mode +# default, test < cmd - return : open -na /Applications/Terminal.app + +# application specific bindings +# +cmd - n [ + "kitty" : echo "hello kitty" + * : echo "hello everyone" + "qutebrowser" : echo "hello qutebrowser" + "terminal" ~ + "finder" : false +] + +# specify a file that should be included as an additional config-file. +# treated as an absolutepath if the filename begins with '/' otherwise +# the file is relative to the path of the config-file it was loaded from. +# +# .load "/Users/Koe/.config/partial_skhdrc" +# .load "partial_skhdrc" + +# prevent skhd from monitoring events for specific applications. +# +# .blacklist [ +# "kitty" +# "terminal" +# "qutebrowser" +# ] + +# open terminal, blazingly fast compared to iTerm/Hyper +cmd - return : /Applications/WezTerm.app/Contents/MacOS/wezterm start --always-new-process + +# open qutebrowser +cmd + shift - return : ~/Scripts/qtb.sh + +# open mpv +cmd - m : open -na /Applications/mpv.app $(pbpaste) + +# ############################################################### # +# THE FOLLOWING SECTION CONTAIN SIMPLE MAPPINGS DEMONSTRATING HOW # +# TO INTERACT WITH THE YABAI WM. THESE ARE SUPPOSED TO BE USED AS # +# A REFERENCE ONLY, WHEN MAKING YOUR OWN CONFIGURATION.. # +# ############################################################### # + +# open mpv with url from clipboard +shift + cmd - m : mpv $(pbpaste) + +# focus window +alt - x : yabai -m window --focus recent +alt - h : yabai -m window --focus west +alt - j : yabai -m window --focus south +alt - k : yabai -m window --focus north +alt - l : yabai -m window --focus east +alt - z : yabai -m window --focus stack.prev +alt - c : yabai -m window --focus stack.next + +# swap window +shift + alt - x : yabai -m window --swap recent +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 + +# balance size of windows +shift + alt - 0 : yabai -m space --balance + +# make floating window fill screen +shift + alt - up : yabai -m window --grid 1:1:0:0:1:1 + +# make floating window fill left-half of screen +shift + alt - left : yabai -m window --grid 1:2:0:0:1:1 + +# make floating window fill right-half of screen +shift + alt - right : yabai -m window --grid 1:2:1:0:1:1 + +# create desktop, move window and follow focus - uses jq for parsing json (brew install jq) +# shift + cmd - n : yabai -m space --create && \ +# index="$(yabai -m query --spaces --display | jq 'map(select(."native-fullscreen" == 0))[-1].index')" && \ +# yabai -m window --space "${index}" && \ +# yabai -m space --focus "${index}" + +# create desktop and follow focus - uses jq for parsing json (brew install jq) +# cmd + alt - n : yabai -m space --create && \ +# index="$(yabai -m query --spaces --display | jq 'map(select(."native-fullscreen" == 0))[-1].index')" && \ +# yabai -m space --focus "${index}" + +# destroy desktop +# cmd + alt - w : yabai -m space --destroy +cmd + alt - w : yabai -m space --focus prev && yabai -m space recent --destroy + +# fast focus desktop +cmd + alt - x : yabai -m space --focus recent +cmd + alt - z : yabai -m space --focus prev || skhd -k "ctrl + alt + cmd - z" +cmd + alt - c : yabai -m space --focus next || skhd -k "ctrl + alt + cmd - c" +cmd + alt - 1 : yabai -m space --focus 1 || skhd -k "ctrl + alt + cmd - 1" +cmd + alt - 2 : yabai -m space --focus 2 || skhd -k "ctrl + alt + cmd - 2" +cmd + alt - 3 : yabai -m space --focus 3 || skhd -k "ctrl + alt + cmd - 3" +cmd + alt - 4 : yabai -m space --focus 4 || skhd -k "ctrl + alt + cmd - 4" +cmd + alt - 5 : yabai -m space --focus 5 || skhd -k "ctrl + alt + cmd - 5" +cmd + alt - 6 : yabai -m space --focus 6 || skhd -k "ctrl + alt + cmd - 6" +cmd + alt - 7 : yabai -m space --focus 7 || skhd -k "ctrl + alt + cmd - 7" +cmd + alt - 8 : yabai -m space --focus 8 || skhd -k "ctrl + alt + cmd - 8" +cmd + alt - 9 : yabai -m space --focus 9 || skhd -k "ctrl + alt + cmd - 9" +cmd + alt - 0 : yabai -m space --focus 10 || skhd -k "ctrl + alt + cmd - 0" + +# send window to desktop and follow focus +shift + cmd - x : yabai -m window --space recent && yabai -m space --focus recent +shift + cmd - z : yabai -m window --space prev && yabai -m space --focus prev +shift + cmd - c : yabai -m window --space next && yabai -m space --focus next +shift + cmd - 1 : yabai -m window --space 1 && yabai -m space --focus 1 +shift + cmd - 2 : yabai -m window --space 2 && yabai -m space --focus 2 +shift + cmd - 3 : yabai -m window --space 3 && yabai -m space --focus 3 +shift + cmd - 4 : yabai -m window --space 4 && yabai -m space --focus 4 +shift + cmd - 5 : yabai -m window --space 5 && yabai -m space --focus 5 +shift + cmd - 6 : yabai -m window --space 6 && yabai -m space --focus 6 +shift + cmd - 7 : yabai -m window --space 7 && yabai -m space --focus 7 +shift + cmd - 8 : yabai -m window --space 8 && yabai -m space --focus 8 +shift + cmd - 9 : yabai -m window --space 9 && yabai -m space --focus 9 +shift + cmd - 0 : yabai -m window --space 10 && yabai -m space --focus 10 + +# focus monitor +ctrl + alt - x : yabai -m display --focus recent +ctrl + alt - z : yabai -m display --focus prev +ctrl + alt - c : yabai -m display --focus next +ctrl + alt - 1 : yabai -m display --focus 1 +ctrl + alt - 2 : yabai -m display --focus 2 +ctrl + alt - 3 : yabai -m display --focus 3 + +# send window to monitor and follow focus +ctrl + cmd - x : yabai -m window --display recent && yabai -m display --focus recent +ctrl + cmd - z : yabai -m window --display prev && yabai -m display --focus prev +ctrl + cmd - c : yabai -m window --display next && yabai -m display --focus next +ctrl + cmd - 1 : yabai -m window --display 1 && yabai -m display --focus 1 +ctrl + cmd - 2 : yabai -m window --display 2 && yabai -m display --focus 2 +ctrl + cmd - 3 : yabai -m window --display 3 && yabai -m display --focus 3 + +# 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 + +# set insertion point in focused container +ctrl + alt - h : yabai -m window --insert west +ctrl + alt - j : yabai -m window --insert south +ctrl + alt - k : yabai -m window --insert north +ctrl + alt - l : yabai -m window --insert east +ctrl + alt - i : yabai -m window --insert stack + +# 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 --toggle gap + +# toggle window parent zoom +alt - d : yabai -m window --toggle zoom-parent + +# toggle window fullscreen zoom +alt - f : yabai -m window --toggle zoom-fullscreen + +# toggle window native fullscreen +shift + alt - f : yabai -m window --toggle native-fullscreen + +# toggle window split type +alt - e : yabai -m window --toggle split + +# float / unfloat window and restore position +# alt - t : yabai -m window --toggle float && /tmp/yabai-restore/$(yabai -m query --windows --window | jq -re '.id').restore 2>/dev/null || true +alt - t : yabai -m window --toggle float --grid 4:4:1:1:2:2 + +# toggle sticky (show on all spaces) +alt - s : yabai -m window --toggle sticky + +# toggle topmost (keep above other windows) +alt - o : yabai -m window --toggle topmost + +# toggle picture-in-picture +alt - p : yabai -m window --toggle border --toggle pip + +# change layout of desktop +ctrl + alt - a : yabai -m space --layout bsp +ctrl + alt - d : yabai -m space --layout float +ctrl + alt - s : yabai -m space --layout $(yabai -m query --spaces --space | jq -r 'if .type == "bsp" then "float" else "bsp" end') + diff --git a/dot_config/yabai/executable_yabairc b/dot_config/yabai/executable_yabairc new file mode 100644 index 0000000..d2a75be --- /dev/null +++ b/dot_config/yabai/executable_yabairc @@ -0,0 +1,74 @@ +#!/usr/bin/env sh + +# necessary to load scripting-addition during startup on macOS Big Sur +# *yabai --load-sa* is configured to run through sudo without a password +sudo yabai --load-sa +yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa" + +# mission-control desktop labels +yabai -m space 1 --label code +yabai -m space 2 --label mail +yabai -m space 3 --label web +yabai -m space 4 --label notes +yabai -m space 5 --label re +yabai -m space 6 --label media +yabai -m space 7 --label social +yabai -m space 8 --label games + +# window rules +yabai -m rule --add app="^Mail$" space=mail +yabai -m rule --add app="^Safari$" space=web +yabai -m rule --add app="^Notes$" space=notes +yabai -m rule --add app="^ida64$" space=re +yabai -m rule --add app="^Transmission$" space=media +yabai -m rule --add app="^Spotify$" space=media +yabai -m rule --add app="^Discord$" space=social grid=1:1:0:0:1:1 manage=off +yabai -m rule --add app="^Steam$" space=games manage=off +yabai -m rule --add app="^(Calculator|System Preferences|Archive Utility)$" manage=off +yabai -m rule --add app="^mpv$" manage=off border=off sticky=on layer=above opacity=1.0 grid=8:8:6:0:2:2 + +# signals +yabai -m signal --add event=window_destroyed active=yes action="yabai -m query --windows --window &> /dev/null || yabai -m window --focus mouse &> /dev/null || yabai -m window --focus \$(yabai -m query --windows --space | jq .[0].id) &> /dev/null" +yabai -m signal --add event=window_minimized active=yes action="if \$(yabai -m query --windows --window \$YABAI_WINDOW_ID | jq -r '.\"is-floating\"'); then yabai -m query --windows --window &> /dev/null || yabai -m window --focus mouse &> /dev/null || yabai -m window --focus \$(yabai -m query --windows --space | jq .[0].id) &> /dev/null; fi" + +# specific space settings +yabai -m config --space mail layout stack +yabai -m config --space games layout float + +# global settings +yabai -m config \ + external_bar off:41:0 \ + mouse_follows_focus on \ + focus_follows_mouse autoraise \ + window_placement second_child \ + window_topmost off \ + window_shadow off \ + window_animation_duration 0.25 \ + window_opacity_duration 0.25 \ + active_window_opacity 0.90 \ + normal_window_opacity 0.50 \ + window_opacity on \ + insert_feedback_color 0xaad75f5f \ + active_window_border_color 0xBF775759 \ + normal_window_border_color 0x7f353535 \ + window_border_width 4 \ + window_border_radius 12 \ + window_border_blur on \ + window_border_hidpi on \ + window_border on \ + split_ratio 0.50 \ + split_type auto \ + auto_balance off \ + top_padding 10 \ + left_padding 10 \ + right_padding 10 \ + bottom_padding 10 \ + window_gap 10 \ + layout bsp \ + mouse_modifier fn \ + mouse_action1 move \ + mouse_action2 resize \ + mouse_drop_action swap + +echo "yabai configuration loaded.." +