0
0

open_application.zsh 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/bin/zsh
  2. export TERMINAL_PATH=/Applications/Alacritty.app/
  3. export BROWSER_PATH=/Applications/Firefox.app/
  4. export FINDER_PATH=/System/Library/CoreServices/Finder.app/
  5. export COMMUNICATIONS_PATH=/Applications/Slack.app/
  6. export MUSIC_PATH=/Applications/Spotify.app/
  7. export NOTETAKING_PATH=/Applications/Obsidian.app/
  8. export PROJECTTRACKING_PATH=/Applications/Asana.app/
  9. export MAIL_PATH=/Applications/Notion\ Mail.app//
  10. export PROJECTDOCS_PATH=/Applications/Notion.app/
  11. export VIDEOCALL_PATH=$HOME/Applications/Google\ Meet.app/
  12. export ALT_COMMUNICATIONS_PATH=/Applications/Signal.app/
  13. export ALT_NOTETAKING_PATH=/Applications/Obsidian.app/
  14. focus() {
  15. local id
  16. id=$(yabai -m query --windows | jq -e "$1") || return 1
  17. yabai -m window --focus "$id"
  18. }
  19. valid_selection=true
  20. case $1 in
  21. terminal)
  22. open $TERMINAL_PATH ;;
  23. browser)
  24. open $BROWSER_PATH ;;
  25. finder)
  26. focus 'map(select(.app=="Finder")) | first | .id' || open $FINDER_PATH ;;
  27. communications)
  28. focus 'first(.[] | select(.app == "Slack" and (.title | startswith("Huddle: ") | not))).id' || \
  29. open $COMMUNICATIONS_PATH || open $ALT_COMMUNICATIONS_PATH ;;
  30. music)
  31. open $MUSIC_PATH ;;
  32. notetaking)
  33. open $ALT_NOTETAKING_PATH || open $NOTETAKING_PATH ;;
  34. videocall)
  35. focus 'first(.[] | select(.app == "Slack" and (.title | startswith("Huddle: ")))).id' || \
  36. focus 'map(select(.app == "Google Meet")) | first | .id' || \
  37. open $VIDEOCALL_PATH || open $ALT_COMMUNICATIONS_PATH ;;
  38. projecttracking)
  39. open $PROJECTTRACKING_PATH ;;
  40. projectdocs)
  41. open $PROJECTDOCS_PATH ;;
  42. mail)
  43. open $MAIL_PATH ;;
  44. *)
  45. valid_selection=false
  46. esac
  47. if [ "$valid_selection" = true ] ; then
  48. windows=$(yabai -m query --windows)
  49. spaces=$(yabai -m query --spaces)
  50. displays=$(yabai -m query --displays)
  51. active_display=$(jq 'map(select(."has-focus"==true)) | map(.display) | first' <<< $spaces)
  52. active_space=$(jq 'map(select(."has-focus"==true)) | map(.index) | first' <<< $spaces)
  53. other_space=$(jq 'map(select(."has-focus"==false and ."is-visible"==true)) | map(.index) | first' <<< $spaces)
  54. # If there are 3+ windows in the space, then make selected the largest window
  55. shared_windows=$(jq --argjson space "$active_space" 'map(select(.space==$space)) | map( { ("size"): (.frame.w * .frame.h), "id": .id, "focus": ."has-focus", "title": .title } ) | sort_by(.size)' <<< $windows)
  56. focused_window=$(jq 'map(select(.focus)) | first | .id' <<< $shared_windows)
  57. if [ $(jq 'length' <<< $shared_windows ) -gt 2 ]; then
  58. largest_window=$(jq 'last | .id' <<< $shared_windows)
  59. if [ "$focused_window" != "$largest_window" ]; then
  60. yabai -m window $focused_window --swap $largest_window
  61. fi
  62. fi
  63. yabai -m window $focused_window --focus
  64. fi