Copyright (C) 1996 KangHee Kim






			*** 하니맥 2.1 매뉴얼 ***





					1996년 5월 13일 
					김 강 희 (khkim@archi.snu.ac.kr) 

목차

	1 하니맥 뉴스 

	2 하니맥 2.1 기능 

	3 하니맥 2.1 설치 

	4 하니맥 2.1 사용법 
		4.1 하니맥 실행 
		4.2 한글 폰트
		4.3 한글 코드와 코드 변환 
		4.4 한글 isearch
		4.5 한자 변환

	5 알려진 버그 및 개선점

	6 하니맥 개발자 정보
		6.1 Windows95 버전
		6.2 유니코드와 하니맥 개발 계획
		6.3 버그 리포트

	7 감사의 말씀

1 하니맥 뉴스 

하니맥(HanEmacs)은 새로운 한글 이맥스이다. 본래 한글 전용을 목적으로
하는 이맥스가 없었기 때문에, 이맥스에서 한글을 사용하기 위해서는
Nemacs나 MULE을 사용해야만 했다. 이들 이맥스 버전은 한글을 쓰고 보는
데에는 아무런 문제가 없으나 여러가지 면에서 불편한 점이 많다. 한글 처리가
리스프 수준에서 이루어지기 때문에 우리말의  특징을 반영한 섬세한 조작을
하기가 힘들다(예: isearch). 그리고, MULE은 다국어를 지원하기 때문에
필요 이상의 오버헤드를 갖는다. 최근에는 GNU Emacs에서도 한글을  사용할
수 있기는 하나, 한텀과 같은 환경에서 사용할 수 있을 뿐이고  아직
미비한 점이 많다.

하니맥은 따라서 완전한 한글 이맥스를 목표로 만들어졌다. 93년 9월에
시작된 서울대학교 컴퓨터공학과의 프로젝트 Kemacs(Korean Emacs)가
하니맥의 첫 시작인데, 그 결과로 94년 9월에 HanEmacs 0.99를 배포할 수
있었다. 하니맥 0.99는 XEmacs 19.10을 기반으로 프리미티브 수준에서부터
한글을 지원할 수 있도록 설계되었고 한글을 사용할 수 있는 다른 이맥스
버전들의 기능을 모두 갖추었다.

하니맥이 XEmacs를 기반으로 했기 때문에, 인터내셔널 버전 XEmacs 19.12가
배포되면 하니맥의 개발은 중단될 것으로 예고되었다. 그러나 인터내셔널
버전과는 무관하게 한글 이맥스의 필요성은 계속 제기되었기에 하니맥의
개발은 계속되었다. 하니맥 1.0은 버전 0.99의 문제점을 개선하고 무엇보다 
한글 자모 단위 incremental search를 완성하여 완전한 한글
이맥스로서의 기능을 다 갖추었다.

하니맥은 오직 X 윈도우 환경에서만 사용할 수 있기 때문에,  터미널 
환경에서도 사용할 수 있고, 오버헤드도 적은 GNU Emacs에  하니맥의 기능을
이식할 것을 많은 분이 권고하셨다. 이맥스의 오리지날 버전에 한글 기능을
완벽히 구현하는 것은 다양한 환경에서 보다 많은 Emacs 사용자가  한글을
편리하게 사용할 수 있도록 할 것이다. 그리하여 95년 1월부터  GNU Emacs
19.28를 기반으로 하니맥을 만들기 시작했다.

GNU Emacs 19.28의 한글 버전은 처음에 GHanEmacs 0.99라는 이름으로 
95년 4월에 HanEmacs 1.0과 함께 배포되었다. GNU Emacs의 한글 버전은
처음에 오직 한텀과 같은 터미널 환경에서만 사용할 수 있었고 기능상
미비한 점이 매우 많았다. 한편 XEmacs의 한글 버전과 GNU Emacs의 한글
버전을 동시에 만들기가 매우 어려웠으므로, 본 개발자는 GNU Emacs의 한글
버전만을 본격적으로 만들기로 마음먹었다.

GNU Emacs의 완전한 한글 버전은 상당한 시일이 지난 뒤에나 비로소  beta
버전으로 배포할 수 있었다. XEmacs와 GNU Emacs의 소스 코드는 매우 달라서
GNU Emacs의 소스 코드를 완전히 새로 분석해야 했다. 하니맥 2.0 beta
버전은 GNU Emacs 19.29를 기반으로 만들었고 95년 10월에 배포되었다.
이 버전은 한글 터미널에서뿐만 아니라 하니맥 1.0처럼 X 윈도우 환경에서도 
사용할 수 있는 이맥스이다.

하니맥 2.0 beta는 GNU Emacs의 대부분의 기능을 한글화했지만 버그가
많았고 또 한자 변환기와 같은 기능이 없었다. 하니맥 2.0은 이런 점들을
개선하여 배포하려고 했다. 하지만 개발자의 사정으로 하니맥 2.0의 완성이
늦어진 끝에, 하니맥 2.0의 배포는 못하게 되었다. 사실상 하니맥 2.0의
연장 선상에서 GNU Emacs 19.30을 기반으로 한 하니맥을 하니맥 2.1로
배포한다. 96년 5월 현재, 하니맥의 최신 버전은 하니맥 2.1이다. 

