diff --git a/.gitignore b/.gitignore index 7700b81..eae885e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ result-* # Uncomment if you don't want to commit it: # nixos/hardware-configuration.nix +reference/ \ No newline at end of file diff --git a/darwin/configuration.nix b/darwin/configuration.nix index 75f2be8..4bbcedd 100644 --- a/darwin/configuration.nix +++ b/darwin/configuration.nix @@ -12,9 +12,6 @@ # Shared configuration between NixOS and nix-darwin ../common.nix - # skhd hotkey daemon (system service) - ./skhd.nix - # If you want to use modules your own flake exports (from modules/darwin): # inputs.self.darwinModules.example diff --git a/darwin/skhd.nix b/darwin/skhd.nix deleted file mode 100644 index dae5e41..0000000 --- a/darwin/skhd.nix +++ /dev/null @@ -1,111 +0,0 @@ -# Simple Hotkey Daemon configuration for nix-darwin -{ - config, - lib, - pkgs, - ... -}: let - super = "lalt"; -in { - services.skhd = { - enable = true; - package = pkgs.skhd; - skhdConfig = '' - ## Navigation (${super} - ...) - # Space Navigation (four spaces per display): ${super} - {1, 2, 3, 4} - ${super} - 1 : yabai -m space --focus 1 - ${super} - 2 : yabai -m space --focus 2 - ${super} - 3 : yabai -m space --focus 3 - ${super} - 4 : yabai -m space --focus 4 - ${super} - 5 : yabai -m space --focus 5 - ${super} - 6 : yabai -m space --focus 6 - ${super} - 7 : yabai -m space --focus 7 - ${super} - 8 : yabai -m space --focus 8 - ${super} - 9 : yabai -m space --focus 9 - ${super} - 0 : yabai -m space --focus 0 - - # Window Navigation (through display borders): ${super} - {h, j, k, l} - ${super} - h : yabai -m window --focus west || yabai -m display --focus west - ${super} - j : yabai -m window --focus south || yabai -m display --focus south - ${super} - k : yabai -m window --focus north || yabai -m display --focus north - ${super} - l : yabai -m window --focus east || yabai -m display --focus east - - # Float / Unfloat window: ${super} - space - # ${super} - space : yabai -m window --toggle float; sketchybar --trigger window_focus - - # Make window zoom to fullscreen: shift + ${super} - f - shift + ${super} - f : yabai -m window --toggle zoom-fullscreen; sketchybar --trigger window_focus - - # Make window zoom to parent node: ${super} - f - ${super} - f : yabai -m window --toggle zoom-parent; sketchybar --trigger window_focus - - ## Window Movement (shift + ${super} - ...) - # Moving windows in spaces: shift + ${super} - {h, j, k, l} - shift + ${super} - h : yabai -m window --warp west || $(yabai -m window --display west && sketchybar --trigger windows_on_spaces && yabai -m display --focus west && yabai -m window --warp last) || yabai -m window --move rel:-10:0 - shift + ${super} - j : yabai -m window --warp south || $(yabai -m window --display south && sketchybar --trigger windows_on_spaces && yabai -m display --focus south) || yabai -m window --move rel:0:10 - shift + ${super} - k : yabai -m window --warp north || $(yabai -m window --display north && sketchybar --trigger windows_on_spaces && yabai -m display --focus north) || yabai -m window --move rel:0:-10 - shift + ${super} - l : yabai -m window --warp east || $(yabai -m window --display east && sketchybar --trigger windows_on_spaces && yabai -m display --focus east && yabai -m window --warp first) || yabai -m window --move rel:10:0 - - # Toggle split orientation of the selected windows node: shift + ${super} - s - shift + ${super} - s : yabai -m window --toggle split - - # Moving windows between spaces: shift + ${super} - {1, 2, 3, 4, p, n } (Assumes 4 Spaces Max per Display) - shift + ${super} - 1 : DISPLAY="$(yabai -m query --displays --display | jq '.index')";\ - yabai -m window --space $((1+4*($DISPLAY - 1)));\ - sketchybar --trigger windows_on_spaces - - shift + ${super} - 2 : DISPLAY="$(yabai -m query --displays --display | jq '.index')";\ - yabai -m window --space $((2+4*($DISPLAY - 1)));\ - sketchybar --trigger windows_on_spaces - - shift + ${super} - 3 : DISPLAY="$(yabai -m query --displays --display | jq '.index')";\ - yabai -m window --space $((3+4*($DISPLAY - 1)));\ - sketchybar --trigger windows_on_spaces - - shift + ${super} - 4 : DISPLAY="$(yabai -m query --displays --display | jq '.index')";\ - yabai -m window --space $((4+4*($DISPLAY - 1)));\ - sketchybar --trigger windows_on_spaces - - shift + ${super} - p : yabai -m window --space prev; yabai -m space --focus prev; sketchybar --trigger windows_on_spaces - shift + ${super} - n : yabai -m window --space next; yabai -m space --focus next; sketchybar --trigger windows_on_spaces - - # Mirror Space on X and Y Axis: shift + ${super} - {x, y} - shift + ${super} - x : yabai -m space --mirror x-axis - shift + ${super} - y : yabai -m space --mirror y-axis - - ## Stacks (shift + ctrl - ...) - # Add the active window to the window or stack to the {direction}: shift + ctrl - {h, j, k, l} - shift + ctrl - h : yabai -m window west --stack $(yabai -m query --windows --window | jq -r '.id'); sketchybar --trigger window_focus - shift + ctrl - j : yabai -m window south --stack $(yabai -m query --windows --window | jq -r '.id'); sketchybar --trigger window_focus - shift + ctrl - k : yabai -m window north --stack $(yabai -m query --windows --window | jq -r '.id'); sketchybar --trigger window_focus - shift + ctrl - l : yabai -m window east --stack $(yabai -m query --windows --window | jq -r '.id'); sketchybar --trigger window_focus - - # Stack Navigation: shift + ctrl - {n, p} - shift + ctrl - n : yabai -m window --focus stack.next - shift + ctrl - p : yabai -m window --focus stack.prev - - ## Resize (ctrl + ${super} - ...) - # Resize windows: ctrl + ${super} - {h, j, k, l} - ctrl + ${super} - h : yabai -m window --resize right:-100:0 || yabai -m window --resize left:-100:0 - ctrl + ${super} - j : yabai -m window --resize bottom:0:100 || yabai -m window --resize top:0:100 - ctrl + ${super} - k : yabai -m window --resize bottom:0:-100 || yabai -m window --resize top:0:-100 - ctrl + ${super} - l : yabai -m window --resize right:100:0 || yabai -m window --resize left:100:0 - - # Equalize size of windows: ctrl + ${super} - e - ctrl + ${super} - e : yabai -m space --balance - - # Enable / Disable gaps in current workspace: ctrl + ${super} - g - ctrl + ${super} - g : yabai -m space --toggle padding; yabai -m space --toggle gap - - # Enable / Disable window borders in current workspace: ctrl + ${super} - b - ctrl + ${super} - b : yabai -m config window_border off - shift + ctrl + ${super} - b : yabai -m config window_border on - - ## Misc - # Open new Kitty window - ${super} - return : kitty - # Bring Kitty window to current space - ${super} - o : yabai -m window $(yabai -m query --windows | jq '.[] | select(.app==".kitty-wrapped") | .id') --space $(yabai -m query --spaces | jq '.[] | select(.has-focus==1) .id') - ''; - }; -} diff --git a/home-manager/home.nix b/home-manager/home.nix index e3ff1d4..1b62111 100644 --- a/home-manager/home.nix +++ b/home-manager/home.nix @@ -25,7 +25,7 @@ ./modules/kitty.nix ./modules/neovim.nix ./modules/tmux.nix - # skhd is a darwin system service, configured in darwin/skhd.nix + ./modules/skhd.nix ./modules/yabai.nix # Doom Emacs via nix-doom-emacs-unstraightened diff --git a/home-manager/modules/fish.md b/home-manager/modules/fish.md new file mode 100644 index 0000000..92c66d7 --- /dev/null +++ b/home-manager/modules/fish.md @@ -0,0 +1,62 @@ +# Fish Plugins Available in Nixpkgs + +## Directory Navigation +- **z** - Pure-fish z directory jumping +- **fish-bd** - Fish plugin to quickly go back to a parent directory up in your current working directory tree + +## Prompts & Themes +- **tide** - Ultimate Fish prompt +- **pure** - Pretty, minimal and fast Fish prompt, ported from zsh +- **hydro** - Ultra-pure, lag-free prompt with async Git status +- **bobthefish** - Powerline-style, Git-aware fish theme optimized for awesome +- **bobthefisher** - Powerline-style, Git-aware fish theme optimized for awesome (fork of bobthefish) +- **transient-fish** - Fish plugin to enable a transient prompt +- **gruvbox** - Gruvbox theme for fish shell +- **async-prompt** - Make your prompt asynchronous to improve the reactivity + +## Fuzzy Finding & Search +- **fzf-fish** - Augment your fish command line with fzf key bindings +- **fzf** - Ef-fish-ient fish keybindings for fzf +- **fifc** - Fzf powers on top of fish completion engine and allows customizable completion rules + +## Git Integration +- **forgit** - Utility tool powered by fzf for using git interactively +- **plugin-git** - Git plugin for fish (similar to oh-my-zsh git) +- **git-abbr** - Abbreviations for git for the fish shell 🐟 + +## Quality of Life +- **autopair** - Auto-complete matching pairs in the Fish command line +- **done** - Automatically receive notifications when long processes finish +- **sponge** - Keeps your fish shell history clean from typos, incorrectly used commands and everything you don't want to store due to privacy reasons +- **puffer** - Text Expansions for Fish +- **colored-man-pages** - Fish shell plugin to colorize man pages +- **pisces** - Paired symbols in the command line +- **spark** - Sparklines for Fish +- **humantime-fish** - Turn milliseconds into a human-readable string in Fish + +## Shell Compatibility & Utilities +- **bass** - Fish function making it easy to use utilities written for Bash in Fish shell +- **foreign-env** - Foreign environment interface for Fish shell +- **grc** - Grc Colourizer for some commands on Fish shell +- **plugin-sudope** - Fish plugin to quickly put 'sudo' in your command +- **fishbang** - Bash bang commands for fish +- **bang-bang** - Bash style history substitution for Oh My Fish + +## Development Tools +- **nvm** - Node.js version manager you'll adore, crafted just for Fish +- **sdkman-for-fish** - Adds support for SDKMAN! to fish +- **github-copilot-cli-fish** - GitHub Copilot CLI aliases for Fish Shell +- **exercism-cli-fish-wrapper** - Fish wrapper for the Exercism CLI +- **aws** - Completions and integrations with the AWS CLI + +## Testing & Development +- **fishtape** - TAP-based test runner for Fish +- **fishtape_3** - 100% pure-Fish test runner +- **clownfish** - Fish function to mock the behaviour of commands + +## Productivity & Monitoring +- **wakatime-fish** - Fish plugin for wakatime +- **fish-you-should-use** - Fish plugin that reminds you to use your aliases + +## Platform-Specific +- **macos** - MacOS functions for Fish diff --git a/home-manager/modules/fish.nix b/home-manager/modules/fish.nix index 1f00345..8819821 100644 --- a/home-manager/modules/fish.nix +++ b/home-manager/modules/fish.nix @@ -10,186 +10,6 @@ programs.fish = { enable = true; - # ═══════════════════════════════════════════════════════════════════════════ - # SHELL ALIASES - # ═══════════════════════════════════════════════════════════════════════════ - shellAliases = { - # Navigation - ".." = "cd .."; - "..." = "cd ../.."; - "...." = "cd ../../.."; - "....." = "cd ../../../.."; - - # Listings (eza integration handled by programs.eza) - ll = "ls -la"; - la = "ls -a"; - lt = "ls --tree"; - - # Git shortcuts - gs = "git status"; - gd = "git diff"; - gds = "git diff --staged"; - ga = "git add"; - gc = "git commit"; - gp = "git push"; - gl = "git pull"; - glog = "git log --oneline --graph --decorate"; - gco = "git checkout"; - gb = "git branch"; - - # Nix shortcuts - nix-gc = "nix-collect-garbage -d"; - nix-search = "nix search nixpkgs"; - nrs = "sudo nixos-rebuild switch --flake ."; - drs = "darwin-rebuild switch --flake ."; - hms = "home-manager switch --flake ."; - - # Safety nets - rm = "rm -i"; - cp = "cp -i"; - mv = "mv -i"; - - # Modern replacements (when available) - cat = "bat --paging=never"; - grep = "rg"; - find = "fd"; - - # Misc - c = "clear"; - q = "exit"; - h = "history"; - j = "jobs -l"; - path = "echo $PATH | tr ':' '\\n'"; - week = "date +%V"; - myip = "curl -s https://ipinfo.io/ip"; - }; - - # ═══════════════════════════════════════════════════════════════════════════ - # SHELL ABBREVIATIONS (expand as you type, more powerful than aliases) - # ═══════════════════════════════════════════════════════════════════════════ - shellAbbrs = { - # Git abbreviations (expand to full commands) - gst = "git status"; - gaa = "git add --all"; - gcm = "git commit -m"; - gca = "git commit --amend"; - gcan = "git commit --amend --no-edit"; - gpf = "git push --force-with-lease"; - grb = "git rebase"; - grbi = "git rebase -i"; - gsta = "git stash"; - gstp = "git stash pop"; - - # Docker - dps = "docker ps"; - dpa = "docker ps -a"; - di = "docker images"; - dcu = "docker-compose up"; - dcd = "docker-compose down"; - - # Kubernetes - k = "kubectl"; - kg = "kubectl get"; - kd = "kubectl describe"; - kl = "kubectl logs"; - kx = "kubectl exec -it"; - }; - - # ═══════════════════════════════════════════════════════════════════════════ - # CUSTOM FUNCTIONS - # ═══════════════════════════════════════════════════════════════════════════ - functions = { - # Create directory and cd into it - mkcd = "mkdir -p $argv[1]; and cd $argv[1]"; - - # Quick extract - handles multiple archive formats - extract = '' - if test -f $argv[1] - switch $argv[1] - case '*.tar.bz2' - tar xjf $argv[1] - case '*.tar.gz' - tar xzf $argv[1] - case '*.tar.xz' - tar xJf $argv[1] - case '*.bz2' - bunzip2 $argv[1] - case '*.rar' - unrar x $argv[1] - case '*.gz' - gunzip $argv[1] - case '*.tar' - tar xf $argv[1] - case '*.tbz2' - tar xjf $argv[1] - case '*.tgz' - tar xzf $argv[1] - case '*.zip' - unzip $argv[1] - case '*.Z' - uncompress $argv[1] - case '*.7z' - 7z x $argv[1] - case '*' - echo "'$argv[1]' cannot be extracted via extract()" - end - else - echo "'$argv[1]' is not a valid file" - end - ''; - - # Git clone and cd - gcl = '' - git clone $argv[1] - cd (basename $argv[1] .git) - ''; - - # Quick backup file - bak = "cp $argv[1] $argv[1].bak.(date +%Y%m%d_%H%M%S)"; - - # Find process by name - psg = "ps aux | grep -v grep | grep -i $argv[1]"; - - # Quick HTTP server - serve = '' - set port (test -n "$argv[1]"; and echo $argv[1]; or echo 8000) - echo "Serving on http://localhost:$port" - python3 -m http.server $port - ''; - - # Weather - weather = '' - set location (test -n "$argv[1]"; and echo $argv[1]; or echo "") - curl -s "wttr.in/$location?format=3" - ''; - - # Quick nix shell - nsh = "nix-shell -p $argv"; - - # Reload fish config - reload = "source ~/.config/fish/config.fish; echo 'Fish config reloaded!'"; - - # Show path entries one per line - pathlist = "echo $PATH | tr ':' '\\n' | nl"; - - # Create a quick note - note = '' - set note_dir "$HOME/notes" - mkdir -p $note_dir - set note_file "$note_dir/(date +%Y-%m-%d).md" - if test -n "$argv" - echo "- (date +%H:%M) $argv" >> $note_file - echo "Note added to $note_file" - else - $EDITOR $note_file - end - ''; - - # Show disk usage for current directory, sorted - duf = "du -sh * 2>/dev/null | sort -h"; - - - }; # ═══════════════════════════════════════════════════════════════════════════ # PLUGINS - Curated selection for productivity @@ -202,7 +22,7 @@ # ── Fuzzy Finding ───────────────────────────────────────────────────────── # fzf-fish: Superior fzf integration - Ctrl+R history, Ctrl+Alt+F files, Ctrl+V vars { - name = "fuck.fzf.fish"; + name = "fzf.fish"; src = pkgs.fetchFromGitHub { owner = "PatrickF1"; repo = "fzf.fish"; @@ -252,6 +72,9 @@ # INTERACTIVE SHELL INITIALIZATION # ═══════════════════════════════════════════════════════════════════════════ interactiveShellInit = '' + # Set up fzf.fish key bindings (Ctrl+R history, Ctrl+Alt+F files, etc.) + fzf_configure_bindings + echo "🐟 "(set_color cyan)(whoami)(set_color normal)" @ "(set_color yellow)(hostname -s)(set_color normal)" in "(set_color green)(prompt_pwd)(set_color normal) ''; diff --git a/home-manager/modules/packages.nix b/home-manager/modules/packages.nix index 1431597..0dde054 100644 --- a/home-manager/modules/packages.nix +++ b/home-manager/modules/packages.nix @@ -148,5 +148,6 @@ in { # progs zstd + bun ]; } diff --git a/home-manager/modules/shells.nix b/home-manager/modules/shells.nix index 5980800..4818a4c 100644 --- a/home-manager/modules/shells.nix +++ b/home-manager/modules/shells.nix @@ -77,7 +77,7 @@ enable = true; enableBashIntegration = true; enableZshIntegration = true; - enableFishIntegration = true; + enableFishIntegration = false; # Using PatrickF1/fzf.fish plugin instead }; # Eza (modern ls replacement) diff --git a/home-manager/modules/skhd.nix b/home-manager/modules/skhd.nix index b26218f..6c65afb 100644 --- a/home-manager/modules/skhd.nix +++ b/home-manager/modules/skhd.nix @@ -1,54 +1,16 @@ # skhd (Simple Hotkey Daemon) configuration for macOS -# Uses home-manager's launchd.agents for service management +# Uses upstream home-manager's services.skhd module { config, lib, pkgs, ... }: let - cfg = config.services.skhd; super = "lalt"; -in { - options.services.skhd = { - enable = lib.mkEnableOption "skhd hotkey daemon"; - - package = lib.mkPackageOption pkgs "skhd" {}; - - config = lib.mkOption { - type = with lib.types; nullOr lines; - default = null; - description = "Contents of skhdrc configuration file."; - }; - }; - - config = lib.mkIf cfg.enable { - assertions = [ - { - assertion = pkgs.stdenv.isDarwin; - message = "services.skhd is only available on macOS"; - } - ]; - - home.packages = [cfg.package]; - - launchd.agents.skhd = { - enable = true; - config = { - ProgramArguments = ["${cfg.package}/bin/skhd"]; - ProcessType = "Interactive"; - KeepAlive = true; - RunAtLoad = true; - StandardErrorPath = "${config.home.homeDirectory}/Library/Logs/skhd/skhd.err.log"; - StandardOutPath = "${config.home.homeDirectory}/Library/Logs/skhd/skhd.out.log"; - }; - }; - - xdg.configFile."skhd/skhdrc" = lib.mkIf (cfg.config != null) { - text = cfg.config; - }; - - # Default skhd configuration for yabai integration - services.skhd.config = lib.mkDefault '' +in lib.mkIf pkgs.stdenv.isDarwin { + services.skhd = { + enable = true; + config = '' ## Navigation (${super} - ...) # Space Navigation (four spaces per display): ${super} - {1, 2, 3, 4} ${super} - 1 : yabai -m space --focus 1 diff --git a/home-manager/modules/yabai.nix b/home-manager/modules/yabai.nix index 5056efd..5ea25ec 100644 --- a/home-manager/modules/yabai.nix +++ b/home-manager/modules/yabai.nix @@ -37,16 +37,41 @@ # mouse yabai -m config mouse_follows_focus off yabai -m config focus_follows_mouse off - yabai -m config mouse_modifier cmd + yabai -m config mouse_modifier option yabai -m config mouse_action1 move yabai -m config mouse_action2 resize yabai -m config mouse_drop_action swap - # rules - yabai -m rule --add app="^(Genshin Impact|LuLu|Vimac|Calculator|Software Update|Dictionary|VLC|System Preferences|zoom.us|Photo Booth|Archive Utility|Python|LibreOffice|App Store|Steam|Alfred|Activity Monitor)$" manage=off + # rules - apps to ignore (manage=off) + yabai -m rule --add app="^Genshin Impact$" manage=off + yabai -m rule --add app="^LuLu$" manage=off + yabai -m rule --add app="^Vimac$" manage=off + yabai -m rule --add app="^Calculator$" manage=off + yabai -m rule --add app="^Software Update$" manage=off + yabai -m rule --add app="^Dictionary$" manage=off + yabai -m rule --add app="^VLC$" manage=off + yabai -m rule --add app="^System Preferences$" manage=off + yabai -m rule --add app="^zoom.us$" manage=off + yabai -m rule --add app="^Photo Booth$" manage=off + yabai -m rule --add app="^Archive Utility$" manage=off + yabai -m rule --add app="^Python$" manage=off + yabai -m rule --add app="^LibreOffice$" manage=off + yabai -m rule --add app="^App Store$" manage=off + yabai -m rule --add app="^Steam$" manage=off + yabai -m rule --add app="^Alfred$" manage=off + yabai -m rule --add app="^Activity Monitor$" manage=off + yabai -m rule --add app="^Raycast$" manage=off + + # Finder dialogs yabai -m rule --add label="Finder" app="^Finder$" title="(Co(py|nnect)|Move|Info|Pref)" manage=off + + # Safari dialogs yabai -m rule --add label="Safari" app="^Safari$" title="^(General|(Tab|Password|Website|Extension)s|AutoFill|Se(arch|curity)|Privacy|Advance)$" manage=off + + # System dialogs yabai -m rule --add label="About This Mac" app="System Information" title="About This Mac" manage=off + + # Inkscape dialogs yabai -m rule --add label="Select file to save to" app="^Inkscape$" title="Select file to save to" manage=off ''; executable = true; diff --git a/inbox/skhd.nix b/inbox/skhd.nix deleted file mode 100644 index 95352b5..0000000 --- a/inbox/skhd.nix +++ /dev/null @@ -1,111 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - super = "lalt"; -in { - services.skhd = { - enable = true; - package = pkgs.skhd; - skhdConfig = '' - ## Navigation (${super} - ...) - # Space Navigation (four spaces per display): ${super} - {1, 2, 3, 4} - ${super} - 1 : yabai -m space --focus 1 - ${super} - 2 : yabai -m space --focus 2 - ${super} - 3 : yabai -m space --focus 3 - ${super} - 4 : yabai -m space --focus 4 - ${super} - 5 : yabai -m space --focus 5 - ${super} - 6 : yabai -m space --focus 6 - ${super} - 7 : yabai -m space --focus 7 - ${super} - 8 : yabai -m space --focus 8 - ${super} - 9 : yabai -m space --focus 9 - ${super} - 0 : yabai -m space --focus 0 - - # Window Navigation (through display borders): ${super} - {h, j, k, l} - ${super} - h : yabai -m window --focus west || yabai -m display --focus west - ${super} - j : yabai -m window --focus south || yabai -m display --focus south - ${super} - k : yabai -m window --focus north || yabai -m display --focus north - ${super} - l : yabai -m window --focus east || yabai -m display --focus east - - # Float / Unfloat window: ${super} - space - # ${super} - space : yabai -m window --toggle float; sketchybar --trigger window_focus - - # Make window zoom to fullscreen: shift + ${super} - f - shift + ${super} - f : yabai -m window --toggle zoom-fullscreen; sketchybar --trigger window_focus - - # Make window zoom to parent node: ${super} - f - ${super} - f : yabai -m window --toggle zoom-parent; sketchybar --trigger window_focus - - ## Window Movement (shift + ${super} - ...) - # Moving windows in spaces: shift + ${super} - {h, j, k, l} - shift + ${super} - h : yabai -m window --warp west || $(yabai -m window --display west && sketchybar --trigger windows_on_spaces && yabai -m display --focus west && yabai -m window --warp last) || yabai -m window --move rel:-10:0 - shift + ${super} - j : yabai -m window --warp south || $(yabai -m window --display south && sketchybar --trigger windows_on_spaces && yabai -m display --focus south) || yabai -m window --move rel:0:10 - shift + ${super} - k : yabai -m window --warp north || $(yabai -m window --display north && sketchybar --trigger windows_on_spaces && yabai -m display --focus north) || yabai -m window --move rel:0:-10 - shift + ${super} - l : yabai -m window --warp east || $(yabai -m window --display east && sketchybar --trigger windows_on_spaces && yabai -m display --focus east && yabai -m window --warp first) || yabai -m window --move rel:10:0 - - # Toggle split orientation of the selected windows node: shift + ${super} - s - shift + ${super} - s : yabai -m window --toggle split - - # Moving windows between spaces: shift + ${super} - {1, 2, 3, 4, p, n } (Assumes 4 Spaces Max per Display) - shift + ${super} - 1 : DISPLAY="$(yabai -m query --displays --display | jq '.index')";\ - yabai -m window --space $((1+4*($DISPLAY - 1)));\ - sketchybar --trigger windows_on_spaces - - shift + ${super} - 2 : DISPLAY="$(yabai -m query --displays --display | jq '.index')";\ - yabai -m window --space $((2+4*($DISPLAY - 1)));\ - sketchybar --trigger windows_on_spaces - - shift + ${super} - 3 : DISPLAY="$(yabai -m query --displays --display | jq '.index')";\ - yabai -m window --space $((3+4*($DISPLAY - 1)));\ - sketchybar --trigger windows_on_spaces - - shift + ${super} - 4 : DISPLAY="$(yabai -m query --displays --display | jq '.index')";\ - yabai -m window --space $((4+4*($DISPLAY - 1)));\ - sketchybar --trigger windows_on_spaces - - shift + ${super} - p : yabai -m window --space prev; yabai -m space --focus prev; sketchybar --trigger windows_on_spaces - shift + ${super} - n : yabai -m window --space next; yabai -m space --focus next; sketchybar --trigger windows_on_spaces - - # Mirror Space on X and Y Axis: shift + ${super} - {x, y} - shift + ${super} - x : yabai -m space --mirror x-axis - shift + ${super} - y : yabai -m space --mirror y-axis - - ## Stacks (shift + ctrl - ...) - # Add the active window to the window or stack to the {direction}: shift + ctrl - {h, j, k, l} - shift + ctrl - h : yabai -m window west --stack $(yabai -m query --windows --window | jq -r '.id'); sketchybar --trigger window_focus - shift + ctrl - j : yabai -m window south --stack $(yabai -m query --windows --window | jq -r '.id'); sketchybar --trigger window_focus - shift + ctrl - k : yabai -m window north --stack $(yabai -m query --windows --window | jq -r '.id'); sketchybar --trigger window_focus - shift + ctrl - l : yabai -m window east --stack $(yabai -m query --windows --window | jq -r '.id'); sketchybar --trigger window_focus - - # Stack Navigation: shift + ctrl - {n, p} - shift + ctrl - n : yabai -m window --focus stack.next - shift + ctrl - p : yabai -m window --focus stack.prev - - ## Resize (ctrl + ${super} - ...) - # Resize windows: ctrl + ${super} - {h, j, k, l} - ctrl + ${super} - h : yabai -m window --resize right:-100:0 || yabai -m window --resize left:-100:0 - ctrl + ${super} - j : yabai -m window --resize bottom:0:100 || yabai -m window --resize top:0:100 - ctrl + ${super} - k : yabai -m window --resize bottom:0:-100 || yabai -m window --resize top:0:-100 - ctrl + ${super} - l : yabai -m window --resize right:100:0 || yabai -m window --resize left:100:0 - - # Equalize size of windows: ctrl + ${super} - e - ctrl + ${super} - e : yabai -m space --balance - - # Enable / Disable gaps in current workspace: ctrl + ${super} - g - ctrl + ${super} - g : yabai -m space --toggle padding; yabai -m space --toggle gap - - # Enable / Disable window borders in current workspace: ctrl + ${super} - b - ctrl + ${super} - b : yabai -m config window_border off - shift + ctrl + ${super} - b : yabai -m config window_border on - - ## Misc - # Open new Alacritty window - ${super} - return : kitty - ${super} - o : yabai -m window $(yabai -m query --windows | jq '.[] | select(.app==".kitty-wrapped") | .id') --space $(yabai -m query --spaces | jq '.[] | select(.has-focus==1) .id') - ''; - }; -} - -