lenec ru

← все посты

Hammerspoon: автоматизация macOS, на которую не способны Shortcuts

15K

Я несколько лет жила на 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)
end

Hyper+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% — ставь, разбирайся за вечер с базой, и через неделю удивишься, какие штуки можно подвязать. И всё это бесплатно, локально и без зависимости от облаков.

Комментарии 0

  • Будьте первым, кто оставит комментарий.

Войдите, чтобы оставить комментарий.