날개셋 한글 입력기 7.9 -- 上

바야흐로 2015년 봄에 <날개셋> 한글 입력기 7.9를 내놓게 된 것을 기쁘게 생각한다. 번호가 9로 끝나는데 날짜가 마침 서울 지하철 9호선 2차 구간 개통일과 일치하는 것은 그냥 우연...;;치고는 절묘하다. ^^

이번 7.9는 이 프로그램의 개발 역사상 "한글 입력 체계" 카테고리에만 아이템이 제일 많이 추가된 버전이다. 지난 1월 이후로 중간 개발 근황글이 없다시피했는데, 근황글을 쓰는 것조차 시간이 아까울 정도로 지금까지 너무 바쁘게 지냈기 때문이다. 코딩, 글쓰기, 학교 과제, 회사일, 교회 서적 번역..
그래도 8.0까지 가는데 더는 지체할 수가 없어서 이번 7.9에서 한번 쉬었다 가고자 한다.

※ 새로운 날개셋문자: '글쇠 누름' 타입

IME란 기본적으로 특정 키보드 입력을 가로채어 그 대신 운영체제가 제시하는 다른 규격대로 조합/완성 문자열을 생성하여 보내는 프로그램이다. 그런데 발상을 전환하여, A라는 키보드 입력을 가로채어 그 대신 B라는 다른 키보드 입력을 생성하는 기능이 날개셋문자의 타입 차원에서 추가됐다. 여기에는 단타뿐만 아니라 간단히 Ctrl/Shift 조합도 포함될 수 있다.

<날개셋> 한글 입력기는 IME일 뿐 키매크로나 키보드 드라이버 훅킹 같은 걸 '지향'하지는 않는다. 하지만 새로운 날개셋문자 타입을 이용하면 A를 눌렀는데 화살표 키가 눌린다거나, 다른 뭘 눌렀는데 Ctrl+A가 눌린다거나 하는 간단한 치환 효과를 낼 수 있다. 프로그램의 활용 가능성이 더욱 높아지리라 기대한다.

GetMessageExtraInfo 함수가 이런 용도로 쓰인다는 걸 알 수 있었다. 즉, 사용자가 진짜로 누른 키 입력 메시지와, 프로그램이 인위로 생성한 키 입력 메시지를 구분하기 위해서다. 내가 인위로 생성한 키 메시지는 또 가로채지 않아야 하니까. 이는 The old new thing 블로그에도 언급되어 있다. 그리고 <날개셋> 한글 입력기가 개발 15년 만에 이 캐잉여 함수를 사용하는 프로그램의 반열에 올랐다. 경to_the축!

날개셋문자의 종류가 3.0 시절에는 5종류밖에 없던 것(일반, 세벌, 두벌, 특수글쇠, 상태 전이)이 이제는 10종류로, 정확히 두 배로 늘었다(중종-초, 종-초중, 다중 문자, 종성 두벌, 글쇠 누름). 그래서 이 참에 날개셋문자를 생성하는 대화상자도 이렇게 바뀌었다. 라디오 박스 목록 대신, 날개셋문자 기능들이 어떻게 분류되는지를 나무 계층 구조를 통해 알 수 있게 했다.

사용자 삽입 이미지

※ 글쇠 인식 관련 마이너 기능

앞서 언급한 '글쇠 누름' 날개셋문자를 추가하기 위해, 편집기, 외부 모듈, 입력 패드라는 모든 구현체에서 글쇠 인식 부분을 상당수 손질을 해야 했다. 그리고 이걸 수행하는 과정에서 뜻밖의 작업이 덤으로 행해졌는데..
화면 키보드에, 글쇠를 클릭해서 문자를 입력하는 통상적인 기능뿐만 아니라 역으로 사용자가 누른 키보드 글쇠를 화면에다 표시해 주는 기능을 드디어 추가했다. 화면 키보드를 우클릭하면 이걸 켜는 옵션을 볼 수 있다.

그리고 '글쇠 누름' 날개셋문자를 생성하는 UI를 구현하려다 보면 결국은 "입력하고자 하는 글쇠를 직접 눌러서 선택"하는 UI가 필요해진다.
이걸 구현하는 김에, 예전 고급 입력 스키마의 '고급 글쇠 인식 옵션' 대화상자에다가도 [...]버튼을 추가하여 대상 글쇠를 콤보 상자에서만 고르는 게 아니라 직접 눌러서 고르는 UI를 같이 추가했다.

※ 입력 스키마와 글쇠배열

