vim(ideaVim) - ESC 키를 누르면 항상 영어 입력상태가 되도록 하기

full_accel·2020년 11월 29일
2

한글로 주석 쓰다가 esc로 나갈 때마다 한/영 키 누르기 귀찮다!

Pycharm에서 ideaVim으로 개발을 하다보니 한/영 키 눌러주는 것이 아주 공수가 많이 드는 귀찮은 작업이라는 걸 알게되었다.

ideaVim은 영문 키 입력만을 Normal 모드에서 명령어로 제대로 해석한다. 따라서 한글 상태에서는 Normal 모드에서 명령어 입력이 되지 않는다.

한글로 주석 쓰다가 ESC 눌러서 Normal 모드로 나간뒤에 명령어를 입력하면 Pycharm은 우물쭈물거린다.

이게 ESC 한 번 누르고 한/영 한 번 누르면 되지 라고 생각할 수도 있는데, 생각보다 엄청나게 짜증나고 거슬렸다. 그리하여 방법을 찾아 보았다.

AutoHotkey로 영문 강제전환 매크로 돌리기

내가 생각한 결론: ESC가 눌리면 무조건 영문으로 전환시킨다.

이를 구현하기 위해 구글링을 해보니 나와 비슷한 문제로 고통 받았던 선각자가 있었음을 알게되었다.

선각자님께서 찾은 해법은 AutoHotkey였고 나도 그 깨달음을 이어받기로 했다.

AutoHotkey 설치

AutoHotkey 스크립트를 돌리려면 일단 AutoHotkey가 설치되어 있어야 한다.
아래의 링크에서 설치 가능하다.
https://www.autohotkey.com

IME_CHECK 코드

AutoHotkey는 기본적으로 윈도우에서 자동으로 핫하게 키를 컨틀롤 해보자(?)는 모토로 만들어진 스크립트언어 로 키 입출력 관련 기능들에 특화되어 있는 것으로 알고 있다.

선각자 분께서 작성하신 코드에서 IME check 부분이 현재 한글인지 영문인지 확인하는 기능을 함을 알게되었다. 이 부분의 코드를 감사히 쓰기로 했다.

/*
  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)
}

ESC 키를 누르면 항상 영문 입력으로 전환되도록하는 코드

위의 IME_CHECK 코드를 이용하여 ESC를 입력하면 항상 영문 입력으로 전환되도록하는 AutoHotkey 스크립트를 작성하였다.

$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)
}

위의 코드를 esc_force_english.ahk로 저장하였다.

스크립트 파일을 더블클릭하면 윈도우 우측 하단에 AutoHotkey가 실행중임을 알리는 아이콘이 나타난다.

스크립트를 실행해보니 정상동작(esc를 누르면 항상 영문 입력상태로 전환)한다. 개비스콘이 따로 없다!

윈도우 부팅시 AutoHotkey 스크립트 자동 실행되도록 하기

서있으면 앉고 싶고, 앉아 있으면 눕고 싶은게 인간인지라, 이번엔 매번 윈도우 부팅시마다 AutoHotkey 스크립트 파일을 더블클릭하여 실행하는 것이 은근히 귀찮았다. 자동화 해보자!

윈도우 Startup 폴더에 AutoHotkey 스크립트 파일 저장

윈도우에는 Startup 이라는 특수폴더가 있다. 이 폴더에 저장된 바로가기 파일은 윈도우 부팅시 자동 실행된다.

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

또는 실행에서 shell:startup 입력하여 간단히 접근할 수 있다.

이 경로에 AutoHotkey 스크립트 바로가기 파일을 저장한다.

이제 윈도우가 부팅되면 Startup 경로에 저장된 AutoHotkey 스크립트가 자동 실행된다. 따라서 컴퓨터를 키고 ESC 키를 누르면 항상 영문 입력 상태가 된다!

profile
스스로 배운 것이 오래 간다.

1개의 댓글

comment-user-thumbnail
2022년 10월 7일

문의 드립니다. 이전 버전의 Microsoft IME 를 활성화 해야지만 정상동작을 합니다.
호환성을 켜지 않으면, ESC 입력 할때마다 한글, 영문 이 계속 변경됩니다.
Windows 11 (버전 : 22H2) IME와 IME_CHECK함수가 맞지 않는 것 같습니다.
혹시 개선할 수 있는 방안이 있을런지요?

답글 달기