앞으로 하니맥의 다음 버전은 계속 만들어질 예정이며, 바람직한 한글화의
방향을 고려해 계속 개선될 것이다. 하니맥은 한글 이맥스로의 기능을
충실히 하고 있지만, 내부 구현상 이맥스를 완전히 한글화한 코드라고 볼
수는 없다. 아마 GNU의 이맥스 개발 계획과 유니코드 등을 고려한다면
보다 질좋은 한글 이맥스의 등장을 기대할 수도 있을 것이다.

그동안 하니맥 2.1의 배포까지 많은 충고와 조언, 버그 리포트를 해 주신
여러분들께 감사드린다.


2 하니맥 2.1 기능 

하니맥 2.1은 하니맥 2.0 beta 버전에서 나타난 많은 버그들을 고친
것이다. GNU Emacs 19.30을 기반으로 했기 때문에 GNU Emacs 19.30의 
개선된 기능을 이용할 수 있고, 개선된 한글 기능과 한자 기능을 사용할
수 있다. GNUS, W3(W3 모드는 GNU Emacs에 포함되어 있지
않아서 FTP 사이트에서 따로 구해야 한다)와 같은 응용 모드에서도
한글을 사용할 수 있다.

-----------------------------------------------------------------------------
설치 환경   | GNU Emacs를 설치할 수 있는 모든 유닉스 환경  
-----------------------------------------------------------------------------
한글 코드   | 한글 완성형(KSC5601), 한글 상용 조합형  
-----------------------------------------------------------------------------
한글 방식   | 한글 2벌식, 3벌식 모두 지원  
-----------------------------------------------------------------------------
한글 입출력 | X 윈도우 환경에서는 하니맥 자체의 한글 입출력 기능을
	    | 이용하고, 한글 X 라이브러리를 링크하면 한글 출력 기능을
	    | 라이브러리에 의존한다. 한글 터미널 환경에서는 터미널이 제공하는
	    | 한글 입출력 기능에 의존한다.   
-----------------------------------------------------------------------------
한글 편집   | 이맥스의 모든 편집 명령어로 한글 편집이 가능하다. 
	    | 한글 탐색과 교체가 가능하며 한글 완성형 코드에서는
	    | 정규식(regexp) 탐색과 교체도 제한적으로 가능하다.  
-----------------------------------------------------------------------------
한자 변환   | 내장된 한자 변환기로 가능하다.  
-----------------------------------------------------------------------------
한글 메일   | RMAIL, VM, MH와 같은 메일러에서 한글을 보고 사용할 수 있다.  
-----------------------------------------------------------------------------
응용 모드   | GNUS, W3 모드에서 한글을 보고 사용할 수 있다.  
-----------------------------------------------------------------------------

GNU Emacs가 Windows95에 이식되었기 때문에 하니맥도 Windows95에
이식하려는 계획을 오래 전부터 하고 있다. Windows95 버전을 원하는
분은 하니맥 개발자 정보를 참고하라.


3 하니맥 2.1 설치 

하니맥 2.1의 설치는 GNU Emacs 19.30의 설치 방법과 똑같으며 매우
간단하다. 

- 받아온 소스 코드를 푼다.
- hanemacs-2.1/INSTALL을 참조한다.
- configure 쉘스크립트를 수행한다.
- make를 수행한다.
- hanemacs-2.1/src/hanemacs 실행화일을 확인하고 나서 make install을
수행한다.
- 필요한 초기화 화일을 복사한다.
- hanemacs를 실행한다.

예를 들어, openwin 라이브러리와 함께 하니맥을 컴파일하는 순서를
적어보면 다음과 같다. 쉘스크립트 configure의 옵션은
hanemacs-2.1/INSTALL에 잘 설명되어 있다.
(하니맥을 X와 함께 컴파일할 때는 보통 "--with-x-toolkit=lucid" 옵션을
사용하는 게 좋다. 또한 하니맥을 터미널 버전으로만 컴파일하는 것도
좋은데 이때는 "--without-x" 옵션을 사용한다.)

$ gzip -dc hanemacs-2.1.tar.gz | tar xvf -
$ cd hanemacs-2.1
$ ./configure --x-includes=/usr/openwin/include \
	--x-libraries=/usr/openwin/lib --with-x-toolkit=lucid
$ make
$ make install
$ cp site-lisp/site-start.el /usr/local/share/emacs/site-lisp
(또는 $ cp site-lisp/site-start.el ~/.emacs)
$ cp app-defaults/Emacs /usr/openwin/lib/app-defaults
$ xrdb -merge /usr/openwin/lib/app-defaults/Emacs
$ hanemacs

그리고 한글 X 라이브러리를 링크해서 사용하려는 사람들을 위해서
configure에 한 가지 옵션을 추가하였다. 한글 X 라이브러리를 static 또는
dynamic하게 링크하기를 원할 때, make를 하기 전에 다음과 같이 configure 
옵션을 주어야 한다.

$ ./configure --with-x11 --hanx=static 또는
$ ./configure --with-x11 --hanx=dynamic

이렇게 하면 하니맥의 내장 디스플레이 기능은 컴파일시에 제외된다. 만약
한글 X 라이브러리를 정적으로 링크하려고 한다면 make를 실행하기 전에
해당하는 한글 X 라이브러리를 hanemacs-2.1/src/libhan 디렉토리에 복사해
두어야 한다.

$ cp libHanX11.a hanemacs-2.1/src/libhan
$ ranlib hanemacs-2.1/src/libhan/libHanX11.a

