open:autohotkey-두벌식

[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