[AHK] 두벌식보다 편한 것은...?

두벌식으로 타이핑을 하면서 손가락에 피로가 쌓이는 느낌을 지울 수 없었다.

다른 방식으로 세벌식이 있는 것을 알게 되었고, '세벌식 최종'이라 불리는 것을 사용해 보았다.

최종을 사용하면서 기호가 기존의 배열과 달라서 사용하기 힘든 것이 가장 마음에 걸렸다.

세벌식이면서 기호의 위치가 동일한 390을 사용해 보았다. 기호는 사용할 수 있었지만 여전히 숫자키가 있는 배열까지 사용해야 한다는 불편함이 남아 있었다.

다른것을 찾다가, 두벌식 처럼 세줄만 사용하는 세벌식을 발견하였다. 두가지가 있었는데, 신세벌식안마태 였다.

신세벌식은 중성과 종성을 같은 키에 배치하고 사용하는 방식이여서, 모아치기가 불가능하였다.

안마태 방식은 모아치기를 해야만 사용할 수 있는 방식이었다.

이리저리 생각해보다, 다른사람과의 협업을 해야하는 상황에서 세벌식은 많은 불편함을 만들것이라는 예상 때문에 결국은 세벌식에 정착하지 못하고 원래 자리로 돌아왔다.

두벌식이 불편한 이유는 쉬프트키를 많이 사용하는 것 때문이였다.

그리하여 쉬프트키를 사용하지 않는 두벌식을 만들기로 하였으니….

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%
    }
}


  • open/autohotkey-두벌식.txt
  • 마지막으로 수정됨: 2020/06/02 09:25
  • 저자 127.0.0.1