한편, 한글 X 라이브러리의 링크 방식이 쉘스크립트 configure가 생성한 
컴파일러 옵션과 일치해야 하므로 주의를 요한다. ELF 포맷을 사용하는
대개의 유닉스 시스템(Linux,Solaris 등)에서 쉘스크립트 configure는
동적 링크를 위한 컴파일러 옵션을 생성하기 때문에 hanx 옵션을 다음과
같이 주어야 할 것이다.( 본인의 경험으로 볼 때 ELF 포맷을
사용하는 시스템에서 모든 라이브러리를 완전히 static 링크하기는 어려운
것 같다. 링크에 필요한 archive 라이브러리가 없는 경우가 많다. )

$ ./configure --with-x11 --hanx=dynamic

이때 한글 X 라이브러러의 shared object인 libHanX11.so.???는
/usr/lib에 설치되어 있어야 한다. 자세한 내용은 한글 X 라이브러리의
매뉴얼을 보라.

개발자의 입장에서 볼 때, 한글 X 라이브러리가 갖는 장점은 임의 크기의
영문 폰트에서도 한글을 볼 수 있다는 것 정도이다. 이것이 그리 중요하지
않다면 하니맥의 내장 디스플레이 기능을 사용해도 무방할 것이다.

이렇게 해서 하니맥의 한글 X 라이브러리와 링크해서 사용한다면, 몇 가지
환경변수를 새로 설정해야 한다. 하니맥은 한글 X 라이브러리의 출력
기능만 이용하며 입력 기능은 이용하지 않는다. 따라서 다음과 같이
한글 X 환경변수를 설정해 두어야 한다.

sh, bash을 사용할 때
$ HANX_FONT="-*-*-*-*-*-*-*-*-*-*-*-*-*-*"; export HANX_FONT
$ HANX_FONT_TRY=1; export HANX_FONT_TRY
$ HANX_INPUT_KEYBOARD=2; export HANX_INPUT_KEYBOARD
$ HANX_INPUT_DISABLE=1; export HANX_INPUT_DISABLE
$ HANX_OUTPUT_DISABLE=0; export HANX_OUTPUT_DISABLE

csh을 사용할 때
$ setenv HANX_FONT "-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
$ setenv HANX_FONT_TRY 1
$ setenv HANX_INPUT_KEYBOARD 2
$ setenv HANX_INPUT_DISABLE 1
$ setenv HANX_OUTPUT_DISABLE 0

이들 명령어는 sh, bash을 사용할 때 홈디렉토리의 .profile에 넣어둘 수 있고,
csh을 사용할 때 .login에 넣어둘 수 있다. 만약 이들 환경변수를 설정하는
명령어를 쉘스크립트로 만들려면 hanemacs-2.1/src/hemacs 화일을
/usr/local/bin에 복사해서 사용하라.

한글 X 환경변수 중에서 HANX_INPUT_DISABLE, HANX_OUTPUT_DISABLE를 제외하고
다른 것들은 그 기능에 맞게 수정해도 좋다.


4 하니맥 2.1 사용법 

4.1 하니맥 실행 

하니맥을 실행하려면 쉘에서 다음과 같이 치면 된다.

$ hanemacs      (X 윈도우 상에서 실행하고자 할 때)
$ hanemacs -nw  (한텀 안에서 실행하고자 할 때)

하니맥 스크린에서 다음 메시지의 한글 부분이 깨져 보이지 않으면
하니맥은 잘 설치된 것이다.

Hangul Emacs 2.1
If you can see "하니맥" in the above line, everything is okay.
Otherwise, you must refer to hanemacs_manual.txt

만약 "하니맥"이라는 한글 문자열이 \000 같은 8진수로 출력된다면
다음과 같이 하니맥 명령어를 입력하라.

M-x standard-display-european

그러면 한글이 보일 것이다. 
그리고 .emacs나 /usr/local/share/emacs/site-lisp/site-start.el에
다음 코드를 삽입해서 사용하라.


