Mac에서 Windows의 Win + 숫자키 기능 구현하기 (Hammerspoon)

jys9962·2025년 3월 20일
0

Windows에서는 Win + 숫자키를 누르면 작업표시줄에 있는 앱을 제어할 수 있습니다.

  1. 열려 있지 않은 앱은 실행
  2. 열려있는 앱은 활성화
  3. 여러 창이 열려있는 앱은 키를 여러번 눌러서 원하는 창 활성화 (오래된순 정렬)

Mac에서 같은 기능을 찾으려고 많은 무료/유료 앱을 사용해봤지만 3번 기능을 지원하는 앱이 없었습니다.

그러던 중 Hammerspoon 을 알게되어 직접 구현해서 사용하고 있습니다.


Hammerspoon이란?

Mac에서 사용할 수 있고, Lua 라는 언어로 다양한 API를 제공합니다.

키보드, 앱, 창, 마우스, 볼륨, Alert 등을 컨트롤 할 수 있습니다.


구현

해머스푼 API로 필요한 기능은 다음과 같습니다.

  1. 앱 실행하기
  2. 앱에 대한 모든 창(window) 정보 가져오기 - 열린 순서대로
  3. 창 활성화
  4. 창 목록을 표시할 모달창
  5. 키보드 이벤트 바인딩

다행히 위 기능이 모두 있습니다.

hs api 사용해서 키 입력에 대한 이벤트 함수를 바인딩합니다.

local function register(key, appName, launchName)
    local function initOrNext()
        controller.initOrNext(appName, launchName)
    end

    hs.hotkey.bind({ 'option' }, key, initOrNext, nil, initOrNext)
end

컨트롤러를 작성해줍니다.

function initOrNext(appName, launchName)
    local tabName = getTabName(appName)
    local currentTabName = tabAlert.getTabName()
    if tabName == currentTabName then
        tabAlert.nextTab()
        return ;
    end

    local windowList = getSortedWindows(appName)
    if windowList == nil or #windowList == 0 then
        hs.application.launchOrFocus(launchName or appName)
        return ;
    end

    local title = appName
    tabAlert.startTab(tabName, title, windowList, 1)
end

⚠️ 문제 해결과정

  • 모달창 구현시 성능 이슈 (hs.drawing)
    • 반응이 너무 느려서 대신 hs.alert API를 사용했습니다.(only 텍스트)
  • 모달창으로 Alert API 사용하다보니 모달창의 가로 크기가 텍스트 길이에 따라 바뀌는 이슈
    • 헤더/푸터에 고정된 길이의 긴 가로선(—)을 넣어서 가로 크기가 고정되도록 했습니다.
  • 특정 앱의 오래된순으로 정렬된 창을 가져오는 API의 성능 이슈 (hs.window.filter)
    • 키를 누를때마다 api를 사용하지 않고 초기에 구독(subscribe) 함수를 사용해서 변수로 관리합니다.
      위 함수 때문에 초기 로딩이 몇 초 걸립니다.

✨ 완성

github : https://github.com/jys9962/my-hammerspoon/tree/main/libs/optionKey

위와 같이 만들어서 사용한지 이제 반년정도 된 것 같습니다.

가끔 앱을 추가로 등록하거나 수정하면서 쓰고 있습니다.

IDE, 웹브라우저, AI, DB Tool, iterms, notion, 카톡, 메모, 캡처 등 자주 쓰는 앱은 모두 등록해서 사용중입니다.


참고한 블로그: https://johngrib.github.io/wiki/hammerspoon/
공식문서: https://www.hammerspoon.org/docs/index.html

0개의 댓글