Files
hammerspoon/productivity.lua
T
2026-05-14 18:59:23 -04:00

85 lines
2.8 KiB
Lua

local prod = {}
-- ==========================================
-- 1. SMART APP SWITCHER (Focus & Mouse Center)
-- ==========================================
function prod.focusApp(appName)
local app = hs.application.get(appName)
if app then
local window = app:mainWindow()
if window then
window:unminimize()
window:focus()
local f = window:frame()
-- Centers mouse on the focused window
hs.mouse.absolutePosition({x = f.x + f.w/2, y = f.y + f.h/2})
end
else
hs.application.launchOrFocus(appName)
end
end
-- KEY BINDINGS for Item 1
hs.hotkey.bind({"alt"}, "T", function() prod.focusApp("Terminal") end)
hs.hotkey.bind({"alt"}, "G", function() prod.focusApp("Gemini") end)
hs.hotkey.bind({"alt"}, "V", function() prod.focusApp("Visual Studio Code") end)
-- ==========================================
-- 2. GHOST HUNTER (Cleanup & Panic Reset)
-- ==========================================
function prod.ghostHunter()
local windows = hs.window.allWindows()
local zombies = 0
local rescued = 0
for _, win in ipairs(windows) do
local app = win:application()
local frame = win:frame()
-- Identify Zombie (No app or no title)
if not app or (win:title() == "" and not win:isStandard()) then
zombies = zombies + 1
end
-- Rescuing windows stuck in "Deep Space" (off-screen coordinates)
if frame.x < -5000 or frame.y < -5000 or frame.x > 10000 or frame.y > 10000 then
win:moveToScreen(hs.screen.primaryScreen())
rescued = rescued + 1
end
end
-- FIX: Replaced forceRefresh() with the default window filter refresh
hs.window.filter.default:getWindows()
hs.alert.show(string.format("Hunter: %d Ghosts | %d Rescued", zombies, rescued), 2)
end
-- KEY BINDING for Item 2 (Panic Key)
hs.hotkey.bind({"shift", "alt"}, "G", prod.ghostHunter)
-- ==========================================
-- 3. CONTEXTUAL MODES (Workspaces)
-- ==========================================
function prod.modeArchitecture()
hs.alert.show("Mode: Architecture (Deep Work)", 2)
hs.application.launchOrFocus("Visual Studio Code")
hs.application.launchOrFocus("Terminal")
-- Hide distractions
local teams = hs.application.get("Microsoft Teams")
if teams then teams:hide() end
end
function prod.modeCommunication()
hs.alert.show("Mode: Communication (Email/Teams)", 2)
hs.application.launchOrFocus("Microsoft Outlook")
hs.application.launchOrFocus("Microsoft Teams")
end
-- KEY BINDINGS for Item 3
hs.hotkey.bind({"shift", "alt"}, "A", prod.modeArchitecture)
hs.hotkey.bind({"shift", "alt"}, "C", prod.modeCommunication)
-- Loading notification
hs.alert.show("🚀 Productivity Tools Loaded", 1.5)
return prod