Hammerspoon: автоматизация macOS, на которую не способны Shortcuts
Я несколько лет жила на Apple Shortcuts и думала, что закрыла все потребности в автоматизации. Потом узнала про Hammerspoon — и поняла, что Shortcuts закрывают только верхушку. Hammerspoon — это Lua-скриптинг для macOS на уровне, до которого Shortcuts не достают физически.
Что такое Hammerspoon
Бесплатное open-source приложение, которое даёт API ко множеству системных функций macOS: окна, экраны, клавиатура, мышь, системные события, уведомления, сеть, USB. И всё это управляется через Lua-скрипты в одном файле ~/.hammerspoon/init.lua.
Установка через homebrew: brew install --cask hammerspoon. После запуска нужно выдать Accessibility и Input Monitoring доступ — без них половина функций не работает.
Базовый init.lua
hs.alert.show("Hammerspoon работает")
-- горячая клавиша на перезагрузку конфига
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "R", function()
hs.reload()
end)
-- горячая клавиша: показать уведомление
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "Y", function()
hs.notify.new({title="Привет", informativeText="Из Hammerspoon"}):send()
end)Сохранила, нажала «Reload Config» в меню — горячие клавиши работают. Это база, на которой строится всё остальное.
Управление окнами
Главный сценарий, ради которого многие ставят Hammerspoon. Без сторонних Magnet/Rectangle.
-- хоткей: занять левую половину экрана
hs.hotkey.bind({"cmd", "alt"}, "Left", function()
local win = hs.window.focusedWindow()
local frame = win:screen():frame()
win:setFrame({
x = frame.x,
y = frame.y,
w = frame.w / 2,
h = frame.h
})
end)
-- хоткей: правая половина
hs.hotkey.bind({"cmd", "alt"}, "Right", function()
local win = hs.window.focusedWindow()
local frame = win:screen():frame()
win:setFrame({
x = frame.x + frame.w / 2,
y = frame.y,
w = frame.w / 2,
h = frame.h
})
end)За 10 минут собирается полный набор хоткеев под половины, четверти, центрирование. Никаких сторонних программ.
Запуск приложений по хоткеям
local apps = {
S = "Slack",
N = "Notion",
T = "iTerm",
C = "Calendar",
M = "Mail",
}
for key, app in pairs(apps) do
hs.hotkey.bind({"cmd", "alt", "ctrl", "shift"}, key, function()
hs.application.launchOrFocus(app)
end)
endHyper+S — Slack, Hyper+N — Notion, и так далее. Я делаю Hyper-key через Karabiner (об этом писала отдельно).
Watchers — реакции на события
Эта часть мощнее всего. Hammerspoon может слушать любые системные события и реагировать.
Например, я хочу, чтобы при подключении внешнего монитора автоматически менялась раскладка окон:
hs.screen.watcher.new(function()
local screens = hs.screen.allScreens()
if #screens == 2 then
-- внешний подключён
hs.execute("open -a Slack")
-- ... разместить окна по схеме
end
end):start()Или: при подключении наушников через Bluetooth — поставить громкость на 50%, при отключении — выключить звук.
hs.audiodevice.watcher.setCallback(function(arg)
if arg == "dOut" then
local current = hs.audiodevice.defaultOutputDevice():name()
if current:find("AirPods") then
hs.audiodevice.defaultOutputDevice():setVolume(50)
else
hs.audiodevice.defaultOutputDevice():setVolume(0)
end
end
end)
hs.audiodevice.watcher.start()Application watchers
Можно реагировать на запуск/закрытие приложений. У меня настроено: при запуске Slack/Telegram автоматически включается режим «работа» в Focus.
local watcher = hs.application.watcher.new(function(name, event, app)
if event == hs.application.watcher.launched then
if name == "Slack" or name == "Telegram" then
hs.execute("shortcuts run 'Включить рабочий Focus'")
end
end
end)
watcher:start()Видишь, я даже использую Apple Shortcuts из Hammerspoon, когда нужна функция типа Focus Mode — она в shortcuts проще, и я просто вызываю её отсюда.
SpoonStatus и Spoons
Spoons — это «плагины» для Hammerspoon. Готовые модули под популярные задачи: SeoonModalMgr, MiroWindowsManager, KSheet, ReloadConfiguration. Ставится копированием в ~/.hammerspoon/Spoons/.
Я держу пару:
- ReloadConfiguration — автоматически перечитывает init.lua при сохранении.
- SeoonModalMgr — модальные хоткеи (нажал hyper+W — попадаешь в режим управления окнами, дальше клавиши вроде H/L/J/K).
Для кого это
Hammerspoon не для всех. Если ты программист или любишь возиться со скриптами — заходи смело. Если ты не пишешь код — посмотри сначала Shortcuts, Raycast и BetterTouchTool. Возможно, твоих задач хватит без Lua-кода.
Точка перехода у меня была такая: я сделала в Shortcuts десятый workflow с workaround-ом, поняла, что половина решений хрупка, и плюнула — за вечер переписала ключевые автоматизации в Hammerspoon. С тех пор оно держится годами без правок.
Подвохи
- Lua — простой язык, но непривычный. Если в первый раз — потратишь час на синтаксис.
- После апгрейда macOS Hammerspoon иногда теряет permissions. Переоткрой настройки и выдай заново.
- В init.lua легко получить «всё перестало работать» из-за одной ошибки. Я разделила скрипт на несколько файлов и подключаю require'ом — так локально проще искать виноватого.
Что в итоге
Hammerspoon — для тех, кто упёрся в потолок Shortcuts и хочет автоматизировать macOS на уровне «скрипт реагирует на любое событие». 90% пользователей Mac никогда об этом не узнают и не страдают. Но если ты в этих 10% — ставь, разбирайся за вечер с базой, и через неделю удивишься, какие штуки можно подвязать. И всё это бесплатно, локально и без зависимости от облаков.