위 "참고자료" 링크에서 소개했듯이, 다양한 방법들이 존재한다. 이 글에서는 hammerspoon이라는 app 을 활용하여 문제를 해결해보기로 한다.
Hammerspoon
요약하자면 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 코드만으로는 무엇인가 잘못했는지 뭔가 확실히 잘못했겠지 동작하지 않았고, 본 방법으로 해결이 되었기 때문에, 혹시라도 나와 같은 문제를 겪고 있는 사람에게 조금이나마 도움이 되고자 하여 글을 남긴다.
부록: 윈도우에서 한글 입력소스로 복귀하기
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)
}
'기타' 카테고리의 다른 글
vim으로 자동완성 위아래 움직이기 (1) | 2024.07.21 |
---|---|
vim 단축키 정리 (3) | 2024.07.21 |
VIM 단축키 정리 유용한 사이트 (0) | 2024.07.18 |
5초간 응답없으면 자동으로 에러내줌 (0) | 2024.07.16 |
git 처음 설정 엔터값 변경 (windows, mac) 호환 (0) | 2024.07.16 |