Hammerspoon 튜토리얼 03 - 한영 전환 키를 만들어 봅시다
Esc - 영문전환도 만들어 봅시다
콘솔을 열어 봅시다
![]()
- 상단 메뉴의 Hammerspoon 아이콘을 클릭하고,
Console...을 선택하면 콘솔이 열립니다.
이제부터는 사용자에게 메시지를 전달하려는 목적이 아니라면 hs.alert.show 함수의 사용은 지양하고 콘솔을 사용하도록 하겠습니다.
입력 소스를 확인해 봅시다
한영 전환 키를 만들기 위해선 일단 입력 소스를 확인할 수 있어야 합니다.
일단 다음과 같이 lua 코드를 작성하고 실행해 봅시다.
hs.hotkey.bind({'cmd'}, 'i', function()
local input_source = hs.keycodes.currentSourceID()
print(input_source)
end)
- 영문으로 전환 후
cmd+i - 한국어로 전환 후
cmd+i
그리고 콘솔을 확인해 보니 다음과 같이 나와 있습니다.
2017-08-05 10:43:00: com.apple.keylayout.ABC
2017-08-05 10:43:02: com.apple.inputmethod.Korean.2SetKorean
출력 결과를 살펴보면 각각 영문 입력 소스와 한국어(두벌식) 입력 소스의 아이디라는 것을 알 수 있습니다.
한영 전환 키를 만들어 봅시다
로직은 다음과 같이 단순합니다.
- 만약 영문이면 => 한국어로 전환
- 그 외의 경우 => 영어로 전환
do -- input sorce changer
local inputSource = {
english = "com.apple.keylayout.ABC",
korean = "com.apple.inputmethod.Korean.2SetKorean",
}
local changeInput = function()
local current = hs.keycodes.currentSourceID()
local nextInput = nil
if current == inputSource.english then
nextInput = inputSource.korean
else
nextInput = inputSource.english
end
hs.keycodes.currentSourceID(nextInput)
end
hs.hotkey.bind({'shift'}, 'space', changeInput)
-- hs.hotkey.bind({}, 'F14', changeInput)
end
- 전역 네임스페이스를 더럽히고 싶지 않기 때문에
do-end로 스코프를 지정했습니다. inputSource: 위에서 알아낸 입력 소스의 아이디 목록입니다.
이제부터 shift+space를 입력하면 한/영 전환이 이루어집니다.
만약 윈도우즈처럼 사용하고 싶다면 오른쪽 cmd키를 F14 등으로 매핑한 다음 바인딩해주기만 하면 됩니다.
이거라면 다른 맥 컴퓨터를 구매해서 세팅할 때에도 한/영 전환 때문에 고생하지 않아도 되겠네요.
무조건 중국어로 전환하는 단축키나 무조건 태국어로 변환하는 단축키 등을 만들어 붙일 수 있으므로 3개 이상의 언어를 사용하는 경우에도 편리할 수 있겠다는 생각도 듭니다.
덧붙여, 만약 입력 소스를 변경할 때마다 hs.alert.show로 변경한 입력 소스의 이름을 알려준다면
유료 앱인 isHud을 설치했을 때와
똑같이 사용할 수 있습니다.
아무래도 개발자 입장에서는 직접 기능을 변경할 수 있다는 점에서 Hammerspoon이 좀 더 편리하군요.
f13 키를 영문 전환 기능이 있는 escape 키로 만들어 봅시다
그렇다면 이번엔 Vim 사용자들에게 유용한 기능을 만들어 봅시다.
- 영문 상태에서
f13키를 입력하면escape키로 작동합니다. - 한국어 상태에서
f13키를 입력하면 영문으로 전환하고escape키 입력을 보냅니다.
local caps_mode = hs.hotkey.modal.new()
local inputEnglish = "com.apple.keylayout.ABC"
local on_caps_mode = function()
caps_mode:enter()
end
local off_caps_mode = function()
caps_mode:exit()
local input_source = hs.keycodes.currentSourceID()
if not (input_source == inputEnglish) then
hs.keycodes.currentSourceID(inputEnglish)
end
hs.eventtap.keyStroke({}, 'escape')
end
hs.hotkey.bind({}, 'f13', on_caps_mode, off_caps_mode)
- 참고: 저는
capslock키를f13키로 사용하고 있으므로 모드의 이름을caps_mode라고 지었습니다.
위와 같이 하면 Vim에서 escape를 누르기 전에 영문으로 전환하는 귀찮은 일을 하지 않아도 됩니다.
한글 마지막 글자가 사라지는 문제
하지만 그것은 희망 사항일 뿐이고, 실제로 터미널/터미널 Vim에서 한국어로 타이핑하다 F13을 입력해봐도
생각만큼 매끄럽게 작동하지 않는 것을 알 수 있습니다.
마지막 한국어 한 글자가 사라지거나, 먼저 사라졌던 한 글자가 새로 타이핑할 때 앞에 들어가는 경우가 생깁니다.
이 문제를 우회하려면 한국어로 타이핑하다가 오른쪽 방향키를 한 번 누르거나 스페이스를 하나 추가한 다음
영문 전환을 하고 escape 키를 누르면 됩니다. 음. 우아하진 못하군요.
사실 저는 구름 입력기를 사용해왔지만 구름 입력기에서도 비슷한 문제가 발생하기 때문에 이 문제를 Hammerspoon으로 해결하여 사용하고 있습니다.
(이건 애플이 해결해주면 좋을 텐데 언제 해줄지 모르겠네요)
우아함과 거리가 있긴 하지만 제가 사용하고 있는 해결책은 다음과 같습니다.
local input_source = hs.keycodes.currentSourceID()
if not (input_source == inputEnglish) then
hs.eventtap.keyStroke({}, 'right')
hs.keycodes.currentSourceID(inputEnglish)
hs.eventtap.keyStroke({}, 'escape')
end
hs.eventtap.keyStroke({}, 'escape')
위와 같이 하면 맥 기본 한글 입력기, 구름 입력기, 터미널, 터미널 Vim, MacVim, 평범한 워드 프로세서 가리지 않고 기대한 대로 작동합니다.
덧붙임
그럼에도 불구하고 저는 구름 입력기를 사용하고 있습니다. 구름 입력기가 없으면 한글 입력 상태일 때 Vimium이 작동하지 않기 때문입니다. 이 문제도 Hammerspoon으로 해결할 수는 있겠지만 번거롭기도 하고, Hammerspoon 설정이 너무 복잡해지는 건 바라지 않기 때문이기도 합니다.