문제 상황: 개발자의 일상적인 고민

PyCharm에서 IdeaVim을 사용하며 개발하다 보면 정말 자주 마주치는 상황이 있습니다. 한글로 주석을 쓰다가 ESC 키를 눌러 Normal 모드로 나온 후, 다시 명령어를 입력하려고 할 때 입력기가 여전히 한글 상태라 명령어가 제대로 작동하지 않는 것이죠.

왜 이런 문제가 발생할까요?

  • IdeaVim의 특성: IdeaVim은 영문 키 입력만을 Normal 모드에서 명령어로 해석합니다
  • 한글 상태의 문제: 한글 입력 상태에서는 Normal 모드 명령어가 제대로 동작하지 않습니다
  • 번거로운 작업: ESC → 한/영 키 → 명령어 입력이라는 반복적인 패턴

“ESC 한 번 누르고 한/영 한 번 누르면 되지 않나?“라고 생각할 수 있지만, 이는 생각보다 엄청나게 짜증나고 거슬리는 작업입니다.

해결책: AutoHotkey로 자동화하기

핵심 아이디어

ESC 키가 눌리면 무조건 영문으로 전환시킨다!

이 문제를 해결하기 위해 Windows의 강력한 자동화 도구인 AutoHotkey를 사용하겠습니다.

1단계: AutoHotkey 설치

AutoHotkey 스크립트를 실행하려면 먼저 AutoHotkey를 설치해야 합니다.

설치 링크: https://www.autohotkey.com

AutoHotkey는 Windows에서 키 입출력 관련 기능에 특화된 스크립트 언어로, 다양한 자동화 작업을 수행할 수 있습니다.

2단계: IME 상태 확인 코드

현재 입력기가 한글인지 영문인지 확인하는 기능이 필요합니다. 다음 코드를 사용하여 IME 상태를 확인할 수 있습니다:

/*
  IME check 
*/
IME_CHECK(WinTitle) {
  WinGet,hWnd,ID,%WinTitle%
  Return Send_ImeControl(ImmGetDefaultIMEWnd(hWnd),0x005,"")
}

Send_ImeControl(DefaultIMEWnd, wParam, lParam) {
  DetectSave := A_DetectHiddenWindows
  DetectHiddenWindows,ON
   SendMessage 0x283, wParam,lParam,,ahk_id %DefaultIMEWnd%
  if (DetectSave <> A_DetectHiddenWindows)
      DetectHiddenWindows,%DetectSave%
  return ErrorLevel
}

ImmGetDefaultIMEWnd(hWnd) {
  return DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)
}

3단계: ESC 키 자동 전환 스크립트

이제 ESC 키를 누르면 항상 영문 입력으로 전환되도록 하는 완전한 스크립트를 작성해보겠습니다:

$Esc::
    ret := IME_CHECK("A")
    if %ret% <> 0           ; 1 means IME is in Hangul(Korean) mode now.
        {
            Send, {Esc}
            Send, {vk15}    ; 한글인 경우 Esc키를 입력하고 한영키를 입력해 준다.
        }
    else if %ret% = 0       ; 0 means IME is in English mode now.
        {
            Send, {Esc}     ; 영문인 경우 Esc키만 입력한다.
        }
    return

/*
  IME check 
*/
IME_CHECK(WinTitle) {
  WinGet,hWnd,ID,%WinTitle%
  Return Send_ImeControl(ImmGetDefaultIMEWnd(hWnd),0x005,"")
}

Send_ImeControl(DefaultIMEWnd, wParam, lParam) {
  DetectSave := A_DetectHiddenWindows
  DetectHiddenWindows,ON
   SendMessage 0x283, wParam,lParam,,ahk_id %DefaultIMEWnd%
  if (DetectSave <> A_DetectHiddenWindows)
      DetectHiddenWindows,%DetectSave%
  return ErrorLevel
}

ImmGetDefaultIMEWnd(hWnd) {
  return DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)
}

