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