(1) 글쇠 수식의 R 변수에다가 임의의 32비트 크기의 난수를 되돌리게 하는 옵션을 '고급 스키마'에 추가했다. 입력 동작을 non-deterministic하게 만드는 기능인데 굳이 '기본 스키마'가 갖춰야 할 기능이라 생각되지는 않아서 고급에다가만 넣었다. 'A'+R%26 이렇게 수식을 넣어 주면 A부터 Z까지 아무 알파벳이 임의로 입력되게 된다.
R 변수는 실제로 사용할 때만 값이 정해진다. 사용하지도 않는데 매번 무조건 난수값이 계산되고 사이클이 변하는 것은 아니다.

(2) 필요하다면 글쇠배열 수식의 전후에, 모든 글쇠에 대해 공통으로 실행할 수식을 지정할 수 있게 했다. 소문자로 된 사용자 정의 변수를 공통으로 초기화한다거나(전처리), 그리고 날개셋문자를 되돌릴 때 사용하는 변수값과 최종적으로 변경되어야 하는 변수값이 다를 때(후처리) 이 기능을 사용하면 된다.
물론 이런 전처리/수처리 수식을 사용할 정도이면 글쇠 수식이 정말 상황 의존적이고 복잡한 상황일 것이다. 한글 입력 순서를 자동으로 계산하는 기능은 그런 보조 수식은 고려하지 않고 동작한다.
지금까지 글쇠배열과 관련된 속성 숫자를 지정하는 입력란이 있었지만 사용하지는 않고 있었는데, 이제부터는 그 숫자를 이런 옵션을 저장하는 용도로 사용할 것이다.

(3) 글쇠배열 수식의 T 변수에는 기본 입력기가 만들어 내는 한글 조합의 오토마타 상태만 들어있었다. 그러나 옵션을 준 경우 고급 입력기가 만들어 내는 사용자 정의 조합의 상태 번호도 여기에 들어가고, 그 대신 이 조합의 타입 값이 C라는 변수에 들어가게 했다. 한글이면 1, 사용자 정의 조합이면 2이다. 하지만 고급 입력기의 사용자 정의 조합은 개념상 오토마타와 낱자 결합을 통합한 로직을 자체적으로 갖고 있기 때문에 글쇠배열이 조합 상태에 따라 조건부로 동작해야 할 일은 그리 많지 않을 것이다.

(4) 또한 옵션을 준 경우, 굳이 '상태 전이' 날개셋문자를 사용하지 않고 글쇠배열 수식에서 T 값을 변경하면 그걸로도 상태 전이 효과가 나게 했다. 이게 언제 유용한지는 좀 더 생각해서 입력 예제를 만들어 봐야 할 것 같다.

※ 입력 기능 추가

다음으로 문자 생성기 계층으로 넘어가면,
(1) '낱자 재결합' 텍스트 필터의 기능을 일부 수행하는 특수글쇠가 추가됐다. 기[ㅇ](종성 조합 중)을 [깅]으로 바꾼다거나, 저렇게 앞으로 가는 게 아니라 뒤로 결합을 하는 특수글쇠도 있다. 물론 이것은 조합이 끝난 옆의 글자를 변형하는 기능이기 때문에 TSF A급 구현체에서만 제대로 동작한다.

(2) 비록 이번 7.9에서 온전히 구현되지는 않았지만 곧 지원될 세벌식 지능형 동시치기 기능을 염두에 두고 음수 오토마타 지시자가 두 개가 새로 추가되었다.
지금 입력된 글쇠뿐만 아니라 직전의 글쇠까지 동시에 다음 글자로 옮기는 것, 그리고 지금 입력된 글쇠와 예전에 입력된 글쇠의 입력 순서를 바꾸는 것인데, 이와 비슷한 기능을 하는 특수글쇠도 같이 추가되었다.
앞으로 입력 스키마 차원에서 새로운 기능이 추가되면, 세벌식 글자판에서도 글쇠 입력 타이밍에 따라 도깨비불 비슷한 게 일어나면서 글자 재배치가 일어나는 동작을 볼 수 있을 것이다. 문자 생성기의 기존 기능을 이런 식으로 활용하는 것이다.

(3) 낱자 결합 규칙은 잘 알다시피 A + B = C의 형태인데 여기서 A, B, C는 모두 0이 아니어야 한다. 단지, A~C를 0인 것처럼 보이게 하는 가상 낱자 규칙만을 추가로 지정할 수 있을 뿐이다.
그런데 이번 버전에서는 그 금기를 깨고, 65530이라는 끄트머리의 reserved 낱자와 결합을 시도하는 경우 지금 낱자가 무조건 0으로 바뀌게 하는 예외를 추가했다.