(cond
 ((and
     (boundp 'emacs-major-version)
     (= emacs-major-version 19)
     (= emacs-minor-version 30))
  (standard-display-european t)
  (set-input-mode (car (current-input-mode)) (nth 1 (current-input-mode)) 0)
))


하니맥을 X 윈도우 상에서 실행했을 때 하니맥 스크린 하단에는 
"영/완/2"라는 문자열이 보일 것이다. "영"은 키보드가 현재 영문 입력
상태라는 것을 뜻하고 "완"은 현재 하니맥에서 지원하는 한글 코드가 한글
완성형 코드라는 것을 뜻한다. "2"는 한글 2벌식을 뜻한다. 

이들 모드는 각기 다음과 같은 토글 명령어에 의해서 바뀔 수가 있으며,
실행 중에 몇 번 바뀌든지 상관이 없다.


"영/한" : shift space
"완/조" : M-x han-change-coding-system 
"2/3"   : M-x han-change-kbd-kind


하니맥이 실행될 때부터 조합형 코드나 3벌식을 채택하고 싶으면 .emacs
안에 다음과 같이 리스프 코드를 넣는다.


(han-change-coding-system) ;; 한글 조합형
(han-change-kbd-kind)      ;; 한글 3벌식


한편, 하니맥을 한텀 안에서 실행했을 때 하니맥 스크린 하단에는
보통 "완"이라는 문자열만 보일 것이다.( 하니맥 실행시
명시적으로 "-nw" 옵션을 줄 때만 그렇다. 그 옵션을 주지 않고 하니맥을
터미널에서 실행한 경우에는 "영/완/2"라는 문자열이 모두 나타날
것이다. 이때는 하니맥을 터미널용으로만 컴파일했거나, remote login에
의해서 하니맥을 실행한 경우이다. ) 이것은 앞에서 얘기했듯이
하니맥이 한글 완성형 코드를 지원하는 상태로 동작하고 있다는 뜻이다.
여기서 주의할 점은, 이때 한텀도 한글 완성형 모드로 동작해야 한다는
것이다. 그렇지 않으면 한글 입출력에 심각한 문제가 생긴다. 한글 조합형
코드를 채택해서 실행할 때도 마찬가지이다.

4.1.1 한텀 customizing

한텀에서 ESC키 대신에 Meta키를 사용하고자 할 때 다음 코드를
/usr/lib/X11/app-defaults/Hanterm( Openwin 사용시
/usr/openwin/lib/app-defaults/Hanterm 화일 끝에 추가한다.)
화일 끝에 추가해야 한다.
만약 수퍼유저 권한이 없으면 홈디렉토리의 .Xdefaults 화일에
다음 내용을 추가하되 '*' 앞에 'Hanterm'이라고 쓴다.

!For Emacs
*VT100.EightBitInput: false
*VT100.Translations: #override Meta<KeyPress>: string(0x1b) insert()

그리고나서 다음 명령어를 수행한다.

$ xrdb -merge /usr/lib/X11/app-defaults/Hanterm 또는
$ xrdb -merge ~/.Xdefaults

한편, 하니맥 실행시 하니맥 스크린 메시지가 스크롤되서 올라가 버릴
경우가 있다. 이것은 하니맥 스크린 크기와 터미널 윈도우 크기가 맞지
않는다는 뜻이므로, 하니맥 실행 전에 다음과 같이 터미널 크기를 
resize한다.

$ eval `resize`

4.2 한글 폰트

하니맥을 쉘에서 실행시킬 때 다음과 같은 에러 메시지가 출력되고
실행되지 않는 경우가 있다. 

English or Hangul Font is not defined.

이럴 때는 한글 폰트를 command line에서 명시적으로 지정해야
한다. 안타깝지만 이 방법외에 한글 폰트를 지정할 수 있는 방법이
없다. 따라서 필요한 한글 폰트와 영문 폰트는 그 이름을 alias시켜 사용하는
것이 편할 것이다.

$ hanemacs -hfn -kaist-iyagi-bold-r-normal--16-160-75-75-c-160-johabs-1  또는
$ hanemacs -fn -schumacher-clean-medium-r-normal--16-160-75-75-c-80-iso8859-1 \
	-hfn -kaist-iyagi-bold-r-normal--16-160-75-75-c-160-johabs-1

영문 폰트와 한글 폰트는 높이와 폭이 일치해야만 사용할 수 있다. 16
포인트 이외의 폰트를 사용하려면 높이와 폭이 일치하는 폰트들의 쌍을
찾아야 한다.

한편 한글 폰트 중에는 완성형 폰트로서 내부 인덱싱 방법이 다른 것이
있다. 예를 들어 다음 한글 폰트가 그러한데,

-daewoo-mincho-medium-r-normal--16-120-100-100-c-160-ksc5601.1987-0

이런 경우에는 한글 폰트를 지정할 때 "-ks"라는 별도의 옵션이 필요하다.
보통 대부분의 완성형 폰트는 "-ks" 옵션이 필요없다.

$ hanemacs -hfn \
-daewoo-mincho-medium-r-normal--16-120-100-100-c-160-ksc5601.1987-0 -ks

하니맥은 몇 가지 한글 폰트에 대해서는 내부에서 폰트 찾기를 자동적으로
수행한다. 영문 폰트는 다음 두 가지를 찾고,

-schumacher-clean-bold-r-normal--16-160-75-75-c-80-iso8859-1
-schumacher-clean-medium-r-normal--16-160-75-75-c-80-iso8859-1

한글 폰트는 다음 네 가지를 차례대로 찾는다.

-kaist-iyagi-bold-r-normal--16-160-75-75-c-160-johabs-1
-daewoo-mincho-medium-r-normal--16-120-100-100-c-160-ksc5601.1987-0
-kaist-myeongjo-bold-r-normal--16-160-75-75-c-160-johabs-1
-kaist-myungjo-bold-r-normal--16-120-100-100-c-160-ksc5601.1987-0

그러나 X 윈도우가 이와 같은 한글 폰트를 갖고 있더라도 하니맥이 한글
폰트를 찾지 못하는 경우가 있다. 이것은 하니맥의 버그인데 보통 remote
host에서 하니맥을 실행하는 경우이거나, eXceed와 같은 프로그램의 도움을
받아 하니맥을 실행하는 경우이다. 어떤 경우이든지 command line에서 영문
폰트와 한글 폰트를 명시적으로 지정하면 실행에는 문제가 없다.
(X 윈도우에 등록된 폰트 이름을 보려면 "xlsfonts | grep fontname"을 
실행해 보라. )

X 윈도우에 등록된 한글 폰트가 없다면 한텀 소스에 포함된 한글 폰트를
가져다가 설치하라. 하니맥에서 한자를 사용하고 싶다면 한자 폰트를
포함하는 한글 폰트를 사용해야 한다. 위에서 열거한 폰트 중에 다음 두
가지는 한자 폰트를 같이 포함하고 있는 것이다.

-kaist-iyagi-bold-r-normal--16-160-75-75-c-160-johabs-1
-daewoo-mincho-medium-r-normal--16-120-100-100-c-160-ksc5601.1987-0

4.3 한글 코드와 코드 변환 

하니맥 2.1은 기본적으로 한글 완성형 코드(KSC5601)를 완벽히 지원하도록
만들어졌다. 하니맥의 많은 편집 명령어들은 완성형 코드를 사용할 때
무리없이 동작할 것이다. 

그리고 하니맥 2.0 beta에서 한글 상용 조합형 코드를 일부 지원하였던
것을 확장하였다. 한글 조합형 코드를 사용하면서 대부분의 편집 명령어를
사용할 수가 있다. 하니맥 2.0 beta에서는 한글 조합형 코드의 탐색과
교체(search and replace)는 가능하지 않았지만, 하니맥 2.1에서는
가능하다.

하니맥에서 조합형 코드를 사용할 때는 몇 가지 문제점이 있다는 것을
알아야 한다. 

- Auto Fill 모드에서 한글 문장이 상당히 짧게 나뉜다.
- 한텀에서 한 라인보다 길게 한글 문장을 입력할 때 라인의 끝을
알리는 "\"가 라인 끝에 나타나지 않고 다음 라인에 나타나는
경우가 간혹 있다. 이때는 "C-l" 명령어를 수행해야 한다.
- 정규식(regexp) 탐색과 교체는 불가능하다.

한편, 하니맥이 두 가지 한글 코드를 동시에 지원하므로 이들 사이의 코드
변환기가 필요하게 되었다. 완성형 버퍼를 조합형 버퍼로 바꾼다든가,
조합형 버퍼를 완성형 버퍼로 바꾼다든가하는 경우에 한글 코드 변환이
필요하다. 그리고 RMAIL이나 기타 다른 메일러를 통해 한글 메일을 읽는
경우에, 디코딩이 덜된 한글 메일을 완전히 디코딩해서 볼 수도 있다.

M-x han-convert-code             : 현행 버퍼의 코드를 변환할 때
M-x han-convert-code-on-region   : 지정한 영역의 코드를 변환할 때

이 두 명령어는 시스템에 설치된 한글 코드 변환기, 예를 들어 hcode,
iso2ks, ks2iso, sdn2ks, ks2sdn 등과 같은 프로그램을 자식 프로세스로
호출하여 현재의 작업 버퍼의 한글 코드를 변경하는 기능을 한다.
두번째 명령어를 사용하려면 "C-SPC" 명령어로 영역을 먼저 잡아야 한다. 

만약 사용자가 현재의 완성형 버퍼를 조합형 버퍼로 바꾸고자 한다면,
다음과 같이 입력하라.

M-x han-convert-code
Command like "hcode -kt, iso2ks, ks2sdn..." : hcode -kt

여기서 "hcode -kt"의 옵션 "-kt"는 hcode 프로그램에서 소개하는 옵션
중에 하나를 선택한 것이다. ":" 다음에 지정한 명령어는 현행 버퍼를
stdin으로 받고 처리하여 stdout으로 결과를 출력하며, 그 결과는 다시
현행 버퍼에 overwrite된다. 

한글 코드 변환기 hcode가 여러 가지 옵션을 갖고 있으므로 여러 종류의
변환이 가능할 것이다. 그러나 되도록이면 완성형 변환, 조합형 변환만
사용하기 바란다. 다른 한글 코드에 대해서 하니맥은 안정적인 편집 기능을
보장할 수 없다.


hcode  [-a[b]]  [ in_file(-) [out_file] ]
 
Choices of A-Input_Code and B-Output_Code
        <k>SC : KSC-5601-1987 with 8byte extension
              : also accepts Han3 Code in input mode
        <h>an3 : meaningful only for output code.
        <i>SO-2022-kr : Hangul Mailing Codes
        S<d>N : B_encoded_Header+\n+Body_in_ISO2022
        <t>rigem : 15 bit Trigem Combination Code
        <r>oman : Hangul Romanization Code
        <n>Byte : Old starndard in Unix system
        <s>im_Key : Simulation of 2 set Keyboard
                Version 2.0 By jylee@kitty.cims.nyu.edu


이와 같은 한글 코드 변환은 한글 메일을 읽고 보낼 때 사용될 수도 있다. 

대개의 시스템에서는 한글 sendmail이 한글 메일을 완전히 처리해서 다른
메일러에게 넘겨주고 있다. 따라서 하니맥 안에서 RMAIL, VM, MH와 같은
메일러를 사용할 때, 완전히 디코딩된 한글 메일을 받아볼 수 있다.

그러나, hmail을 사용하는 시스템에서 한글 sendmail(version 8)의 메일을 
받다 보면 메일 헤더의 한글이 깨지는 경우가 있다. 이때 코드 변환기로
디코딩을 한번 더 함으로써 완전한 메일을 볼 수 있을 것이다.
( 이 경우에는 iso2ks 또는 sdn2ks를 사용하기 바란다. )

4.4 한글 isearch

하니맥은 한글을 사용할 수 있는 다른 이맥스와 달리, 유일하게 한글 자모
단위의 탐색을 할 수 있다. 이것은 하니맥을 X 윈도우 상에 실행한
경우에만 해당하며, 한텀 안에서 실행한 경우에는 해당하지 않는다.

한글 자모 단위 탐색은 하니맥 2.0 beta에서 이미 개선되었다. 과거 하니맥
1.0에서 사용자가 'ㅎ','ㅏ','ㄴ'을 차례대로 입력할 때, 탐색 함수가 
"한"이라는 문자열은 탐색하지만 "하나"라는 문자열을 지나쳐 버리는
문제가 있었다. 물론 사용자가 'ㅏ'를 마저 입력하고 다시 탐색하면 되긴
하지만 이것은 조금 불편하였다. 하니맥 2.0 beta, 하니맥 2.1에서는
이 문제를 개선하여 한글이 입력될 때 만들어질 수 있는 모든 문자열을 
탐색할 수 있다.

만약 하니맥 1.0에서처럼 종성에 우선 순위를 두어 문자열을 탐색하고자
하는 경우에, 다음 명령어를 먼저 수행하기 바란다. 이 명령어를 한번
더 호출하면 종성에 우선 순위를 두는 탐색 방법은 취소된다.

M-x han-search-exact-jongsung

한글 isearch(incremental search)는 "C-s" 명령어를 입력하면서
시작되는데, 한텀 안에서 실행한 경우는 별로 주의를 기울일 내용이
없으므로 X 윈도우에서 실행한 경우만 설명하겠다.
다음 설명은 전진 탐색(forward), 후진 탐색(backward) 모두 해당한다. 

- 탐색 문자열의 끝이 한글인 경우,그 글자는 늘 "조합중"인 상태로
간주된다. 가령 탐색 문자열이 "한ㄱ"일 때 하니맥은 첫번째 글자가
"한"이고, 두번째 글자의 초성이 "ㄱ"인 문자열을 찾을 것이다. 
예를 들어 "한글", "한국", "한가위" 등의 문자열은 모두 해당된다.
- 여기서 "조합중"이란 말은 초,중,종성과 같은 순서가 지켜져야
한다는 것을 뜻하지는 않는다. 중성이나 종성만 입력해도 그와 같은 
중성과 종성을 가진 문자열은 선택된다. 예를 들어 탐색 문자열이 
"한ㅏ"일 때, 하니맥은 첫번째 글자가 "한"이고 두번째 글자의 중성이 
"ㅏ"인 문자열을 찾을 것이다. 가령, "한낮", "한가위", "한라" 등의 
문자열은 모두 해당된다.
- 2벌식 또는 3벌식에 따라, 각각의 입력방식에서 입력 가능한 모든 
문자열은 탐색될 수 있다. 그러나 입력이 불가능한 문자열을 탐색될 수
없다. 가령, "짓ㅀ"과 같은 탐색 문자열은 2벌식에서는 만들어질 수가
없기 때문에 탐색될 수 없으나, 3벌식에서는 가능하다.
- "조합중" 상태는 탐색 문자열의 끝이 한글인 경우에만 적용된다.
따라서 탐색 문자열이 "하나"라고 해서 "한낮"이라는 문자열이 선택되는 
것은 아니다.
- "C-s"를 반복해서 누르면 search-repeat 함수가 호출되는데, 
탐색 문자열 끝의 조합 중 상태는 계속 유지된다.
- Backspace 키를 누르면 탐색 지점을 되짚어 돌아가거나,
탐색 문자열이 하나씩 지워진다. 이때 탐색 문자열의 끝이 한글이면 
한 자모씩 지워지고 계속 "조합 중" 상태를 유지한다. 즉 backspace 
키를 눌러 탐색 문자열이 "한ㄱ"이 되더라도, 즉시 "ㅡ"를 입력해서 
"한글"이라는 문자열을 찾을 수 있다.
- 탐색 문자열의 "조합 중" 상태를 원하지 않는 경우가 있다.
가령, 글자 "ㄱ"을 찾고 싶은데, "ㄱ"을 초성으로 삼는 모든 문자열을 
차례대로  찾아간다면 너무 많은 시간이 소요될 것이다. 
이럴 경우 "ㄱ"을  입력하고 나서 shift space를 눌러 영문상태로 
전환한다. 그러면 탐색 문자열의 "조합 중" 상태는 취소되고 글자 
"ㄱ"은 즉시 탐색될 것이다.
- 한자를 탐색하고 싶을 때 isearch에서는 한자를 입력할 방법이
없으므로 nonincremental-search-forward를 이용하길 바란다. 한자를
입력하는 방법은 다음 절에서 설명하겠다.

한편 "C-M-s" 명령어를 입력하면 정규식 탐색(isearch-forward-regexp)을
할 수가 있다. 하니맥은 한글 정규식을 실제로 구현하지는 않았기 때문에
사실상 정규식 탐색은 부정확하다. 그러나 대개의 경우 이맥스 사용자가
탐색하거나 교체하려는 한글 문자열 대부분은, 한글 완성형 코드를
사용할 때, 정규식 탐색이 틀리는 범위에 해당하지 않는다.
다음 문제점에 주의하면서 탐색과 교체를 하면 될 것이다.

- 정규식 탐색은 한글 자모 단위가 아니라 한글 글자 단위이다.
- 정규식 탐색에서 한자를 입력하면 안 된다.
- isearch-regexp에서 단어 속성을 나타내는 "w" 특수문자를 사용해
커서를 한글 반쪽에 위치시킬 수가 있다. 이렇게 되면 커서가 한글 두 자에
걸치게 되어 깨진 글자가 출력된다. 탐색을 종료하고 커서를 이동하면
글자는 원래대로 출력될 것이다. 그러나 탐색을 종료하면서 임의의 문자를
입력하면, 커서가 놓인 자리 주변의 한글 글자들은 정말로 깨질 것이다.
- 같은 정규식에 대해 isearch-forward-regexp 명령어는 제대로 동작하는데
반해 nonincremental-re-search-forward 명령은 잘못 동작하는 경우가
있었다. 이것은 "w" 특수문자를 사용할 때 나타난다.

한글 정규식은 하니맥 다음 버전에서 완전하게 구현될 예정이다.

4.5 한자 변환

하니맥의 한자 변환 기능은 한글 완성형 코드에 등록된 한자들에 대해서
구현되었고, 한글 한 글자에 대해서만 가능하다. 한자 단어 사전이
없으므로 한자 단어 변환은 할 수 없다.

하니맥 한자 변환기는 스크린에 한자 윈도우를 열고 원하는 한자를 선택한
다음 윈도우를 닫는 방식으로 만들어졌다. 동작을 간단히 설명하면,

- 한자로 바꾸고자 하는 한글 글자 위에 커서를 올려 놓는다.
- "C-c s"(M-x split-hanja-window)를 입력하면 한자 윈도우가 열린다.
- 원하는 한자 위에 커서를 올려 놓는다.
- "C-c d"(M-x delete-hanja-window)를 입력하면 한자 윈도우가
닫히면서 한글이 한자로 바뀐다.

여기서 한자 윈도우를 열고 닫는 명령키가 F9와 같은 펑션키가 아닌데,
만약 펑션키로 지정하고 싶으면 .emacs 안에 다음과 같이 써 넣는다.

(global-set-key [f9] 'split-hanja-window)
(global-set-key [f8] 'delete-hanja-window)

그러나, 이 펑션키는 X 윈도우 상에서 하니맥을 실행할 때만 동작하고,
한자한텀 안에서 하니맥을 "-nw" 옵션으로 실행할 때
동작하지 않는다는 것을 알아야 한다. 한자한텀은 F9를 자체 한자 변환키로
사용하기 때문에 하니맥에서 이것을 한자 변환키로 사용할 수 없다.
다음과 같이 한자한텀이 사용하지 않는 펑션키를 지정해서 사용할 수
있다. 

(global-set-key [f6] 'split-hanja-window)
(global-set-key [f5] 'delete-hanja-window)

한자 변환기를 사용할 때 주의할 점은 다음과 같다.

- 하니맥의 한자 변환기는 X 윈도우 상에서 실행할 때 한글을 조합하는
중에 호출할 수도 있다. 가령 "한"이라는 글자를
입력했다면 커서는 그 뒤에 달라붙을 터인데, 커서가 글자 위에 놓여 있지
않아도 한글 조합 중에는 한자 변환기를 호출할 수 있다. 물론 한자는 
"한"이라는 글자 위에 overwrite된다.
- 한글 조합 중일 때 hanja-append-mode에서도 한글 변환기는 무리없이
동작한다(아래 설명).
- 한자한텀 안에서 한글을 조합 중일 때 하니맥의 한자변환기를 호출할
수 없다. 이때는 한자한텀의 한자변환기를 사용해야 한다.
- 한자 윈도우가 열린 상태에서 다시 한자 윈도우를 열려고 하면 한자
윈도우는 취소된다. 
- 한글이 아닌 문자 위에 커서를 올려 놓고 한자 윈도우를 열려고 하면
한자 윈도우는 열리지 않는다.
- 한자 위에 커서를 올려 놓고 한글로 변환할 수 없다.
- nonincremental-search, query-replace, replace-string과 같은
명령어에서도 한자를 같은 방식으로 입력할 수 있다.
- 정규식(regexp)에서 한자를 입력해서는 안 된다.

그리고 한글 위에 한자를 덮어쓰기를 원치 않는 경우를 대비해 Lisp 변수
hanja-append-mode라는 변수를 만들어 놓았다. 이 변수는 평소에 nil값을
가져서 한자 변환기가 overwrite 모드로만 동작하게 한다.
만약 한자를 덮어쓰지 않고 한글 뒤에 달라붙게 하고 싶으면 이 변수값을
t로 바꾼다.

하니맥 실행 중에 그 변수 값을 바꾸려면 "M-:"(M-x eval-expression) 
명령어를 입력하고, 다음 코드를 입력한다.

(setq hanja-append-mode t)

이 Lisp 코드는 .emacs 화일에 넣어둘 수도 있다.
만약 hanja-append-mode를 취소하고 싶으면 다음 코드를 입력한다.

(setq hanja-append-mode nil)



5 알려진 버그 및 개선점

하니맥 2.1의 이미 알려진 버그와 개선할 점을 열거하였다.

- 한글 폰트
-- 보통 remote host에서 하니맥을 실행한 경우 한글 폰트를 찾지 못할
때가 있다. command line에서 '-fn', '-hfn' 옵션으로 폰트를 지정해야 한다.


- 한글 조합형 코드
-- Auto Fill 모드에서 한글 문장이 상당히 짧게 나뉜다.
-- 한텀에서 한 라인보다 길게 한글 문장을 입력할 때 라인의 끝을
알리는 "\"가 라인 끝에 나타나지 않고 다음 라인에 나타나는
경우가 간혹 있다. 이때는 "C-l" 명령어를 수행해야 한다.
-- 정규식(regexp) 탐색과 교체는 불가능하다.


- 정규식(regexp)
-- 한글 완성형 코드에서도 제한적으로 정규식을 사용할 수 있다.
-- 한자를 섞어서 사용할 수 없다.


- 한자 변환
-- 한자 윈도우 조작이 유연하지 못하다.
-- 한자를 한글로 변환할 수 없다.
-- 한자 단어 사전이 없다.


- 디스플레이
-- 미니버퍼에 한글 또는 한자의 잔상이 남는 경우가 있다.
-- 한글 글자 위에서 커서의 잔상이 남거나 커서 크기가 맞지 않는
경우가 있다.
-- latex-mode와 font-lock-mode 사용시 "\" 뒤에서 한글
한 글자의 색깔이 바뀐다.
-- 한글 X 라이브러리를 링크해서 사용할 때 시스템에 따라서 
커서 잔상이 남거나 커서가 없어지는 문제가 있다.

하니맥 2.1이 하니맥 2.0 beta에 비해서 개선된 점은 다음과 같다.


- 한자 변환기, 한글 코드 변환 기능을 갖추었다.
- 한글 isearch의 기능이 개선되었다.
- 한텀 안에서 하니맥이 보다 유연하게 동작하도록 했다.
- 기타 버그를 고쳤다.
-- 미니버퍼 및 일반 버퍼에서 한글이 초기화되지 않는 문제를 고쳤다.
-- latex-mode와 font-lock-mode 사용시 "\" 뒤에서 한글
출력이 깨지는 것을 바로 잡았다.
-- rlogin 터미널 안에서 하니맥을 실행했을 때 한글이 무수히 깨지는
문제를 고쳤다.
-- forward-char 외에 forward-byte 함수를 갖추었다.

참고로, forward-byte는 하니맥이 메일 헤더를 읽을 때 나타나는 문제점을
고치기 위한 것이다. 하니맥이 한글 메일의 헤더를 읽을 때 
한글 제목에서 content-length만큼 forward-char(한글 두 포인트씩 이동)를
호출하는 것이 문제가 되었다. 그래서 한글 제목의 바이트 수만큼만
포인트를 이동하도록 forward-byte 함수를 제공하였다.

하니맥 사용자들 중에 이와 같은 문제를 만나는 사람은 다음과 같이
버그패치를 하기 바란다.


- 사용하는 메일러의 Lisp 코드를 찾는다.
- 메일 헤더의 content-length만큼 forward-char 함수를 호출하는
부분을 찾는다.
- forward-char를 forward-byte로 바꾼다.
- 새로 고친 Lisp의 소스 코드를 M-x byte-compile-file 명령어로
컴파일하고 하니맥을 새로 실행한다.



6 하니맥 개발자 정보

6.1 Windows95 버전

하니맥 Windows95 버전은 현재 작업 중에 있다. 그러나 배포 일정에
대해서는 확답을 할 수 없으므로, 만약 하니맥 Win95 포팅을 직접 하고자
하는 사람이 있다면 그렇게 해도 좋을 것이다. 필요한 기술적인 정보는
메일을 통해 제공할 것이다.

6.2 유니코드와 하니맥 개발 계획

하니맥은 GNU Emacs를 기반으로 계속 만들어질 것이다. GNU에서도
유니코드를 중심으로 소프트웨어를 통합하기를 바라기 때문에 조만간
유니코드 버전의 GNU Emacs가 등장할 것으로 기대된다.

그러면, 하니맥의 개발은 GNU Emacs에 구현될 수 없는 하니맥의 고유한
기능(isearch)을 GNU Emacs에 이식하고, 우리말 실정에 맞는 한글
유틸리티를 개발하는 방향으로 진행될 것이다.

본인이 개인적으로 희망하는 한글 유틸리티는 다음과 같다.

- 한자 단어 사전
- 한글 맞춤법 검사기

이런 유틸리티는 이미 상용으로 만들어진 것이 많지만, 소스 코드를 얻기가
힘들고 또 free로 배포하는 것을 허용치 않는다.
그래서 기회가 될 때 이들 유틸리티를 작성하고 하니맥에 embedding시켜
배포하고자 한다.

만약 위와 같은 한글 유틸리티의 소스 코드를 free로 배포할 용의가 있거나
하니맥 개발팀에 합류하여 제작할 뜻이 있는 사람은 본인에게 꼭 연락을 해
주길 바란다.

6.3 버그 리포트

하니맥 2.1 설치 및 사용에 있어서 나타나는 문제점은
khkim@archi.snu.ac.kr로 메일을 보내주시기 바랍니다.
그동안 리포트된 버그는 모두 고치려 했으나, 제가 버그 리포트 메일을
잃어버린 경우도 있었기 때문에 모두 고쳤다고 확신할 수 없군요.
하니맥 2.0 beta에 이어 나타나는 버그가 있다면 다시 리포트해 주시기
바랍니다. 

7 감사의 말씀

그동안 하니맥 2.1의 배포까지 많은 충고와 조언, 버그 리포트를 해 주신
여러분들께 다시 한번 감사드립니다. 앞으로 하니맥을 많이 많이 사랑해
주시길 바랍니다.

그리고 한자 변환기를 작성하는데 일일이 한자 교정을 봐 주신 이 현주양에게 
특히 감사드립니다.
