Windows에서 VS Code vim플러그인 자동 한영전환

CapsLock과 Control키 바꾸기

처음에는 게임과 영화를 보기 위한 용도로 데스크탑을 조립했는데 이제는 개발도구로 사용하고 있다. Window는 터미널을 사용할 때의 제약이 많아 개발할때는 꺼렸는데 wsl의 등장으로 지금은 현업에서도 큰 불편 없이 사용할 수 있는 정도가 되었다.

특히 vscode의 wsl 플러그인을 사용하면 wsl의 리눅스 파일시스템에 있는 프로젝트들을 마치 호스트의 파일시스템에 있는 것 처럼 사용할 수 있어서 집에서는 이제 맥북으로 개발하지 않을 것 같다. 다만 몇 가지 불편한 부분이 있었다.

첫번째는 Capslock키와 Control키의 위치였다. 해피해킹 키보드에 익숙해져 Control대신 Capslock을 마구 눌러댔다. 윈도우에서 이를 해결할 수 있는 방법은 두가지가 있다. 첫번째로 레지스트리를 수정하는 방법인데. 대부분의 프로그램에서는 잘 동작하지만 특정 게임들 (몬스터 헌터, 토탈워 삼국)에서는 Control키를 아예 누를 수 없는 상태가 되어 버린다.

두 번째는 AutoHotKey를 사용하는 것이다. 이 방법으로 지금까지 만족스럽게 사용하고 있다. 사이트에서 프로그램을 설치하고 바탕화면에 우클릭 후 '새로 만들기' > 'AutoHotkey Script'를 선택한 후 생성된 파일에 아래 내용을 붙여 넣고 저장한다.

; CapsLock, Control 전환
CapsLock::Ctrl
Ctrl::CapsLock

다음 해당 파일을 우클릭하여 'Run Script'로 실행한다. 시스템 트레이 아이콘에 'H'아이콘이 나타나면 된 것이다. 그럼 이제 CapslockControl이 바뀌었을 것이다. 이 동작은 언제까지나 스크립트가 실행되어 있는 상태만 유효하다.

수정모드를 빠져나갈 때 영문으로 전환하기

이전에 Spacemacs를 사용할 땐 에디터 내장 언어 입력기가 존재하여 수정모드를 빠져나갈 때 자동으로 영문으로 바꿔 주었는데. 이 기능이 정말 편리했다. VSCODE를 사용한 뒤로는 그 기능을 쓸 수 없어 Esc로 수정모드를 빠져나온 후 항상 언어 전환 키를 눌러줘야만 했다.

이 문제를 해결하기 위한 설정이 있긴 하지만 이게 IME입력기를 쓰는 환경에서는 잘 동작하지 않는다. 이 문제도 AutoHotKey를 이용해 해결할 수 있었다. 위에서 했던 방법과 마찬가지로 아래 스크립트를 쓰면 된다.

; vscode에서 vim insert 모드 종료시 한글이면 영문으로 전환
#IfWinActive, ahk_exe Code.exe
Escape::
	if (ImeCheck("A") = 1)
		Send {vk15sc138}
	Send {Escape}
Return
#IfWinActive

; 키보드 언어 상태 확인 1이면 한글 0이면 영문
ImeCheck(WinTitle) {
	WinGet,hWnd,ID,%WinTitle%
	Return SendImeControl(ImmGetDefaultIMEWnd(hWnd),0x005,"")
}
SendImeControl(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)
}

그럼 이제 매 부팅시마다 위의 스크립트들이 자동실행만 되면 된다. 방법은 스크립트 파일 우클릭 후 'Compile Script'를 선택한다. 그럼 같은 경로에 exe파일이 생겼을 것이다. 이제 Window의 시작 버튼에 우클릭 후 '실행' 을 열고 거기에 shell:startup을 입력하고 '열기' 를 누른다.

그럼 폴더가 하나 뜨는데 여기에 exe파일들을 넣으면 된다. 참고로 위의 두 스크립트를 하나의 파일에 넣어도 된다.