시에라 이후로는 CapsLock 키로 한영전환을 할 수 있게 되서 버릇을 고친 사람도 많겠지만, 미개한 나의 버릇을 고치기 보다는 컴퓨터에게 일 시키는 것이 더 편하다. 사실 Karabiner-elments를 설치하면 간단하게 해결할 수 있지만, 마음에 들지 않는 구석이 있어 다른 방법을 찾아보다가 Hammerspoon을 쓰게 되었다. 참고로 이 글은 macOS는 시에라 10.12.6, Hammerspoon은 0.9.55 버전을 기준으로 작성했다.
Hammerspoon은 macOS용 매크로라고 볼 수 있다. macOS에 JXA라고 해서 Javascript로 매크로를 짜는 방법도 있기는 한데, Hammerspoon의 경우에는 Lua(http://www.lua.org/)로 작성한 스크립트를 실행해준다. 오픈 소스 앱이고 무료이다. 우선 앱을 설치하면 다음과 같이 상단 메뉴 막대 우측에 망치모양의 아이콘이 추가된다.
ㅁ..망치숟가락!
여기서 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을 실행시키도록 Launch Hammerspoon at login
을 체크해 놓으면 매번 설정창이 등장해서 귀찮았다.
그래서 이 창을 닫는 스크립트를 추가해버렸다. Hammerspoon이 제공하는 타이머 기능이 문서에 정리되어 있는데, 그 중 하나를 사용했다.
악의 근원, 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
라서 왠지 익숙한 느낌적인 느낌이 들기도 했고.
그러나 애석하게도 이 후로는 아무 것도 자동화 하지 않았다는 슬픈 사연이…