목록

Hammerspoon을 이용한 macOS 한영전환키 설정

Caps Lock이 싫어서

시에라 이후로는 CapsLock 키로 한영전환을 할 수 있게 되서 버릇을 고친 사람도 많겠지만, 미개한 나의 버릇을 고치기 보다는 컴퓨터에게 일 시키는 것이 더 편하다. 사실 Karabiner-elments를 설치하면 간단하게 해결할 수 있지만, 마음에 들지 않는 구석이 있어 다른 방법을 찾아보다가 Hammerspoon을 쓰게 되었다. 참고로 이 글은 macOS는 시에라 10.12.6, Hammerspoon은 0.9.55 버전을 기준으로 작성했다.

Hammerspoon

Hammerspoon은 macOS용 매크로라고 볼 수 있다. macOS에 JXA라고 해서 Javascript로 매크로를 짜는 방법도 있기는 한데, Hammerspoon의 경우에는 Lua(http://www.lua.org/)로 작성한 스크립트를 실행해준다. 오픈 소스 앱이고 무료이다. 우선 앱을 설치하면 다음과 같이 상단 메뉴 막대 우측에 망치모양의 아이콘이 추가된다.

Hammerspoon

ㅁ..망치숟가락!

여기서 Open Config을 선택하면 Hammerspoon이 실행하는 스크립트 파일이 열린다. 이 스크립트 파일은 ~/.hammerspoon/init.lua에 위치하고 있다. 그런데 내가 Lua 문법을 좀 아느냐 하면 잘 모른다. 그렇지만 한영키 전환 정도야 간단하리라는 희망을 품고 방법을 찾아보았다.

키 맵핑 적용하기

나의 긍정적인 예상대로(?) Hammerspoon의 GitHub wiki에서 내가 원하는 모듈을 찾을 수 있었다. 키를 리맵핑 할 때 쓸 수 있는 foundation_remapping 모듈을 쓰기로 하고 foundation_remapping.lua 파일을 내려 받았다.

내려 받은 foundation_remapping.lua 파일은 ~/.hammerspoon/ 디렉토리에 넣어준다. 개별 파일을 모듈로 쓸 수 있는 모양이다. init.lua 파일에 아래의 내용을 추가했다.

local FRemap = require('foundation_remapping')
local remapper = FRemap.new()

remapper:remap('ralt', 'f18')
remapper:register()

내려받은 모듈을 불러온 후에 우측 알트키를 f18에 맵핑 한 것 같다. 이렇게 해서 저장을 하고 다시 메뉴 막대의 망치를 눌러서 Reload Config을 실행한다. 이제 한영키가 잘 적용되었는지 해보면 아무 일도 일어나지 않았습니다.

시스템 환경설정

시스템 단축키 설정을 바꿔주어야 한다. 시스템 환경설정 - 키보드 - 단축키 - 입력소스 - 입력메뉴에서 다음 소스 선택을 고르고, 앞에서 열심히 맵핑한 오른쪽 Alt키에 넌 F18이고 난 주인이야를 외치면서 살며시 눌러본다. 그럼 아마 잘될 것이다. (부디…)

Hammerspoon Preference 창 자동으로 닫기

보통 맥 사용자라면 재부팅을 잘 하지 않지만 나에게는 컴퓨터는 껐다 켜야 제 맛 같은 습관이 있어서 사용을 마치면 전원을 꺼버리는 편이다. 그런데 부팅 때 마다 Hammerspoon을 실행시키도록 Launch Hammerspoon at login을 체크해 놓으면 매번 설정창이 등장해서 귀찮았다.

그래서 이 창을 닫는 스크립트를 추가해버렸다. Hammerspoon이 제공하는 타이머 기능이 문서에 정리되어 있는데, 그 중 하나를 사용했다.

Hammerspoon preference

악의 근원, Launch Hammerspoon at login

hs.timer.waitUntil(
    function()
        if (hs.window.find('Hammerspoon Preferences') == nil) then
            return false
        else
            return true
        end
    end,
    function()
        hs.window.find('Hammerspoon Preferences'):close()
    end,
500)

재부팅 해보면 아마 잘 될 것이다. (부디…)

결론

완료된 나의 init.lua 파일은 다음과 같다.

local FRemap = require('foundation_remapping')
local remapper = FRemap.new()

remapper:remap('ralt', 'f18')
remapper:register()

hs.timer.waitUntil(
    function()
        if (hs.window.find('Hammerspoon Preferences') == nil) then
            return false
        else
            return true
        end
    end,
    function()
        hs.window.find('Hammerspoon Preferences'):close()
    end,
500)

사실 이렇게 까지 할 필요가 있나, 습관을 고치면 편할 것을! 같은 생각이 들기도 하지만 1도 모르는 Lua를 (몇 줄 안되지만) 끄적거려본 나름 즐거운 시간이었다. end를 제대로 안써서 오류나고 그런 건 비밀이다. 모듈 불러올 때 require라서 왠지 익숙한 느낌적인 느낌이 들기도 했고.

그러나 애석하게도 이 후로는 아무 것도 자동화 하지 않았다는 슬픈 사연이…

2017년 12월 27일

© 2017 Hyunchul Kwak. All rights reserved.