From 151cd20a95f87c27339097f73e9deef1c39d7e7b Mon Sep 17 00:00:00 2001 From: turtlebasket Date: Wed, 22 Oct 2025 14:07:45 -0700 Subject: [PATCH] misc macos updates --- config/hammerspoon/init.lua | 32 +- config/iterm2/com.googlecode.iterm2.plist | 616 +++++++++++++++++++++- scripts/mbackup | 24 - scripts/ntfy-me | 78 +++ 4 files changed, 718 insertions(+), 32 deletions(-) delete mode 100755 scripts/mbackup create mode 100755 scripts/ntfy-me diff --git a/config/hammerspoon/init.lua b/config/hammerspoon/init.lua index f09cbda..b017fc3 100644 --- a/config/hammerspoon/init.lua +++ b/config/hammerspoon/init.lua @@ -114,7 +114,7 @@ function focusOrOpeniTerm() end end -hs.hotkey.bind({ "cmd", "ctrl" }, "T", focusOrOpeniTerm) +hs.hotkey.bind({ "cmd", "ctrl" }, "T", focusOrOpenGhostty) -------------------------------------------------------------------- -- Open new / focus existing browser window in current desktop space @@ -369,8 +369,6 @@ hs.hotkey.bind({ "cmd", "shift" }, "space", function() click menu item "New Tab to the Right" of menu "Tab" of menu bar 1 end tell - delay 0.01 - set URL of active tab of front window to "https://perplexity.ai" end if end tell @@ -380,6 +378,34 @@ hs.hotkey.bind({ "cmd", "shift" }, "space", function() )) end) +-- Open new / focus existing Discord window in current desktop space + +hs.hotkey.bind({ "cmd", "ctrl" }, "R", function() + local app = "Discord" + + wf_app = wf.new(false):setAppFilter(app, { currentSpace = true }) + + local wins = wf_app:getWindows() + local count = 0 + for _ in pairs(wins) do + count = count + 1 + end + + if count > 0 then + wf_app:getWindows()[1]:focus() + else + hs.osascript.applescript(string.format( + [[ + tell application "System Events" to tell process "%s" + click menu item "New Window" of menu "File" of menu bar 1 + set frontmost to true + end tell + ]], + app + )) + end +end) + --------------------------------------------------------------------------- -- DESKTOP SWITCHING (axed) -- Retroactive note: it should be harder, not easier, to context-switch :P diff --git a/config/iterm2/com.googlecode.iterm2.plist b/config/iterm2/com.googlecode.iterm2.plist index 1dcc5d1..153f93c 100644 --- a/config/iterm2/com.googlecode.iterm2.plist +++ b/config/iterm2/com.googlecode.iterm2.plist @@ -436,6 +436,26 @@ The script should do this: \(ai.prompt) Red Component 0.1234394758939743 + Ansi 0 Color (Dark) + + Blue Component + 0.12343787401914597 + Green Component + 0.12343578040599823 + Red Component + 0.1234394758939743 + + Ansi 0 Color (Light) + + Blue Component + 0.25882352941176473 + Color Space + sRGB + Green Component + 0.21176470588235294 + Red Component + 0.027450980392156862 + Ansi 1 Color Blue Component @@ -445,6 +465,26 @@ The script should do this: \(ai.prompt) Red Component 0.97170770168304443 + Ansi 1 Color (Dark) + + Blue Component + 0.095619738101959229 + Green Component + 0.067135065793991089 + Red Component + 0.97170770168304443 + + Ansi 1 Color (Light) + + Blue Component + 0.18431372549019609 + Color Space + sRGB + Green Component + 0.19607843137254902 + Red Component + 0.86274509803921573 + Ansi 10 Color Blue Component @@ -454,6 +494,26 @@ The script should do this: \(ai.prompt) Red Component 0.11459558457136154 + Ansi 10 Color (Dark) + + Blue Component + 0.379891037940979 + Green Component + 0.82695949077606201 + Red Component + 0.11459558457136154 + + Ansi 10 Color (Light) + + Blue Component + 0.45882352941176469 + Color Space + sRGB + Green Component + 0.43137254901960786 + Red Component + 0.34509803921568627 + Ansi 11 Color Blue Component @@ -463,6 +523,26 @@ The script should do this: \(ai.prompt) Red Component 0.95126962661743164 + Ansi 11 Color (Dark) + + Blue Component + 0.035377603024244308 + Green Component + 0.74144089221954346 + Red Component + 0.95126962661743164 + + Ansi 11 Color (Light) + + Blue Component + 0.51372549019607838 + Color Space + sRGB + Green Component + 0.4823529411764706 + Red Component + 0.396078431372549 + Ansi 12 Color Blue Component @@ -472,6 +552,26 @@ The script should do this: \(ai.prompt) Red Component 0.061654355376958847 + Ansi 12 Color (Dark) + + Blue Component + 0.838664710521698 + Green Component + 0.50448882579803467 + Red Component + 0.061654355376958847 + + Ansi 12 Color (Light) + + Blue Component + 0.58823529411764708 + Color Space + sRGB + Green Component + 0.58039215686274515 + Red Component + 0.51372549019607838 + Ansi 13 Color Blue Component @@ -481,6 +581,26 @@ The script should do this: \(ai.prompt) Red Component 0.32478702068328857 + Ansi 13 Color (Dark) + + Blue Component + 0.72698760032653809 + Green Component + 0.3135044276714325 + Red Component + 0.32478702068328857 + + Ansi 13 Color (Light) + + Blue Component + 0.7686274509803922 + Color Space + sRGB + Green Component + 0.44313725490196076 + Red Component + 0.42352941176470588 + Ansi 14 Color Blue Component @@ -490,6 +610,26 @@ The script should do this: \(ai.prompt) Red Component 0.059441849589347839 + Ansi 14 Color (Dark) + + Blue Component + 0.85764402151107788 + Green Component + 0.4900696873664856 + Red Component + 0.059441849589347839 + + Ansi 14 Color (Light) + + Blue Component + 0.63137254901960782 + Color Space + sRGB + Green Component + 0.63137254901960782 + Red Component + 0.57647058823529407 + Ansi 15 Color Blue Component @@ -499,6 +639,26 @@ The script should do this: \(ai.prompt) Red Component 1 + Ansi 15 Color (Dark) + + Blue Component + 1 + Green Component + 1 + Red Component + 1 + + Ansi 15 Color (Light) + + Blue Component + 0.8901960784313725 + Color Space + sRGB + Green Component + 0.96470588235294119 + Red Component + 0.99215686274509807 + Ansi 2 Color Blue Component @@ -508,6 +668,26 @@ The script should do this: \(ai.prompt) Red Component 0.17600196599960327 + Ansi 2 Color (Dark) + + Blue Component + 0.36823004484176636 + Green Component + 0.77383565902709961 + Red Component + 0.17600196599960327 + + Ansi 2 Color (Light) + + Blue Component + 0.0 + Color Space + sRGB + Green Component + 0.59999999999999998 + Red Component + 0.52156862745098043 + Ansi 3 Color Blue Component @@ -517,6 +697,26 @@ The script should do this: \(ai.prompt) Red Component 0.92706489562988281 + Ansi 3 Color (Dark) + + Blue Component + 0.060177117586135864 + Green Component + 0.72761225700378418 + Red Component + 0.92706489562988281 + + Ansi 3 Color (Light) + + Blue Component + 0.0 + Color Space + sRGB + Green Component + 0.53725490196078429 + Red Component + 0.70980392156862748 + Ansi 4 Color Blue Component @@ -526,6 +726,26 @@ The script should do this: \(ai.prompt) Red Component 0.16567224264144897 + Ansi 4 Color (Dark) + + Blue Component + 0.82454067468643188 + Green Component + 0.51804500818252563 + Red Component + 0.16567224264144897 + + Ansi 4 Color (Light) + + Blue Component + 0.82352941176470584 + Color Space + sRGB + Green Component + 0.54509803921568623 + Red Component + 0.14901960784313725 + Ansi 5 Color Blue Component @@ -535,6 +755,26 @@ The script should do this: \(ai.prompt) Red Component 0.30770933628082275 + Ansi 5 Color (Dark) + + Blue Component + 0.71787959337234497 + Green Component + 0.35215187072753906 + Red Component + 0.30770933628082275 + + Ansi 5 Color (Light) + + Blue Component + 0.50980392156862742 + Color Space + sRGB + Green Component + 0.21176470588235294 + Red Component + 0.82745098039215681 + Ansi 6 Color Blue Component @@ -544,6 +784,26 @@ The script should do this: \(ai.prompt) Red Component 0.061654355376958847 + Ansi 6 Color (Dark) + + Blue Component + 0.838664710521698 + Green Component + 0.50448882579803467 + Red Component + 0.061654355376958847 + + Ansi 6 Color (Light) + + Blue Component + 0.59607843137254901 + Color Space + sRGB + Green Component + 0.63137254901960782 + Red Component + 0.16470588235294117 + Ansi 7 Color Blue Component @@ -553,6 +813,26 @@ The script should do this: \(ai.prompt) Red Component 0.84028750658035278 + Ansi 7 Color (Dark) + + Blue Component + 0.89713811874389648 + Green Component + 0.8579363226890564 + Red Component + 0.84028750658035278 + + Ansi 7 Color (Light) + + Blue Component + 0.83529411764705885 + Color Space + sRGB + Green Component + 0.90980392156862744 + Red Component + 0.93333333333333335 + Ansi 8 Color Blue Component @@ -562,6 +842,26 @@ The script should do this: \(ai.prompt) Red Component 0.84028750658035278 + Ansi 8 Color (Dark) + + Blue Component + 0.89713811874389648 + Green Component + 0.8579363226890564 + Red Component + 0.84028750658035278 + + Ansi 8 Color (Light) + + Blue Component + 0.21176470588235294 + Color Space + sRGB + Green Component + 0.16862745098039217 + Red Component + 0.0 + Ansi 9 Color Blue Component @@ -571,6 +871,26 @@ The script should do this: \(ai.prompt) Red Component 0.87161564826965332 + Ansi 9 Color (Dark) + + Blue Component + 0.1818375289440155 + Green Component + 0.20686990022659302 + Red Component + 0.87161564826965332 + + Ansi 9 Color (Light) + + Blue Component + 0.086274509803921567 + Color Space + sRGB + Green Component + 0.29411764705882354 + Red Component + 0.79607843137254897 + BM Growl Background Color @@ -582,6 +902,26 @@ The script should do this: \(ai.prompt) Red Component 0.07621997594833374 + Background Color (Dark) + + Blue Component + 0.076218985021114349 + Green Component + 0.076217696070671082 + Red Component + 0.07621997594833374 + + Background Color (Light) + + Blue Component + 0.8901960784313725 + Color Space + sRGB + Green Component + 0.96470588235294119 + Red Component + 0.99215686274509807 + Background Image Location Badge Color @@ -597,6 +937,32 @@ The script should do this: \(ai.prompt) Red Component 1 + Badge Color (Dark) + + Alpha Component + 0.5 + Blue Component + 0.0 + Color Space + sRGB + Green Component + 0.1491314172744751 + Red Component + 1 + + Badge Color (Light) + + Alpha Component + 0.5 + Blue Component + 0.13960540294647217 + Color Space + P3 + Green Component + 0.25479039549827576 + Red Component + 0.92929404973983765 + Blinking Cursor Blur @@ -610,14 +976,42 @@ The script should do this: \(ai.prompt) Red Component 0.84028750658035278 + Bold Color (Dark) + + Blue Component + 0.89713811874389648 + Green Component + 0.8579363226890564 + Red Component + 0.84028750658035278 + + Bold Color (Light) + + Blue Component + 0.45882352941176469 + Color Space + sRGB + Green Component + 0.43137254901960786 + Red Component + 0.34509803921568627 + + Brighten Bold Text (Dark) + + Brighten Bold Text (Light) + Character Encoding 4 Close Sessions On End Columns - 158 + 168 Command + Cursor Boost (Dark) + 0.0 + Cursor Boost (Light) + 0.0 Cursor Color Blue Component @@ -627,6 +1021,26 @@ The script should do this: \(ai.prompt) Red Component 0.72549021244049072 + Cursor Color (Dark) + + Blue Component + 0.72549021244049072 + Green Component + 0.72549021244049072 + Red Component + 0.72549021244049072 + + Cursor Color (Light) + + Blue Component + 0.51372549019607838 + Color Space + sRGB + Green Component + 0.4823529411764706 + Red Component + 0.396078431372549 + Cursor Guide Color Alpha Component @@ -640,6 +1054,32 @@ The script should do this: \(ai.prompt) Red Component 0.70213186740875244 + Cursor Guide Color (Dark) + + Alpha Component + 0.25 + Blue Component + 1 + Color Space + sRGB + Green Component + 0.9268307089805603 + Red Component + 0.70213186740875244 + + Cursor Guide Color (Light) + + Alpha Component + 0.25 + Blue Component + 0.99125725030899048 + Color Space + P3 + Green Component + 0.92047786712646484 + Red Component + 0.74862593412399292 + Cursor Text Color Blue Component @@ -649,6 +1089,26 @@ The script should do this: \(ai.prompt) Red Component 0.062745101749897003 + Cursor Text Color (Dark) + + Blue Component + 0.062745101749897003 + Green Component + 0.062745101749897003 + Red Component + 0.062745101749897003 + + Cursor Text Color (Light) + + Blue Component + 0.83529411764705885 + Color Space + sRGB + Green Component + 0.90980392156862744 + Red Component + 0.93333333333333335 + Custom Command No Custom Directory @@ -661,6 +1121,10 @@ The script should do this: \(ai.prompt) Faint Text Alpha 0.5 + Faint Text Alpha (Dark) + 0.5 + Faint Text Alpha (Light) + 0.5 Flashing Bell Foreground Color @@ -672,6 +1136,26 @@ The script should do this: \(ai.prompt) Red Component 0.84028750658035278 + Foreground Color (Dark) + + Blue Component + 0.89713811874389648 + Green Component + 0.8579363226890564 + Red Component + 0.84028750658035278 + + Foreground Color (Light) + + Blue Component + 0.51372549019607838 + Color Space + sRGB + Green Component + 0.4823529411764706 + Red Component + 0.396078431372549 + Guid 093812C0-CFC5-4622-AB39-AD24DB22E05B Horizontal Spacing @@ -1130,18 +1614,74 @@ The script should do this: \(ai.prompt) Red Component 0.0 + Link Color (Dark) + + Alpha Component + 1 + Blue Component + 0.73423302173614502 + Color Space + sRGB + Green Component + 0.35916060209274292 + Red Component + 0.0 + + Link Color (Light) + + Alpha Component + 1 + Blue Component + 0.7093239426612854 + Color Space + P3 + Green Component + 0.35333043336868286 + Red Component + 0.14513972401618958 + Load Shell Integration Automatically + Match Background Color (Dark) + + Alpha Component + 1 + Blue Component + 0.0 + Color Space + P3 + Green Component + 1 + Red Component + 1 + + Match Background Color (Light) + + Alpha Component + 1 + Blue Component + 0.0 + Color Space + P3 + Green Component + 1 + Red Component + 1 + + Minimum Contrast (Dark) + 0.0 + Minimum Contrast (Light) + 0.0 Mouse Reporting Name Default Non Ascii Font - Monaco 12 + MesloLGS-NF-Regular 12 Non-ASCII Anti Aliased Normal Font - MesloLGS-NF-Regular 13 + HackNerdFontComplete-Regular 13 Option Key Sends 0 Prompt Before Closing 2 @@ -1149,7 +1689,7 @@ The script should do this: \(ai.prompt) Right Option Key Sends 0 Rows - 46 + 47 Screen -1 Scrollback Lines @@ -1163,6 +1703,26 @@ The script should do this: \(ai.prompt) Red Component 0.84028750658035278 + Selected Text Color (Dark) + + Blue Component + 0.89713811874389648 + Green Component + 0.8579363226890564 + Red Component + 0.84028750658035278 + + Selected Text Color (Light) + + Blue Component + 0.45882352941176469 + Color Space + sRGB + Green Component + 0.43137254901960786 + Red Component + 0.34509803921568627 + Selection Color Blue Component @@ -1172,12 +1732,36 @@ The script should do this: \(ai.prompt) Red Component 0.1234394758939743 + Selection Color (Dark) + + Blue Component + 0.12343787401914597 + Green Component + 0.12343578040599823 + Red Component + 0.1234394758939743 + + Selection Color (Light) + + Blue Component + 0.83529411764705885 + Color Space + sRGB + Green Component + 0.90980392156862744 + Red Component + 0.93333333333333335 + Send Code When Idle Shortcut Silence Bell + Smart Cursor Color (Dark) + + Smart Cursor Color (Light) + Sync Title Tags @@ -1192,10 +1776,32 @@ The script should do this: \(ai.prompt) Use Bright Bold + Use Bright Bold (Dark) + + Use Bright Bold (Light) + + Use Cursor Guide (Dark) + + Use Cursor Guide (Light) + Use Italic Font Use Non-ASCII Font + Use Selected Text Color (Dark) + + Use Selected Text Color (Light) + + Use Separate Colors for Light and Dark Mode + + Use Tab Color (Dark) + + Use Tab Color (Light) + + Use Underline Color (Dark) + + Use Underline Color (Light) + Vertical Spacing 1 Visual Bell @@ -2037,7 +2643,7 @@ The script should do this: \(ai.prompt) Print In Black And White ShowFullScreenTabBar - + SmartPlacement SoundForEsc diff --git a/scripts/mbackup b/scripts/mbackup deleted file mode 100755 index 99180ab..0000000 --- a/scripts/mbackup +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bb - -(require '[clojure.string :as str :refer [split]]) -(require '[babashka.tasks :as tasks :refer [shell]]) - -(def drive-dest "turtlebasket-gdrive:/macbook-air-m1") -(def paths ["Desktop" - "Documents/Personal Knowledge Base" - "Documents/Berkeley Notes"]) - -;; currently not used -(def exclude ["*.swp" ".git" "node_modules" "__pycache__" ".DS_Store"]) - -(for [path paths] - (future - (let [res - (shell "rclone" "sync" - path - (format "%s/%s" drive-dest (-> path (split #"/") last)) - "--progress" "--retries" 1 "--delete-excluded")] - (if (= (get res "exit") 0) - (println (format "Backed up %s" path)) - (println (get res "error")))))) - ;; (for [item exclude] (cons "--exclude" item)))) diff --git a/scripts/ntfy-me b/scripts/ntfy-me new file mode 100755 index 0000000..7d53221 --- /dev/null +++ b/scripts/ntfy-me @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +# +# ntfy-me — run any command, then send ntfy success/failure notification (via curl) +# +# Usage: +# ntfy-me [args...] +# +# Example: +# ntfy-me make build +# ntfy-me bash -c "sleep 10 && false" +# ntfy-me ls /nonexistent +# +# Notes: +# - Requires $NTFY_ME_TOPIC set (e.g., mytopic) +# - Optional $NTFY_HOST (defaults to https://ntfy.sh) +# - Captures exit code and reports SUCCESS/FAILURE via ntfy with duration. + +set -uo pipefail # no `-e`, so we can handle nonzero exits ourselves + +if [ -z "${NTFY_ME_TOPIC:-}" ]; then + echo "Error: NTFY_ME_TOPIC environment variable not set." + echo "Set it like: export NTFY_ME_TOPIC=mytopic" + exit 1 +fi + +# Set default ntfy host if not provided +NTFY_HOST="${NTFY_HOST:-https://ntfy.sh}" + +if [ $# -lt 1 ]; then + echo "Usage: $0 [args...]" + exit 1 +fi + +# Reconstruct command with proper quoting for display +original_cmd="" +for arg in "$@"; do + if [[ "$arg" =~ [[:space:]] ]]; then + original_cmd="$original_cmd \"$arg\"" + else + original_cmd="$original_cmd $arg" + fi +done +original_cmd="${original_cmd# }" # Remove leading space + +start_time=$(date +%s) +hostname=$(hostname) + +# Run the command directly, preserving exit code +"$@" +code=$? + +end_time=$(date +%s) +elapsed=$((end_time - start_time)) +duration="$(printf '%02dh:%02dm:%02ds' $((elapsed/3600)) $((elapsed%3600/60)) $((elapsed%60)))" + +if [ $code -eq 0 ]; then + title="✅ Command exited - SUCCESS" +else + title="❌ Command exited - FAILURE" +fi + +# Truncate if too long (keep first 100 chars + "..." if truncated) +cmd_str="$original_cmd" +if [ ${#cmd_str} -gt 100 ]; then + cmd_str="${cmd_str:0:100}..." +fi + +body="Command: $cmd_str +Host: $hostname +Duration: $duration +Exit code: $code" + +curl -fsS -X POST \ + -H "Title: $title" \ + -d "$body" \ + "$NTFY_HOST/$NTFY_ME_TOPIC" >/dev/null 2>&1 || echo "Warning: failed to send ntfy notification" >&2 + +exit $code