Hammerspoon
- alexfortin - 601 sekunder sedanI use it to enable/disable the wifi when I disconnec/connect the macbook to a specific usb hub with ethernet connection:
local usbWatcher = hs.usb.watcher.new(function(device) if device.productName == "EMEET SmartCam C960" then if device.eventType == "added" then hs.execute("networksetup -setairportpower en0 off") hs.notify.new({title="Wi-Fi", informativeText="Disabled (USB device connected)"}):send() elseif device.eventType == "removed" then hs.execute("networksetup -setairportpower en0 on") hs.notify.new({title="Wi-Fi", informativeText="Re-enabled (USB device removed)"}):send() end end end) usbWatcher:start() - zdw - 1560 sekunder sedanI fake a tiling window manager on Mac with Hammerspoon, resizing to fit in specific corners/sizes:
And to throw windows to other monitors:-- resize based on ratios function ratioResize(xr, yr, wr, hr) return function () local win = hs.window.focusedWindow() win:moveToUnit({x=xr,y=yr,w=wr,h=hr}) end end -- 4 corners, different sizes hs.hotkey.bind({"cmd", "ctrl"}, "w", ratioResize(0, 0, 2/5, 2/3)) hs.hotkey.bind({"cmd", "ctrl"}, "e", ratioResize(2/5, 0, 3/5, 2/3)) hs.hotkey.bind({"cmd", "ctrl"}, "s", ratioResize(0, 2/3, 2/5, 1/3)) hs.hotkey.bind({"cmd", "ctrl"}, "d", ratioResize(2/5, 2/3, 3/5, 1/3))-- send to next screen hs.hotkey.bind({"cmd", "ctrl"}, ";", function() local win = hs.window.focusedWindow() local screen = win:screen() local next_screen = screen:next() win:moveToScreen(next_screen) end) - overflowy - 1038 sekunder sedanI use this to remap app keys:
local appHotkeys = {} local function remapAppHotkey(appName, fromMods, fromKey, toMods, toKey, delay) if not appHotkeys[appName] then appHotkeys[appName] = {} end local hotkey = hs.hotkey.new(fromMods, fromKey, function() hs.eventtap.keyStroke(toMods, toKey, delay or 0) end) table.insert(appHotkeys[appName], hotkey) end local appWatcher = hs.application.watcher.new(function(appName, eventType) local hotkeys = appHotkeys[appName] if not hotkeys then return end for _, hotkey in ipairs(hotkeys) do if eventType == hs.application.watcher.activated then hotkey:enable() elseif eventType == hs.application.watcher.deactivated then hotkey:disable() end end end) appWatcher:start() -- Remap app hotkeys remapAppHotkey("Finder", { "cmd" }, "q", { "cmd" }, "w", 0.5) ... etc ... - juancn - 1173 sekunder sedanI use it to hide Zoom's screen sharing controls so they don't come back when pressing Esc:
-- Hide Zoom's "share" windows so it doesn't come back on ESC keypress local zoomWindow = nil local originalFrame = nil hs.hotkey.bind({"cmd", "ctrl", "alt"}, "H", function() print("> trying to hide zoom") if not zoomWindow then print("> looking for window") zoomWindow = hs.window.find("zoom share statusbar window") end if zoomWindow then print("> found window") if originalFrame then print("> restoring") zoomWindow:setFrame(originalFrame) originalFrame = nil zoomWindow = nil else print("> hiding") originalFrame = zoomWindow:frame() local screen = zoomWindow:screen() local frame = zoomWindow:frame() frame.x = screen:frame().w + 99000 frame.y = screen:frame().h + 99000 zoomWindow:setFrame(frame) end else print("> window not found") end end) - incanus77 - 2854 sekunder sedanHammerspoon is the glue that holds my Mac together. For a starter list of things to do with this app, a partial list of the things that I'm using it for:
- Dumping all open Safari tabs to an Obsidian doc - Adding 'hyper' (Ctrl-Opt-Cmd) keybinds to pop a new window for: - Safari - Finder - Terminal (Ghostty) - VS Code - Notes - Editing Hammerspoon/AeroSpace/Sketchybar config - Reloading Hammerspoon config - Reloading Sketchybar - Quitting all Dock apps except Finder - Screen lock - System sleep - Opening front Finder folder in VS Code - Opening front Safari URL on Archive.today - Showing front Safari window tab count - Showing front app bundle ID - Posting notification about current Music track - Controlling my Logi Litra light (various color temps/brightnesses) - Starting/stopping a client work timer - Tying it to AeroSpace for: - Pushing a window to another monitor - Performing a two-up window layout - Swapping those two windows - Closing all other workspace windows - Gathering all windows to first workspace - Ensuring some background apps stay running if they crash - Prompting to unmount disk images if trashed - Binding into Skim to jump to specific sections of spec PDFs using terse Markdown URLs - pjm331 - 5489 sekunder sedanhere is my entire config
i've tried all of the other fancy window managers and for me nothing has ever beat the ease of use of jusths.hotkey.bind({"ctrl"}, "D", function() hs.grid.show() end)(1) ctrl-d to see the grid, (2) type the letter where you want the top left corner of your window to be, (3) type the letter where you want the bottom right corner to be
window resized
- swiftcoder - 517 sekunder sedanI always confuse "hammerspoon" and "rowhammer"
- jjmiv - 3917 sekunder sedanis there a particular reason this was shared?
otherwise I'm slowly working on a Spoon that figures out if there is an active meeting in Zoom, Teams, Huddle, Google Meet and will allow for muting, video enable/disable and screen sharing etc
- jmcguckin - 1487 sekunder sedanI use it to give me focus-follows-mouse and to have a large circle surrounding the mouse when i move it, to aid finding it.
- weitzj - 1948 sekunder sedanI love hammerspoon. That's it :D
It's lua, so you can get creative with https://fennel-lang.org/
- golem14 - 6004 sekunder sedanHas anyone worked on making a config replicating aerospace?
Hammerspoon seems like a superset and it’s probably better to just have one, instead of two tools warring about who gets the keypresses?
- mwagstaff - 2224 sekunder sedanCan't live without Hammerspoon on Mac.
Can't live without AutoHotkey on Windows.
Thanks to everyone who contributed to both!
- trjordan - 3225 sekunder sedanI utterly love Hammerspoon.
It's fun to combine with qmk [0], which gives you a bunch more options for hotkeys on your keyboard via layers. I've ended up with a layer where half the keyboard is Hammerspoon shortcuts directly to apps (e.g. go to Slack, to Chrome, etc.) and half of it is in-app shortcuts (like putting cmd-number on the home row, for directly addressing chrome tabs).
Between this and one of the tiling window manager-adjacent tools (I use Sizeup), I can do all my OS-level navigation directly. "Oh I want to go to Slack and go to this DM" is a few keystrokes away, and not dependent on what else I was doing.
[0] https://qmk.fm/
- john-tells-all - 5298 sekunder sedanI'd love to have a global "toggle Teams mute" button.
- hmokiguess - 1614 sekunder sedanwhat's your favourite spoon?
- hirvi74 - 2076 sekunder sedanI have fond memories of this app. However, after many years, I have moved on. I am in the process of writing my own replacement for some of the various use cases that Hammerspoon once provided me. Though, Hammerspoon will always be a source of great inspiration.
- rolymath - 3667 sekunder sedanIs paperwm jittery for everyone?
Nördnytt! 🤓