[VIM][OS X]한글 입력 상태에서 노멀모드 복귀 후 영어 입력소스로 전환하기 (feat. hammerspoon, autohotkey)

VIM 입력 Mode 와 한영전환 이슈

intelliJ와 vsCode 를 사용하여 개발을 하고 있다. intelliJ와 vsCode 는 extension 의 형태로 vim 을 텍스트에디터에서 사용할 수 있도록 제공해주고 있다. vim 과 함께라면 각 IDE 가 제공하는 기본적인 코드 에디팅 기능과 함께 함께 매우 뛰어난 시너지 효과를 만들어낼 수 있다. 

 

하지만, vim 을 사용하는 것이 주류는 아니기에, 아무래도 vim 의 사용에 있어서 몇 가지 불편한 점들이 있다. 그러한 불편한 점들 중에 하나를 소개하고자 한다. Normal Mode 에서 한글로 문서를 작성하다가 escape 후 Insert Mode 로 전환할 때, 입력소스를 영어로 전환을 해주어야만 커서 이동을 해줄 수 있다. 

 

보통 3~4개 정도의 key loss(한글로 입력되어 아무런 영향이 없음) 가 발생하는데, 이게 상당한 스트레스를 불러 일으킨다. (적어도 내게는 그랬다... 한영전환 필요 없는 서양권 친구들이 부럽다... 그래도 세종대왕님 사랑해요.

 

이러한 이슈를 해결해보고자 검색을 시전했고, 몇 가지 방법을 발견할 수 있었다. 그 중에 가장 나은 방법이라고 생각되는 방법을 이 글에서 소개하기로 한다.

참고자료

https://johngrib.github.io/blog/2017/05/04/input-source/

https://github.com/johngrib/simple_vim_guide/blob/master/md/with_korean.md

VIM Mode 변경과 Normal Mode로 복귀하는 다양한 방법 

VIM 은 기본적으로 세 가지 모드를 제공한다. Normal Mode, Insert Mode, Visual Mode 가 그것이다. Normal 모드에서는 마우스나 터치패드와 같은 GUI에 특화된 입력장치가 없이도 키보드만으로 커서의 이동을 할 수 있다. Insert Mode는 우리가 일반적으로 사용하는 텍스트 에디팅 기능이라고 생각할 수 있다. vim 을 실행하게 되면 기본적으로 Normal모드로 시작된다. 이 때 특정한 문자를 입력하고 싶다면, 'i' 키를 눌러 INSERT 모드로 진입해야 한다. 타이핑을 마친 후 다시 Normal모드로 복귀하고 싶다면, 'escape' 키를 눌러 Normal Mode로 복귀할 수 있다. 

Insert Mode 에서 Normal Mode로 복귀하는 네 가지 방법

Insert Mode에서 Normal 모드로 복귀하는 주요한 방법은 다음과 같은 방법들이 있다. 

  • escape
  • <C-[> (컨트롤과 '[') - 추천!!
  • <C-c> (컨트롤과 'c')
  • <C-o> (컨트롤과 'o')

일반적으로, escape 를 많이 사용할 것이다. 하지만 새끼손가락이 esc 로 올라가는 것 자체가 키보드 기본 위치(왼손[asdf]  오른손[jkl;])에서 많이 벗어나기 때문에 esc를 누르는 것이 꺼려질 수 있다. 그럴 때 사용할 수 있는 것이 <C-[><C-c>이다. 

 

 <C-o>는 잠시 Normal Mode 로 복귀하였다가 이동 명령 후 다시 Insert Mode 로 돌아오는 기능을 제공한다.

 

Normal Mode 복귀 후 한영전환 이슈

한글 상태에서 [Ctrl + C] 를 입력한다고 하더라도 [Ctrl + ㅊ] 와 같이 입력되지 않고, 복사가 된다. 하지만 vim 은 그렇지 않다. 한글을 한글로 인식하기 때문에, Normal Mode에서 다양한 이동 명령을 활용하기 위해서는 다시 영어 입력소스로 전환해주어야 한다. Normal Mode 로 복귀할 때마다 총 4개의 키를 눌러주어야 했고( [ Ctrl + '[' ] 그리고 [Ctrl + space] ) (필자는 한영 전환을 ctrl + space 로 전환한다.) 이는 굉장한 불편함이라는 사실을 최근에서야 다시 인지하고 수십분의 삽질 끝에 그 방법을 발견하고 이렇게 글을 작성한다.

 

반응형

Normal Mode 복귀 후 "영어 입력소스"로 자동 전환

위 "참고자료" 링크에서 소개했듯이, 다양한 방법들이 존재한다. 이 글에서는 hammerspoon이라는 app 을 활용하여 문제를 해결해보기로 한다.

Hammerspoon

https://www.hammerspoon.org/

더보기

This is a tool for powerful automation of OS X. At its core, Hammerspoon is just a bridge between the operating system and a Lua scripting engine. What gives Hammerspoon its power is a set of extensions that expose specific pieces of system functionality, to the user.

 

이것은 OS X 의 강력한 자동화 도구입니다. 핵심적으로, Hammerspoon 은 운영체제와 Lua 스크립팅 엔진을 연결할 뿐입니다. Hammerspoon에 강력함을 부여하는 요소는 사용자에게 시스템 기능들의 구체적인 요소들을 드러내는 확장기능들의 집합입니다.

 

You can write Lua code that interacts with OS X APIs for applications, windows, mouse pointers, filesystem objects, audio devices, batteries, screens, low-level keyboard/mouse events, clipboards, location services, wifi, and more.

 

당신은 앱, 창, 마우스포인터, 파일시스템 개체, 음향장치, 배터리, 화면, 저수준 키보드/마우스 이벤트, 클립보드, 위치 서비스 와이파이 등, OS X APIs 와 상호작용할 수 있는 Lua 코드를 작성할 수 있습니다. 

요약하자면 Lua script 로 OS X를 제어할 수 있는 코드를 작성할 수 있다는 것이다. 

Hammerspoon 을 이용해서 다양한 기능들을 제어할 수 있다. 자세한 내용은 공식문서를 확인하도록 하자.

<C-[>  조합키를 눌렀을 때 한영전환을 하고 Normal Mode 로 복귀하기

Hammerspoon 은 간단히 설치가 가능하다. 설치 후 다음의 경로에 init.lua 파일을 생성한다.

 

~/.hammerspoon/init.lua

local inputEnglish = "com.apple.keylayout.ABC"

function hello()
	local inputSource = hs.keycodes.currentSourceID()
	if not (inputSource == inputEnglish) then
		hs.keycodes.currentSourceID(inputEnglish)
	end
	hs.eventtap.keyStroke({}, 'escape')
end

hs.hotkey.bind({'control'}, 33, hello)

화면 상단의 망치 모양의 hammerspoon 아이콘에서 "Reload Config" 를 클릭하여 위에서 작성한 스크립트를 실행시킨다.

Code 설명

위에서 링크를 걸어둔 블로그와 공식문서의 Getting Started 를 통해 자세한 정보를 확인할 수 있다. 

hs.hotkey.bind({'control'}, 33, hello)

컨트롤 키와 33번에 해당하는 키 '[' 를 함께 눌렀을 때, hello 함수를 호출한다. 

 

hello() 함수의 내부에서 현재의 입력소스가 한글이라면 영어입력소스와 같지 않기 때문에, 현재의 입력소스를 영어로 전환하는 로직이 수행된다. 이후, escape 키를 누른것과 같은 효과를 발생시키는 스크립트가 실행된다. 

 

만약, Ctrl + C 조합으로 Insert Mode 를 빠져나가고자 한다면 다음과 같이 입력하면 된다.

hs.hotkey.bind({'control'}, 'c', hello)

 

 

결론

본 이슈를 해결하기 위해 다양한 방법들을 찾고 시도해보았다. 하지만 OS X 에서 intelliJ 와 vsCode 의 extenstion으로서 vim 을 사용하고 있는 필자의 입장에서는 본 방법이 가장 합리적인 방법이었다고 판단된다. extension이기 때문에 extension vim 자체의 extension을 활용하는 데에는 한계가 존재하고, 구름 입력기의 무거움을 감내하고 싶지는 않았기 때문이다. 

또한 몇몇 블로그 글에 소개되어 있는 lua 코드만으로는 무엇인가 잘못했는지 뭔가 확실히 잘못했겠지 동작하지 않았고, 본 방법으로 해결이 되었기 때문에, 혹시라도 나와 같은 문제를 겪고 있는 사람에게 조금이나마 도움이 되고자 하여 글을 남긴다. 

 

부록: 윈도우에서 한글 입력소스로 복귀하기

auto-hot-key-로고
window에서 매크로, 반복작업 등을 도와주는 App

autohotkey 를 활용하여 아래와 같은 스크립트를 실행하기

참고: https://github.com/johngrib/simple_vim_guide/blob/master/md/with_korean.md

$^[::
    if(IME_CHECK("A"))
        Send, {VK15}    ;영문이라면 한영전환 키를 입력해준다.
    Send, ^[
    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)
}

 

반응형

Designed by JB FACTORY