코드 동작 원리

  1. IME 상태 확인: 현재 입력기가 한글(1) 또는 영문(0) 상태인지 확인
  2. 조건부 처리:
    • 한글 상태라면: ESC + 한/영 키 전송
    • 영문 상태라면: ESC 키만 전송
  3. 결과: 어떤 상태든 ESC 후에는 항상 영문 입력 상태가 됨

4단계: 스크립트 실행 및 테스트

  1. 위 코드를 esc_force_english.ahk 파일로 저장합니다
  2. 파일을 더블클릭하여 실행합니다
  3. Windows 우측 하단에 AutoHotkey 아이콘이 나타나면 실행 완료입니다

테스트 결과

스크립트 실행 후 테스트해보면:

  • 한글 입력 상태에서 ESC를 누르면 → 자동으로 영문 상태로 전환
  • 영문 입력 상태에서 ESC를 누르면 → 영문 상태 유지

정말 “개비스콘이 따로 없는” 효과입니다!

5단계: 시스템 시작 시 자동 실행 설정

매번 부팅할 때마다 스크립트를 수동으로 실행하는 것은 번거롭습니다. Windows 시작 시 자동으로 실행되도록 설정해보겠습니다.

Startup 폴더 활용

Windows에는 Startup 이라는 특수 폴더가 있습니다. 이 폴더에 저장된 바로가기 파일은 Windows 부팅 시 자동으로 실행됩니다.

Startup 폴더 경로:

C:\Users\[사용자명]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

빠른 접근 방법:

  1. Windows + R 키를 누릅니다
  2. shell:startup을 입력합니다
  3. Enter를 누르면 Startup 폴더가 열립니다

바로가기 파일 생성

  1. esc_force_english.ahk 파일을 우클릭합니다
  2. “바로가기 만들기"를 선택합니다
  3. 생성된 바로가기를 Startup 폴더에 복사합니다

완성! 이제 컴퓨터를 켜면 ESC 키가 항상 영문 전환!

설정을 완료하면:

  • ✅ Windows 부팅 시 자동으로 스크립트 실행
  • ✅ ESC 키를 누르면 항상 영문 입력 상태로 전환
  • ✅ 개발 시 한/영 키를 수동으로 누를 필요가 없음

추가 팁 및 주의사항

다른 환경에서의 응용

이 방법은 Windows 환경에서만 사용 가능합니다. 다른 운영체제의 경우:

  • macOS: Hammerspoon이나 Karabiner-Elements 사용
  • Linux: xkb-switch나 fcitx-remote 명령어 활용

스크립트 수정 및 확장

필요에 따라 스크립트를 수정할 수 있습니다:

; 다른 키에도 동일한 기능 적용
$F1::
    ret := IME_CHECK("A")
    if %ret% <> 0
        Send, {vk15}
    Send, {F1}
    return

성능 고려사항

  • AutoHotkey는 가벼운 프로그램이므로 시스템 성능에 큰 영향을 주지 않습니다
  • 메모리 사용량도 매우 적습니다 (보통 1-2MB 수준)

exe 파일 다운로드 받기

바이너리로 컴파일 된 auto-hotkey 파일은 아래 주소에서 받을 수 있습니다.

마무리

이제 더 이상 ESC 키를 누른 후 한/영 키를 따로 누를 필요가 없습니다!

IdeaVim이나 다른 Vim 에뮬레이터를 사용하는 개발자라면 이 설정으로 인해 개발 효율성이 크게 향상될 것입니다. 작은 자동화 하나가 개발 경험을 얼마나 개선시킬 수 있는지 보여주는 좋은 예시라고 생각합니다.

개발자의 시간은 소중하니까요! 이런 반복적인 작업은 자동화로 해결하고, 더 중요한 코딩에 집중하시길 바랍니다.


참고: 이 글은 실제 개발 환경에서 겪은 불편함을 해결하기 위한 실용적인 방법을 소개합니다. AutoHotkey의 더 많은 활용법이 궁금하시다면 공식 문서를 참고해보세요!