입력기(input method), Windows IME와 충돌 해결

1 minute read

키보드에 없는 문자인 한글을 어떻게 쓸 수 있는 걸까? 입력기(input method)가 그 역할을 해준다.

emacs는 input method를 내장하고 있다. 직접 구현하기가 힘들어서 그렇지 내장하면 좋은 점이 많다. 섬세하게 컨트롤 할 수 있기 때문. 예로 evil 모드를 쓰는 경우 normal 상태에서 한글 입력을 아예 막아버릴 수 있다. 여기까진 좋다. 하지만 OS를 고려해 만들지는 않았다. windows에서는 IME 메시지를 처리해주면 되는데, 처리를 안 해서 한영 전환키도 OS에서 먹어 버린다.

조합이 끝나면 완성된 글자 하나씩 버퍼에 찍혔다. 한글을 입력하는데, 한글이 조합되는 과정이 emacs에서는 하나도 안 보였다. 충돌이 발생했구나!

OS가 입력기를 처리 안 하면 간단히 해결된다. emacs에 다 맡겨버리면 되니깐. 하지만 windows에는 이런 기능이 없다. 구글링을 해보니 나만 이 문제를 겪은 게 아니구나. 참고해서 문제를 해결했다.

전략은 다음과 같다. S-SPC 는 emacs에 그대로 보낸다. emacs를 제외한 다른 프로그램은 S-SPC한글 키 로 바꿔서 보내준다. 이렇게 하면 emacs input method를 그대로 사용할 수 있고 S-SPC 를 다른 프로그램에서도 한영 전환 키로 사용할 수 있다.

한국어 101 키 유형 3 USB 키보드를 사용하고 있었다. 이제 키 유형을 바꿔야 한다. 왜냐면 S-SPC 를 OS IME에서 처리 안 하고 emacs에 보내야 하기 때문. 오른쪽 Alt, Ctrl 을 각각 한글, 한자 키로 사용하는 키 유형을 선택했다. 레지스트리를 변경해서 한국어 101 키 유형 1 USB 키보드 으로 바꿨다.

#IfWinNotActive, ahk_class Emacs
+space::Send, {vk15sc138}

AutoHotkey 스크립트를 작성. emacs 빼고 나머지는 S-SPC한글 키 로 바꿔서 보낸다. 여기서 한글키는 {vk15sc138}.

잘된다. =S-SPC=를 한글 키로 사용할 수 있고 emacs에서도 입력기 전환이 잘된다.

#HotIf !WinActive("ahk_class Emacs")
+space::Send "{vk15sc138}"

AutoHotKey v2에서는 이렇게 스크립트를 바꿔주면 된다.

language environment

C-h L Korean

한국어 언어 환경을 볼 수 있다. input methods, character sets, coding system (encoding이 친숙한데, 여기선 그냥 coding이라 부른다) 등을 언어에 맞게 설정한 묶음이다. 만약 이런 묶음이 없다면 하나하나 다 설정해줘야 한다. 편하지.

(set-language-environment "Korean")

언어 환경을 설정하자. 여러 설정을 한 번에 해준다.

(prefer-coding-system 'utf-8)

한글 언어 환경에서 cp949 가 기본 인코딩. 선호하는 인코딩을 utf-8 로 변경했다.

modeline

이제 S-SPC 를 입력해서 한글 입력기로 전환한 뒤 글자를 치면 조합하는 과정이 다 보인다. 그리고 modeline한2 가 표시된다. 한글 두벌식 입력기라는 뜻.

<2023-03-20 Mon> Update: AutoHotKey v2 스크립트 추가

C-x C-s C-x C-c