이런 기능이 왜 필요한 것일까? 성분과 성분을 왔다갔다 하는 굉장히 기발한 입력 방식이 존재하기 때문이다. 그 예 중 하나는 김 민겸 님께서 고안한 입력 방식이다.
이걸 보면 "ㄱ → 그 → ㅋ", "ㄱ → 기 → 끼"라는 규칙이 있다. 모음 ㅡ가 한 번 입력되어 버렸는데 그때 또 ㅡ가 입력되면 그 뒤엔 모음은 0으로 깨끗이 초기화되고 초성만 ㅋ으로 바뀌어야 한다.

단순히 표시만 0으로 되는 가상 낱자여서는 곤란하다. ㅋ이나 ㄲ이 만들어진 뒤에 또 후속 모음이 입력되는 경우를 논리적으로 감당할 수 없기 때문이다.
이때 ㅡ 자리에는, 현재 초성으로 ㄱ이 입력되어 있는지를 점검한 후, ㄱ이 있다면 ㄱ을 ㅋ으로 바꾸는 초성을 입력함과 동시에 중성 자리에는 65530을 주면 된다. 이때는 오토마타도 초+중 상태이던 것을 초성 상태로 되돌리게 해야 한다.

<날개셋> 한글 입력기는 이런 것도 이제 이론적으로 수용 가능하게 되었다. 단, 이렇게 여러 낱자가 한꺼번에 변하는 변칙적인 입력 방식은 입력 순서 찾기 같은 자동화 기능의 혜택을 받을 수는 없다. ^^

※ 고급 입력기에 기능 추가 (특히 초성 지향 도깨비불)

온갖 복잡한 기능과 옵션을 동원해서 한글 한 글자를 조합하는 기능은 '기본 입력기'에 다 들어있다. '고급 입력기'가 하는 일은 비한글 문자도 조합을 잡는 걸 가능하게 해서 한글 조합과 혼용하는 것이다. 그리고 한글을 여러 한글로 풀거나 비한글 문자가 섞인 형태로 표현하는 것도 그런 기능에 포함된다.

(1) "한글 출력 치환"에서 "글자 치환" 기능은 지금까지 그냥 이 한글을 저 한글로 치환한다는 식의 테이블 기반 치환만 지원했다. 그러나 수천~수만 자의 한글을 치환해야 하고 치환 규칙이 뭔가 수식으로 표현이 가능하다면, 무엇을 무엇으로 치환할지를 A,B,C에 대한 수식으로도 깔끔하게 표현 가능하게 했다.
유니코드 PUA 영역에다가 여러 글자들을 배당해 놓고 그 글자를 마치 한글 입력하듯이 입력하고 싶다면, 이 출력 치환 기능을 이용하면 된다.

(2) 그리고 "낱자 치환"에서 특별히 종성을 치환하는 기능은 지금까지 가상 낱자와 연계해서 ㄴ+ㅇ 같은 임시 상태를 표현하는 데 쓰이곤 했다. 이번 버전에서는 그걸 더 확장해서 "초성으로 먼저 나갔다가 다시 앞 글자 받침으로 들어가는" 도깨비불 현상을 구현하는 옵션을 추가했다. 다시 말해 "울 -> 우리"가 아니라, "하ㄴ -> 한ㄱ" 이런 식으로 입력이 진행된다는 뜻이다.

지금도 이미 모든 종성에 대해서 종성 A를 "빈 종성 + 초성 A"로 치환하는 종성 치환 규칙을 수동으로 집어넣으면 이런 동작을 구현할 수 있다. 하지만 이 기능은 지금 도깨비불 현상 예상 결과를 토대로 자동으로 구현해 주기 때문에 낱자 치환 기능의 옵션으로 들어간 것이다.

이렇게 종성까지도 초성을 먼저 추구하는 두벌식은, 초성조차 종성 형태로 먼저 입력되는 '종성 지향 두벌식'과는 성향에 관한 한 완전히 딴판이다. 그에 반해 수식을 이용해 초성에서는 초성, 종성에서는 종성 문맥으로 동작하는 일반적인 두벌식은 중도(?) 성향이고 말이다. <날개셋> 한글 입력기는 이런 두벌식의 세밀한 패러다임을 모두 잡아 냈다.

받침이 없는 글자가 받침이 있는 글자보다 더 많기 때문에 두벌식 자판의 도깨비불 현상은 "초성부터 먼저 표시했다가 다음에 종성으로 가는 형태가 원칙상 옳다"라고 주장하는 분이 계신다. 이런 방식은 도깨비불 현상 이질감이 약간 덜할지는 모르지만 조합 중인 한글의 글자 수가 잠시 둘로 늘어나며, 조합이 완성되었을 때의 글자 형태(한)와 조합 중일 때의 글자 형태가(하ㄴ) 달라지는 문제가 있다. 그러니 '선종성 후초성' 방식이 대세가 된 건 다 아무 이유 없이 그리 되지는 않은 듯하다. 이번 7.9 버전도 그 조합 중단 처리가 원활하지 못하기 때문에 이는 8.0에서 풀어야 할 숙제로 남기게 되었다.

