macOS용 Emacs에서 좀 더 편한 한글 입력 환경 구축하기 (feat. Hammerspoon)

Emacs, macOS // 2025년 03월 05일 작성 // 2025년 03월 12일 업데이트

Emacs를 메인 에디터로 쓰는 사람으로써 '원활한 한글 입력'은 여러 면에서 중요하다. 특히 Emacs로 글도 쓴다는 점에서 한글 입력이 좀 더 완벽(?)에 가까워야 할 필요가 있다. 물론 이런 글을 쓴다는 건 기본적으로 macOS에서 Emacs의 한글 입력이 완벽하진 않다는 걸 의미한다. 여기에는 여러 문제가 누적되어 있다.

원초적인 문제를 정의하자면 macOS의 한글 입력기와 Emacs와의 상성이 그다지 좋지 못하다는 점이 있다. 가끔 입력이 씹히기도 하고 퍼포먼스 문제를 일으키기도 한다. 그리고 그게 버전 업을 거듭하다 Emacs 30에 와서는 더더욱 심해지는 느낌이다. 참고로 구름과 같은 오픈소스 한글 입력기도 비슷한 문제가 발생하고 있어서 별 도움이 안 된다.

그래서 macOS에서 돌아가는 Emacs에서는 내장 한글 입력기로 한글을 입력하는 게 많은 스트레스를 해소할 수 있는 편이다. 하지만 이를 위해 또다른 많은 문제를 해결해야 했다. 여러 삽질 끝이 이 문제들을 해결하는 데 성공했기에 세 가지 주제로 나누어 정리해 본다.

참고로 이 글에서는 Hammerspoon📎을 중요한 도구로 사용한다.

Shift+Space로 Emacs 내장 입력기 한영 전환하기

DOS 시절부터 개인적으로 한글 입력기 전환에 Shift+Space 키를 써왔다. 그래서 맥에서도 이 한영전환 단축키로 Shift+Space를 써왔다. 그런데 가장 큰 문제의 출발은 이거다. 옛날 macOS에서 돌아가던 Emacs는 Shift+Space 키가 입력되면 이를 Emacs가 잘 받아서 뭐라도 할 수 있었다. 하지만 요즘은 Shift+Space 키를 입력하면 이 키 이벤트가 Emacs까지 도달하지 않는 문제가 있다. 즉 macOS에서 입력기 전환에 Shift+Space키를 설정해서 쓰고 있다면 이 단축키는 Emacs 내장 입력기 토글 용으로 쓸 수 없다는 말이다.

이 문제는 macOS의 근본적인 뭔가가 바뀌지 않는 한 순수하게 해결은 불가능하다. 대신 몇몇 유틸리티를 이용해 대안적으로 해결이 가능하긴 한데 이 글에서는 Hammerspoon을 이용한다. 무료이니 말이다.

결국 Hammerspoon을 이용해 Emacs 창이 최상단에 있는 경우 Shift+Space 키가 입력되면 이를 무시하고 대신 Ctrl+\ 키로 바꿔서 Emacs에 전달하도록 구현하는 데 성공했다. 참고로 C-\ 키는 Emacs의 기본 내장 입력기 토글(toggle-input-method) 단축키다. 아래는 실제로 구현한 Hammerspoon 용 Lua 스크립트다.

local function remapKeys(event)
    local flags = event:getFlags()
    local keyCode = event:getKeyCode()
    local app = hs.application.frontmostApplication()
    local bundleID = app:bundleID()
    local targetAppBundleID = "org.gnu.Emacs"

    if bundleID == targetAppBundleID then
        if flags.shift and keyCode == hs.keycodes.map.space then
            hs.eventtap.keyStroke({'ctrl'}, "\\")
            return true
        end
    end
    return false
end

keyRemapper = hs.eventtap.new({hs.eventtap.event.types.keyDown}, remapKeys)
keyRemapper:start()

이 코드를 적용하면 이후 Shift+Space 키를 눌렀을 때 macOS의 입력기가 아닌 Emacs의 내장 입력기가 토글되는 아름다운 결과를 얻을 수 있었다. 즉 목적을 달성했다. 참고로 Hammerspoon 버전에 따라 코드가 달라질 수 있다는 점에 주의하자.

코드를 몇 줄 더 줄일 여지는 충분하니 하고 싶다면 직접 알아서 해보자. 이젠 귀찮아서 잘 돌아가는 코드를 고치는 건 사양하고 싶을 뿐이니 말이다.

Emacs 창이 활성화되면 macOS 입력기를 영문으로 전환하기

