macOS에서 한영전환키를 Emacs에서도 사용하기 (Hammerspoon)
이 글의 해법은 어느 정도 시간이 지나면 먹통이 되는 문제가 있어 다른 방법을 연구 중입니다.
과거에는 좀 달랐지만 언제부턴가 macOS에서 한영전환키를 누르며 이 키 입력이 Emacs에 닿지 않게 되었다. 그래서 Emacs 내장 한글 입력기로 전환하기 위해서는 C-\
등 다른 단축키를 이용해야 했다. 하지만 헷갈려서 내장 입력기 전환은 거의 사용하지 않았고 macOS 자체 입력기를 쓰는 것도 그다지 무리는 없어서 쓰고는 있었다.
그런데 최근 macOS의 한글입력기 문제인지 아니면 Emacs 29 최신 버전의 문제인지 아니면 Evil과의 환상 조합 오작동인지 하여간 한글 입력이 조합 도중 씹히거나 사라졌다가 나중에 다시 나타나는 등 요상한 문제를 겪기 시작했다.
결국 근본적인 해결이 필요할 것 같아 방법을 찾아보다 기존에 종종 사용하던 Hammerspoon을 통해 해결할 수 있을 것 같아 약간의 삽질을 하다 겨우 성공하였다.
문제 해결하기
이 방법은 'Emacs를 쓸 때는 시스템의 한영전환키를 씹어버리고 Emacs 내장입력기 전환 키로 바꿔서 던지는 식'으로 동작하는 Hammerspoon용 LUA 코드로 구현했다.
local englishIMID = "com.apple.keylayout.ABC"
function setEnglishInputMethod()
local source = hs.keycodes.currentSourceID()
if not (source == englishIMID) then
hs.keycodes.currentSourceID(englishIMID)
end
end
hs.eventtap.new({hs.eventtap.event.types.keyDown, hs.eventtap.event.types.systemDefined}, function(event)
local type = event:getType()
local flags = event:getFlags()
local keycode = event:getKeyCode()
local app = hs.application.frontmostApplication()
if type == hs.eventtap.event.types.keyDown and app:bundleID() == "org.gnu.Emacs" then
if flags.shift and keycode == hs.keycodes.map.space then
setEnglishInputMethod()
-- remap to C-\
hs.eventtap.event.newKeyEvent(hs.keycodes.map.ctrl, true):post()
hs.eventtap.event.newKeyEvent("\\", true):post()
hs.eventtap.event.newKeyEvent("\\", false):post()
hs.eventtap.event.newKeyEvent(hs.keycodes.map.ctrl, false):post()
return true
else
return false
end
else
return false
end
end):start()
bundle ID나 단축키 이름만 잘 바꾸면 어떤 앱이든 원하는 대로 단축키를 바꿀 수 있다. 그저 키 바꿔치기를 하는 경우에는 return
값에 주의하면 된다. true
를 반환하면 기존에 입력된 키 스트로크를 무시시켜 버리기 때문이다.
setEnglishInputMethod()
함수는 주제에는 조금 벗어나 보이겠지만 중요한 문제를 예방하기 위해 사용한다. 예를 들어 macOS의 입력기가 한국어인 상태로 Emacs에 진입했다간 영문모드로 전환할 수 없는 불상사가 생기기 때문이 이를 막기 위해 시스템 입력기를 영어로 바꾸는 코드다. 만약 영문 입력기를 별도로 설치한 다른 것을 쓴다면 해당 입력기 ID로 고쳐주자.