※ 새로운 '허용 한글 범위' 기능

지금까지 '허용 한글 범위'로 선택할 수 있던 기능으로는 커널이 기본 제공하는 "KS X 1001 완성형 2350자"에 덧붙여 플러그 인이 제공하는 "한양 PUA 완성형 옛한글 5299자", 그리고 "한컴 2바이트 완조형 옛한글" 정도가 고작이었다. 2350자 테이블이야 날개셋 커널이 완성형 한글 글꼴을 지원하기 위해 어쩔 수 없이 갖추고 있는 것이고 그래서 허용 한글 범위 기능까지 완전 덤으로 제공하는 것이다. 나머지 legacy 기능들도 그냥 명분상으로 제공될 뿐이지 이 유니코드 5.2 천하통일 시대에 딱히 의미가 있다고 보기는 어렵다. '설정'을 눌러도 딱히 설정할 것 역시 없다.

그러나 7.9부터는 이 기능을 예전보다는 좀 더 창의적으로 활용할 수 있게 되었다.
(1) 고급 입력기와 연동하여 "글자 치환"이 존재하는 한글만 입력이 허용되게 하는 기능이 있었는데, 여기에 덧붙여 "낱자 치환"이 된 낱자의 다음 낱자부터는 입력되지 않게 하는 기능도 추가되었다.

좀 변칙적인 입력 방식 중에는 같은 글쇠를 눌렀는데 한글과 비한글 문자가 순환되는 형태인 것이 있다. 비한글도 내부적으로는 가상의 한글 낱자인데 단지 그걸 비한글 문자로 치환해서 출력하는 것일 뿐이다. 그래서, 정말로 한글 초성을 입력하고 있었다면 중성이나 종성으로 더 진행이 가능한 반면, 지금이 비한글 문자로 치환된 초성을 조합하는 상태라면 중성 같은 다음 성분이 현 글자에 붙지 않고 다음 글자로 떨어져 나가게 한다. 이런 기능이 '허용 한글 범위'와 연동이 가능하다는 것이다.

요컨대 한글과 비한글 문자를 섞어서 입력한다면 '낱자 치환'에다 제약을 걸면 되며, 한글을 그 자체로는 전혀 사용하지 않고 다른 문자를 입력하는 수단으로만 사용한다면 '글자 치환'에다 제약을 걸면 된다. 후자는 한글로 일본 문자를 입력하는 것이 대표적인 예인 것이다.

(2) 그리고 사용자가 지정한 UTF-16 방식의 텍스트 파일에 있는 한글만을 조합 허용하고 그렇지 않은 것은 불허하는 기능이 추가되었다. 이거 하나만 있으면 앞으로 '허용 한글 범위'에 데이터 기반의 새로운 기능이 더 추가될 여지 자체가 없을 것이다. 외장형 후보 변환 데이터와 더불어 <날개셋> 한글 입력기가 외부 데이터 파일을 참조하여 동작하는 경우가 하나 더 추가되었다.

예제로는 KS X 1001 2350자에다가 오늘날 완전히 공기 잉여화한 문자 집합인 KS X 1002 1930자를 합한 데이터를 제공하므로 이것을 불러다가 사용하면 된다. 여러 입력 항목들이 동일한 데이터 파일을 읽더라도 한 파일은 메모리가 한 번만 할당되는 정도의 처리는 다 돼 있다.
(下에서 계속됨)

Posted by 사무엘

2015/03/30 08:33 2015/03/30 08:33
Response
No Trackback , 2 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1078

Trackback URL : http://moogi.new21.org/tc/trackback/1078

Comments List

  1. 박지호 2015/03/31 17:18 # M/D Reply Permalink

    세벌식 사용자입니다. 날개셋 잘 사용하고 있습니다. 감사합니다.^^

    1. 사무엘 2015/04/01 09:49 # M/D Permalink

      감사합니다. 유용하게 활용하시고 많이 알려 주세요~ ^^

Leave a comment
« Previous : 1 : ... 1194 : 1195 : 1196 : 1197 : 1198 : 1199 : 1200 : 1201 : 1202 : ... 2141 : Next »

블로그 이미지

그런즉 이제 애호박, 단호박, 늙은호박 이 셋은 항상 있으나, 그 중에 제일은 늙은호박이니라.

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2024/04   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

Site Stats

Total hits:
2675872
Today:
440
Yesterday:
2124