그런데 위의 Shift+Space로 Emacs 내장 입력기를 토글시키는 Hammerspoon 코드를 작성한 이후 새로운 문제를 겪게 된다. 바로 macOS의 한글 입력기와 Emacs 내장 한글 입력기의 무한 순환 문제다.

이 문제는 macOS의 입력기가 한글인 상태로 Emacs 창에 포커스가 가면 그 때부터 발생한다. macOS 입력기가 한글이니 뭐든 입력하면 Emacs에서도 한글이 입력된다. 그런데 이걸 끄기 위해 Shift+Space를 눌러도 Emacs 내장 입력기만 바뀔 뿐 macOS 입력기는 계속 한글 상태가 유지된다. 결국 무한의 '한글만 입력' 지옥이 펼쳐진다.

물론 이 경우 마우스를 이용해 macOS 입력기를 영어로 바꿔주면 바로 해결이 되어서 사실 별 일 아닌 문제가 될 수도 있다. 하지만 키보드만 쓰길 원하는 사용자에겐 여간 귀찮은 일이 아니다.

그래서 이런 문제를 원천적으로 해결하는 게 필요하다. 간단하게 Emacs 창이 제일 위로 올라오게 되면 macOS 입력기를 자동으로 영문으로 바꾸도록 하면 될 것 같다. 그래서 또다시 Hammerspoon을 들쑤셨다.

function setEnglishInputMethod()
    local source = hs.keycodes.currentSourceID()
    if not (source == english) then
        hs.keycodes.currentSourceID(english)
    end
end

local function focusChanged(appName)
    if appName == "Emacs" then
        setEnglishInputMethod()
    end
end

appWatcher = hs.application.watcher.new(function(name, eventType, app)
    if eventType == hs.application.watcher.launched or eventType == hs.application.watcher.activated then
        focusChanged(name)
    end
end)
appWatcher:start()

위의 코드를 추가해서 Hammerspoon에서 재로딩을 하니 원하던 대로 이제 Emacs 창에 포커스가 가면 macOS 입력기가 영문으로 바뀐다. 이제 한글 입력기가 계속 안 사라지는 문제는 발생할 일이 거의 없어진 셈이다. 상당히 마음이 놓이게 된 소중한 코드다.

기존 코드는 좀 쓰다 보면 동작을 안 할 때가 있어서 전역 변수에 담아 가비지 콜렉션에 휩쓸리지 않도록 수정했다.

ESC 키를 누르면 Emacs 내장 입력기를 영문으로 전환하기

사실 이건 꼭 필요한 건 아니지만 개인적으로 Vim을 써울 때부터 생긴 성향으로 ESC 키를 누르면 영문 입력 모드로 바뀔 필요가 있는데 Vim에서 상당한 효율 상승이 있기 때문이다. 비록 Emacs에서 (Doom Emacs를 통해) Evil을 쓰고 있긴 하지만 그 성향은 아직도 남아있다.

이번에는 Emacs 내에서만의 문제이기 때문에 아래와 같은 Emacs Lisp 코드를 작성해서 설정 파일에 추가하는 식으로 해결할 수 있었다. 참고로 좀 하드하게 설정된 Doom Emacs를 사용 중이라 바닐라의 경우 동작 여부는 보장할 수 없을 것 같다.

;; 기본 입력기를 한글 2벌식으로 설정
(setq default-input-method "korean-hangul")

(defun seorenn/esc-additional-function (&optional ARG)
  (set-input-method nil)
  ;; 위 코드가 실행되면 기본 입력기 설정이 nil로 바뀌니 다시 업데이트
  (setq default-input-method "korean-hangul"))

;; ESC 키가 눌리며 실행되는 함수에 추가 기능 부여하기
(advice-add 'evil-normal-state :before #'seorenn/esc-additional-function)

코드에 삽질의 흔적이 약간 보일 것이다. 저 요상하고 보기 싫은 중복 코드가 없으면 입력기를 토글할 때마다 언어 세팅을 물어와서 너무 귀찮았기 때문에 어쩔 수 없는 타협이다.

어쨌거나 이제 정말 마음에 드는 세팅이 되었다.

마무리

이제 Shift+Space 키를 이용해 macOS에서 돌아가는 Emacs에서 한영 전환을 손쉽게 할 수 있게 되었고 거기다 퍼포먼스 저하나 입력 유실 없이 한글을 편하게 쓸 수 있게 되었다. 거기다 ESC 키를 누르면 영문으로 자동으로 바껴서 Vim(Evil) 커맨드를 입력하는 데 지장도 없게 되었다. 만족스럽다.

덕분에 Emacs에서 macOS 한글 입력기를 쓰다 받은 스트레스가 그렇게다 컸다는 것을 잘 알게 된 것 같다. 정말 눈물나게 편하다.