{{tag>autohotkey ahk}} # [AHK] 두벌식보다 편한 것은...? ## 두벌식을 사용하다 보니.. 두벌식으로 타이핑을 하면서 손가락에 피로가 쌓이는 느낌을 지울 수 없었다. ## 세벌식이 있었다. 다른 방식으로 세벌식이 있는 것을 알게 되었고, '세벌식 최종'이라 불리는 것을 사용해 보았다. ## '최종' 과 '390' ''최종''을 사용하면서 기호가 기존의 배열과 달라서 사용하기 힘든 것이 가장 마음에 걸렸다. 세벌식이면서 기호의 위치가 동일한 ''390''을 사용해 보았다. 기호는 사용할 수 있었지만 여전히 숫자키가 있는 배열까지 사용해야 한다는 불편함이 남아 있었다. ## '신세벌식' 과 '안마태' 다른것을 찾다가, 두벌식 처럼 세줄만 사용하는 세벌식을 발견하였다. 두가지가 있었는데, ''신세벌식'' 과 ''안마태'' 였다. 신세벌식은 중성과 종성을 같은 키에 배치하고 사용하는 방식이여서, 모아치기가 불가능하였다. 안마태 방식은 모아치기를 해야만 사용할 수 있는 방식이었다. ## 세벌식의 어려움.. 이리저리 생각해보다, 다른사람과의 협업을 해야하는 상황에서 세벌식은 많은 불편함을 만들것이라는 예상 때문에 결국은 세벌식에 정착하지 못하고 원래 자리로 돌아왔다. ## 다시 두벌식으로.. 두벌식이 불편한 이유는 쉬프트키를 많이 사용하는 것 때문이였다. 그리하여 쉬프트키를 사용하지 않는 두벌식을 만들기로 하였으니.... ## 대안으로 AutoHotKey ''AutoHotKey''를 사용하기로 한다. 쉬프트키를 누르지 않고 타이핑을 하면 자동으로 쉬프트키를 누르고 타이핑 한것처럼 변경하도록 만들어 놓는다. ## 입력상태 확인 현재 '영어'가 아닌 ''한글'' 입력 상태인지 확인할 필요가 있다. 그래서 아래와 같은 코드를 사용한다. IME_CHECK(WinTitle) { WinGet,hWnd_abs,ID,%WinTitle% Return Send_ImeControl(ImmGetDefaultIMEWnd(hWnd_abs),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_abs) { return DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd_abs, Uint) } 이를 통하여 현재 ''한글'' 입력 상태임을 확인한다면, 변경할 글자를 등록해 놓으면 된다. ## 변경을 위한 함수 생성 영어와 달리 한글을 입력 타이핑 수가 지워야 하는 '백스페이스' 수가 다르다. 따라서, 수를 지정해 주어야 한다. 아래와 같은 함수를 만든다. Hotstring_Korean(transform, korWordCount := 1) { ret := IME_CHECK("A") if %ret% != 0 ; 0 means IME is in English mode now. { Send {Left}{Right} Send {BS %korWordCount%} Send %transform% } } 이 함수는 ''영어'' 입력 모드가 아닐 경우를 확인한 다음, 입력한 타이핑으로 변경하는 함수입니다. ## 핫스트링 추가 ''앗'' 을 ''았'' 으로 변경하고 싶은 경우에는 아래와 같은 핫스트링 코드를 추가한다. :?*:dkt:: ; 앗 → 았 Hotstring_Korean("dkT",1) return 그러면, ''앗'' 을 입력했을 경우에 ''았''으로 변경이 된다. 이와 같은 방식으로, 변경할 글자들을 입력해서 추가해 준다. 규칙이 있는 룰이 아니라서, 필요한 것들을 모두 따로 등록해 주어야 한다. ### 옵션 ''?'' 은 앞에 글자가 있는 경우에도 동작하도록 설정한다. ''::EST::CHANGE'' 라면 ''TEST'' 라고 입력한 경우에는 변경이 되지 않는다. '':?:EST::CHANGE'' 라면 ''TEST'' 라고 입력한 경우에 ''TCHANGE''로 변경된다. ''*'' 은 구분 기호 입력 전에 바로 변경되도록 설정한다. 입력한 문자 뒤에 꼭 스페이스나, 엔터키가 오는 경우라면, ''*''은 입력하지 않아도 된다. ## 핫스트링 사용을 위한 설정 기본으로 AHK에서 Hotstring은 기존의 글자들을 지우도록 처리가 되어 있으므로, 설정을 변경하자. 변경입력 문자들이 있는 곳보다 윗부분에 아래와 같은 코드를 추가한다. #Hotstring R0 C B0 이는 핫스트링 동작시에, 해당 문자열을 지우지 않을 것이다. ## 나머지 코드 아래 부분은 시프트키 사용을 배제하기 위해 등록한 다른 글자들 입니다. #Hotstring R0 C B0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 오타 수정 :*:EO:: ; 떄 → 때 Hotstring_Korean("Eo") return :: eo:: ; 대 → Eo Hotstring_Korean("Eo ", 2) return :*:rkfgh:: ; 갈호 → 괄호 Hotstring_Korean("rhkfgh", 2) return :*:dm s:: ; 으 ㄴ → 은 Set_Only_Korean("dm s", "dms ",3) return :*:dms:: ; dms → 은 Set_To_Korean("dms ") return :*:sm s:: ; 느 ㄴ → 는 Set_Only_Korean("sm s", "sms ",3) return :*:smek:: ; 느다 → 는다 Hotstring_Korean("smsek",2) return :*:rjtmds:: ; 거승ㄴ → 것은 Hotstring_Korean("rjtdms",2) return :*:wjryd:: ; 저굥 → 적용 Hotstring_Korean(" wjrdyd",2) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shift 생략 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; ㄱ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :*:rr:: ; ㄱㄱ → ㄲ Hotstring_Korean("R",2) return :?*:rkrk:: ;가가 → 가까 Hotstring_Korean("rkRk", 2) return ::rkwl:: ;가지 Hotstring_Korean("rkwl ", 3) return :?:rkwl:: ;가지 → 까지 Hotstring_Korean("Rkwl ", 3) return :?*:roekf:: ;개달 → 깨달 Hotstring_Korean("Roekf", 2) return :?*:rkatks:: ;감산 → 감싼 Hotstring_Korean("rkaTks", 2) return :*:rmx:: ;긑 → 끝 Hotstring_Korean("Rmx") return :?*:rpwjd:: ;게정 → 계정 Hotstring_Korean("rPwjd", 2) return :?*:rpghlr:: ;게획 → 계획 Hotstring_Korean("rPghlr", 2) return :?*:rpthr:: ;게속 → 계속 Hotstring_Korean("rPthr", 2) return :?*:rpt:: ;겟 → 겠 Hotstring_Korean("rpT", 1) return :?*:rptd:: ;겟ㅇ → 겠ㅇ Hotstring_Korean("rpTd", 2) return :?*:rpte:: ;겟ㄷ → 겠ㄷ Hotstring_Korean("rpTe", 2) return :?*:rhksrp:: ;관게 → 관계 Hotstring_Korean("rhksrP", 2) return :?*:rurrh:: ;격고 → 겪고 Hotstring_Korean("ruRrh", 2) return :*:rmawlr:: ;금직 → 끔찍 Hotstring_Korean("RmaWlr",2) return :?*:rlwnsrp:: ;기준게 → 기준계 Hotstring_Korean("rlwnsrP",3) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; ㄴ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :*:skqms:: ;나븐 → 나쁜 Hotstring_Korean("skQms",2) return :?*:smrl:: ;느기 → 느끼 Hotstring_Korean("smRl",2) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ㄷ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :*:ee:: ; ㄷㄷ → ㄸ Hotstring_Korean("E",2) return :?*:e.:: ; ㄷ. → 다. Hotstring_Korean("ek.",2) return :*:ekfk:: ;다라 → 따라 Hotstring_Korean("Ekfk",2) return :*:ekfh:: ;다로 → 따로 Hotstring_Korean("Ekfh",2) return :?*:ekfmaus:: ;다르면 → 따르면 Hotstring_Korean("Ekfmaus",3) return :?*:eksrp:: ;단게 → 단계 Hotstring_Korean("eksrP",2) return ::eo:: ;대 → 때 Hotstring_Korean("Eo ",2) return :?*:eorkwl:: ;대가지 → 때까지 Hotstring_Korean("EoRkwl",3) return :?*:eosk:: ;대나 → 때나 Hotstring_Korean("Eosk",2) return :?*:eoeofh:: ;대대로 → 때때로 Hotstring_Korean("EoEofh",3) return :?*:eoansd:: ;대문ㅇ → 때문ㅇ Hotstring_Korean("Eoansd",3) return :?*:ejfdjem:: ;덜어드 → 떨어뜨 Hotstring_Korean("EjfdjEm",3) return ::eh:: ;도 → 또 Hotstring_Korean("Eh ",2) return :?*:ehgks:: ;도한 → 또한 Hotstring_Korean("Ehgks",2) return :?*:enfwo:: ;둘재 → 둘째 Hotstring_Korean("enfWo",2) return :?*:enldj:: ;뒤어 → 뛰어 Hotstring_Korean("Enldj", 2) return :*:ehrehr:: ;독독 → 똑똑 Hotstring_Korean("EhrEhr",2) return :*:ehlfrk:: ;될가 → 될까 Hotstring_Korean("ehlfRk",2) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ㄹ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :?*:fut:: ;렷 → 렸 Hotstring_Korean("fuT") return :?*:fhtj:: ;로서 → 로써 Hotstring_Korean("fhTj",2) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ㅂ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :?*:qkrn:: ; 바구 → 바꾸 Hotstring_Korean("qkRn",2) return :?*:qkwlrp:: ; 바지게 → 빠지게 Hotstring_Korean("Qkwlrp",3) return :*:qkrdp:: ; 박에 → 밖에 Hotstring_Korean("qkRdp",2) return :*:qkffl:: ; 발리 → 빨리 Hotstring_Korean("Qkffl",2) return :*:qjsqjs:: ; 번번 → 뻔뻔 Hotstring_Korean("QjsQjs",2) return :?*:qjfut:: ; 버렷 → 버렸 Hotstring_Korean("qjfuT",2) return :?*:qnflcl:: ; 부리치 → 뿌리치 Hotstring_Korean("Qnflcl",3) return :?*:qnsdl:: ; 분이 → 뿐이 Hotstring_Korean("Qnsdl",2) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ㅅ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :?*:tkgdl:: ;샇이 → 쌓이 Hotstring_Korean("Tkgdl",2) return :?*:tkfp:: ;사레 → 사례 Hotstring_Korean("tkfP",2) return :*:tmrl:: ;스기 → 쓰기 Hotstring_Korean("Tmrl",2) return :*:tmrh:: ;스고 → 쓰고 Hotstring_Korean("Tmrh",2) return :*:tjdi:: ;서야 → 써야 Hotstring_Korean("Tjdi",2) return :*:tjfk:: ;서라 → 써라 Hotstring_Korean("Tjfk",2) return :*:tprp:: ;세게 → 세계 Hotstring_Korean("tprP",2) return :?*:tjfrp:: ;설게 → 설계 Hotstring_Korean("tjfrP",2) return :*:tmsms:: ;스는 → 쓰는 Hotstring_Korean("Tmsms",2) return :*:tmwl:: ;스지 → 쓰지 Hotstring_Korean("Tmwl",2) return ::tmf:: ;슬 → 쓸 Hotstring_Korean("Tmf ",2) return :*:tjtek:: ;섯다 → 썼다 Hotstring_Korean("TjTek",2) return :?*:tlzut:: ;시켯 → 시켰 Hotstring_Korean("tlzuT",2) return :?*:tlrp:: ;시게 → 시계 Hotstring_Korean("tlrP",2) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ㅇ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :?*:dktt:: ; 앗ㅅ → 았ㅅ Hotstring_Korean("dkTt",2) return :?*:dkts:: ; 앗ㄴ → 았ㄴ Hotstring_Korean("dkTs",2) return :?*:dkt:: ; 앗 → 았 Hotstring_Korean("dkT",1) return :?*:dorl:: ; 애기 → 얘기 Hotstring_Korean("dOrl",2) return :*:djejs:: ; 어던 → 어떤 Hotstring_Korean("djEjs", 2) return :?*:djejg:: ;어덯 → 어떻 Hotstring_Korean("djEjg", 2) return :*:djejg:: ; 어덯 → 어떻 Hotstring_Korean("djEjg",2) return :?*:dute:: ; 엿ㄷ → 였ㄷ Hotstring_Korean("duTe",2) return :*:dp:: ; 에 → 예 Hotstring_Korean("dP",1) return :*:dpwjd:: ; 에정 → 예정 Hotstring_Korean("dPwjd",2) return :*:dpcmr:: ; 에측 → 예측 Hotstring_Korean("dPcmr",2) return :?*:dhkt:: ; 왓 → 왔 Hotstring_Korean("dhkT",1) return :?*:dhlswhr:: ; 왼족 → 왼쪽 Hotstring_Korean("dhlsWhr",2) return ;;; ''엇''에 대한 예외를 등록한다. ;;; :?*:andjt:: ; 무엇 → 무엇 Hotstring_Korean("andjt",2) return :?*:djtj:: ; 어서 → 어서 Hotstring_Korean("djtj",2) return :?*:djt:: ; 엇 → 었 Hotstring_Korean("djT",1) return :?*:dutd:: ; 엿ㅇ → 였ㅇ Hotstring_Korean("duTd",2) return :?*:dltkd:: ; 이상 Hotstring_Korean("dltkd",2) return :?*:dltr:: ; 잇ㄱ → 있ㄱ Hotstring_Korean("dlTr",2) return :?*:dlts:: ; 잇ㄴ → 있ㄴ Hotstring_Korean("dlTs",2) return :*:dltd:: ; 잇ㅇ → 있ㅇ Hotstring_Korean("dlTd",2) return :*:dltt:: ; 잇ㅅ → 있ㅅ Hotstring_Korean("dlTt",2) return :*:dlt:: ; 잇 → 있 Hotstring_Korean("dlT",1) return :?*:dltw:: ; 잇ㅈ → 있ㅈ Hotstring_Korean("dlTw",2) return :*:dltdm:: ; 잇으 → 있으 Hotstring_Korean("dlTdm",2) return :*:dltwl:: ; 잇지 → 있지 Hotstring_Korean("dlTwl",2) return :?*:dmfrk:: ; 을가 → 을까 Hotstring_Korean("dmfRk",2) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ㅈ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :*:wkfq:: ;잛 → 짧 Hotstring_Korean("Wkfq") return :?:wkfl:: ;자리 → 짜리 Hotstring_Korean("Wkfl",2) return :*:wkso:: ;자내 → 짜내 Hotstring_Korean("Wkso",2) return :?*:wkfakr:: ;잘막 → 짤막 Hotstring_Korean("Wkfakr",2) return :?*:woqkfms:: ;재바른 → 재빠른 Hotstring_Korean("woQkfms",3) return :?*:woqkffl:: ;재발리 → 재빨리 Hotstring_Korean("woQkffl",3) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ㅊ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :?*:cjtwo:: ;첫재 → 첫째 Hotstring_Korean("cjtWo",2) return :?*:cprp:: ;체게 → 체계 Hotstring_Korean("cprP",2) return :?*:cmrwlrp:: ;측지게 → 측지계 Hotstring_Korean("cmrwlrP",3) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ㅎ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :?*:gkarp:: ; 함게 → 함께 Hotstring_Korean("gkaRp", 2) return :?*:gotw:: ; 햇ㅈ → 했ㅈ Hotstring_Korean("goTw", 2) return :?*:gotd:: ; 햇ㅇ → 했ㅇ Hotstring_Korean("goTd", 2) return :?*:gotj:: ; 해서 → 해서 Hotstring_Korean("gotj", 2) return :?*:got:: ; 햇 → 했 Hotstring_Korean("goT", 1) return :?*:gnjftls:: ; 훨신 → 훨씬 Hotstring_Korean("gnjfTls", 2) return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 영문에서 한글 조사 입력시 자동 변경 /* :?:dms:: ; dms → 은 Set_To_Korean("dms ") return :?:sms:: ; sms → 는 Set_To_Korean("sms ") return :?:fmf:: ; fmf → 를 Set_To_Korean("fmf ") return :?:dl:: ; dl → 이 Set_To_Korean("dl ") return ;:?:rk:: ; rk → 가 ;Set_To_Korean("rk ") return :?:dml:: ; dml → 의 Set_To_Korean("dml ") return */ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Functions Hotstring_Korean(transform, korWordCount := 1) { ret := IME_CHECK("A") if %ret% != 0 ; 0 means IME is in English mode now. { Send {Left}{Right} Send {BS %korWordCount%} Send %transform% } }