나빌 입력기 for 맥을 수정하여 세벌식 모아치기 e 자판을 구현한 macOS 용 한글 입력기
이름은 세벌식 모아치기 e 자판을 부르는 약자인 세모이에 입력기(Input Method)를 뜻하는 IM을 붙여서 지었다.
- 세모이
- 두벌식
세벌식(특히 세벌식 모아치기 e 자판)에 관심이 생겼는데 macOS를 사용하고 있어서 날개셋 입력기 사용이 불가능한 상태였다. 구름 입력기나 Karabiner-Elements 기반으로 구현된 자판을 사용해보았는데 이어치기와 모아치기가 모두 잘 동작하면서 약어까지 잘 사용할 수 있는 상태는 아닌 것으로 보였다. 그러다 마침 세벌식 다음 카페에서 숨통님이 macOS 용 세벌식 한글 입력기인 팥알 입력기를 만드셨다는 게시물을 보게 되었다.
팥알 입력기가 세모이 자판은 지원하지 않는 것 같아서 추가해보려고 시도했다. 먼저 모아치기가 부분적으로 구현되어 있는 것 같아서 이걸 완성해보려고 시도했는데, 한글 조합 과정의 복잡한 논리를 구현하기가 쉽지 않았다. 팥알 입력기의 README를 읽다가 참고한 프로젝트로 나빌 입력기 for 맥이 링크되어 있길래 들어가서 코드를 읽어보니 여기서 출발하는 게 조금 더 쉬울 것 같다는 생각이 들었다.
그래서 나빌 입력기 for 맥을 바탕으로 세모이 자판과 몇 가지 필요하다고 느꼈던 기능을 구현하였다.
처음에는 나빌 입력기 for 맥을 수정하여 세모이 자판과 추가 기능을 구현하고자 하였는데 세벌식 318 및 390 자판에서의 동작을 확인하기 어려워서 사용하지 않는 자판을 삭제하고 프로젝트를 분리하였다.
프로젝트 구성과 핵심 코드 대부분을 나빌 입력기 for 맥에서 가져왔다. 위 레포지토리의 README에 코드에 관한 설명을 구체적으로 해두셔서 정말 큰 도움이 되었다.
일단 날개셋 입력기에서 세모이 자판을 사용해본 적이 없어서 세모이를 만드신 신세기님이 의도하신대로 자판이 동작하는지 확인하지는 못했다. 그냥 구름 입력기, Karabiner-Elements로 구현된 세모이 자판을 사용해보면서 필요하다고 느꼈던 기능을 구현했다.
"서울"을 모아치기로 입력할 때, "서"를 입력한 상태에서 "울"의 종성인 "ㄹ"을 가장 먼저 입력하는 경우 "설우"가 될 수 있다. 이를 방지하기 위해서 다음과 같은 조건을 가지고 종성을 다음 글자로 넘기는 기능을 구현하였다.
- 현재 입력 중인 글자에 종성이 존재하고,
- 이번 입력된 낱자로 인해 다음 글자로 넘어가게 되는 시점에,
- "서울" 예시에서는, "설"이 입력된 상태에서 "ㅇ" 이나 "ㅜ" 가 입력되는 시점이라고 보면 됨
- 직전 키와 입력 시간 간격이 임계치(기본적으로 150 ms) 미만인 경우
- 최근 연속 입력된 모든 종성을 다음 글자로 넘긴다.
일단 IMKit 에서는 keyUp 이벤트를 기본적으로 처리하지 못하는 것으로 보인다.
그래서 기존과 같이 keyDown 시 입력을 처리하는 구조에서 약어 매칭을 진행하는 입력 대기열을 만들어서 약어를 구현했었다. 그리고 나니 keyDown 시 입력을 처리하면 약어 시퀀스를 포함하는 글자를 입력하는 게 어렵다는 것을 깨달았다.
예를 들어 jw 또는 wj를 입력하면 입니다. 로 확장되어야 하는데, jdw를 입력하면 입이라는 글자가 입력되어야 한다.
근데 모아치기가 가능하니 입을 입력할 때는 jdw가 아니라 jwd나 dwj와 같이 입력해도 된다.
이때 jwd는 입이 아니라 입니다.ㅣ가 되어 버리고, dwj는 ㅇ입니다.가 되어 버리는 문제가 발생한다.
그래서 keyUp 시 입력 이벤트를 처리할 수 있도록 수정하였다. keyUp 이벤트를 정상적으로 모니터 하려면 손쉬운 사용 권한을 허용해야 한다.