diff lisp/egg/egg-sj3.el @ 70:131b0175ea99 r20-0b30

Import from CVS: tag r20-0b30
author cvs
date Mon, 13 Aug 2007 09:02:59 +0200
parents
children 262b8bb4a523
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/egg/egg-sj3.el	Mon Aug 13 09:02:59 2007 +0200
@@ -0,0 +1,1409 @@
+;; Kana Kanji Conversion Protocol Package for Egg
+;; Coded by K.Ishii, Sony Corp. (kiyoji@sm.sony.co.jp)
+
+;; This file is part of Egg on Mule (Multilingal Environment)
+
+;; Egg is distributed in the forms of patches to GNU
+;; Emacs under the terms of the GNU EMACS GENERAL PUBLIC
+;; LICENSE which is distributed along with GNU Emacs by the
+;; Free Software Foundation.
+
+;; Egg is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE.  See the GNU EMACS GENERAL PUBLIC LICENSE for
+;; more details.
+
+;; You should have received a copy of the GNU EMACS GENERAL
+;; PUBLIC LICENSE along with Nemacs; see the file COPYING.
+;; If not, write to the Free Software Foundation, 675 Mass
+;; Ave, Cambridge, MA 02139, USA.
+
+
+;;;
+;;; sj3-egg.el 
+;;;
+;;; $B!V$?$^$4!W$N(B sj3 $B%P!<%8%g%s(B
+;;; $B$+$J4A;zJQ49%5!<%P$K(B sj3serv $B$r;H$$$^$9!#(B
+;;;
+;;; sj3-egg $B$K4X$9$kDs0F!"Cn>pJs$O(B kiyoji@sm.sony.co.jp $B$K$*Aw$j2<$5$$!#(B
+;;;
+;;;                                                $B@P0f(B $B@6<!(B
+
+(require 'egg)
+(provide 'sj3-egg)
+(if (not (boundp 'SJ3))
+    (require 'sj3-client))
+
+;;;;  $B=$@5%a%b!(!((B
+;;;; Jul-20-93 by age@softlab.is.tsukuba.ac.jp (Eiji FURUKAWA)
+;;;;  Bug fixed in diced-add, *sj3-bunpo-menu* and
+;;;;  set-egg-henkan-mode-format.
+
+;;;; Mar-19-93 by K.Ishii
+;;;;  DicEd is changed, edit-dict-item -> edit-dict
+
+;;;; Aug-6-92 by K.Ishii
+;;;;  length $B$r(B string-width $B$KJQ99(B
+
+;;;; Jul-30-92 by K.Ishii
+;;;;  set-default-usr-dic-directory $B$G:n$k<-=q%G%#%l%/%H%jL>$N=$@5(B
+;;;;  jserver-host-name, $B4D6-JQ?t(B JSERVER $B$N:o=|(B
+;;;;  
+
+;;;; Jul-7-92 by Y.Kawabe
+;;;;  jserver-host-name $B$r%;%C%H$9$k:]$K4D6-JQ?t(B SJ3SERV $B$bD4$Y$k!#(B
+;;;;  sj3fns.el $B$N%m!<%I$r$d$a$k!#(B
+
+;;;; Jun-2-92 by K.Ishii
+;;;;  sj3-egg.el $B$r(B wnn-egg.el $B$HF1MM$KJ,3d(B
+
+;;;; May-14-92 by K.Ishii
+;;;;  Mule $B$N(B wnn-egg.el $B$r(B sj3serv $B$H$NDL?.MQ$K=$@5(B
+
+;; XEmacs addition: (and remove disable-undo variable)
+;; For Emacs V18 compatibility
+(and (not (fboundp 'buffer-disable-undo))
+     (fboundp 'buffer-flush-undo)
+     (defalias 'buffer-disable-undo 'buffer-flush-undo))
+
+;;;----------------------------------------------------------------------
+;;;
+;;; Version control routine
+;;;
+;;;----------------------------------------------------------------------
+
+(defvar sj3-egg-version "3.00" "Version number of this version of Egg. ")
+;;; Last modified date: Thu Aug  4 21:18:11 1994
+
+(and (equal (user-full-name) "Kiyoji Ishii")
+     (defun sj3-egg-version-update (arg)
+       (interactive "P")
+       (if (equal (buffer-name (current-buffer)) "sj3-egg.el")
+	   (save-excursion
+	    (goto-char (point-min))
+	    (re-search-forward "(defvar sj3-egg-version \"[0-9]+\\.")
+	    (let ((point (point))
+		  (minor))
+	      (search-forward "\"")
+	      (backward-char 1)
+	      (setq minor (string-to-int (buffer-substring point (point))))
+	      (delete-region point (point))
+	      (if (<= minor 8) (insert "0"))
+	      (insert  (int-to-string (1+ minor)))
+	      (re-search-forward "Last modified date: ")
+	      (kill-line)
+	      (insert (current-time-string)))
+	    (save-buffer)
+	    (if arg (byte-compile-file (buffer-file-name)))
+	 )))
+     )
+
+;;;----------------------------------------------------------------------
+;;;
+;;; KKCP package: Kana Kanji Conversion Protocol
+;;;
+;;; KKCP to SJ3SERV interface; 
+;;;
+;;;----------------------------------------------------------------------
+
+(defvar *KKCP:error-flag* t)
+
+(defun KKCP:error (errorCode &rest form)
+  (cond((eq errorCode ':SJ3_SOCK_OPEN_FAIL)
+	(notify "EGG: %s $B>e$K(B SJ3SERV $B$,$"$j$^$;$s!#(B" (or (get-sj3-host-name) "local"))
+	(if debug-on-error
+	    (error "EGG: No SJ3SERV on %s is running." (or (get-sj3-host-name) "local"))
+	  (error  "EGG: %s $B>e$K(B SJ3SERV $B$,$"$j$^$;$s!#(B" (or (get-sj3-host-name) "local"))))
+       ((eq errorCode ':SJ3_SERVER_DEAD)
+	(notify "EGG: %s $B>e$N(BSJ3SERV $B$,;`$s$G$$$^$9!#(B" (or (get-sj3-host-name) "local"))
+	(if debug-on-error
+	    (error "EGG: SJ3SERV on %s is dead." (or (get-sj3-host-name) "local"))
+	  (error  "EGG: %s $B>e$N(B SJ3SERV $B$,;`$s$G$$$^$9!#(B" (or (get-sj3-host-name) "local"))))
+       ((and (consp errorCode)
+	     (eq (car errorCode) ':SJ3_UNKNOWN_HOST))
+	(notify "EGG: $B%[%9%H(B %s $B$,$_$D$+$j$^$;$s!#(B" (car(cdr errorCode)))
+	(if debug-on-error
+	    (error "EGG: Host %s is unknown." (car(cdr errorCode)))
+	  (error "EGG: $B%[%9%H(B %s $B$,$_$D$+$j$^$;$s!#(B" (car(cdr errorCode)))))
+       ((and (consp errorCode)
+	     (eq (car errorCode) ':SJ3_UNKNOWN_SERVICE))
+	(notify "EGG: Network service %s $B$,$_$D$+$j$^$;$s!#(B" (car(cdr errorCode)))
+	(if debug-on-error
+	    (error "EGG: Service %s is unknown." (car(cdr errorCode)))
+	  (error "EGG: Network service %s $B$,$_$D$+$j$^$;$s!#(B" (cdr errorCode))))
+       (t
+	(notify "KKCP: $B860x(B %s $B$G(B %s $B$K<:GT$7$^$7$?!#(B" errorCode form)
+	(if debug-on-error
+	    (error "KKCP: %s failed because of %s." form errorCode)
+	  (error  "KKCP: $B860x(B %s $B$G(B %s $B$K<:GT$7$^$7$?!#(B" errorCode form)))))
+
+(defun KKCP:server-open (hostname loginname)
+  (let ((result (sj3-server-open hostname loginname)))
+    (cond((null sj3-error-code) result)
+	 (t (KKCP:error sj3-error-code 'KKCP:server-open hostname loginname)))))
+
+(defun KKCP:use-dict (dict &optional passwd)
+  (let ((result (sj3-server-open-dict dict passwd)))
+    (cond((null sj3-error-code) result)
+	 ((eq sj3-error-code ':sj3-no-connection)
+	  (EGG:open-sj3)
+	  (KKCP:use-dict dict passwd))
+	 ((null *KKCP:error-flag*) result)
+	 (t (KKCP:error sj3-error-code 
+			'kkcp:use-dict dict)))))
+
+(defun KKCP:make-dict (dict)
+  (let ((result (sj3-server-make-dict dict)))
+    (cond((null sj3-error-code) result)
+	 ((eq sj3-error-code ':sj3-no-connection)
+	  (EGG:open-sj3)
+	  (KKCP:make-dict dict))
+	 ((null *KKCP:error-flag*) result)
+	 (t (KKCP:error sj3-error-code 
+			'kkcp:make-dict dict)))))
+
+(defun KKCP:use-stdy (stdy)
+  (let ((result (sj3-server-open-stdy stdy)))
+    (cond((null sj3-error-code) result)
+	 ((eq sj3-error-code ':sj3-no-connection)
+	  (EGG:open-sj3)
+	  (KKCP:use-stdy stdy))
+	 ((null *KKCP:error-flag*) result)
+	 (t (KKCP:error sj3-error-code 
+			'kkcp:use-stdy stdy)))))
+
+(defun KKCP:make-stdy (stdy)
+  (let ((result (sj3-server-make-stdy stdy)))
+    (cond((null sj3-error-code) result)
+	 ((eq sj3-error-code ':sj3-no-connection)
+	  (EGG:open-sj3)
+	  (KKCP:make-stdy stdy))
+	 ((null *KKCP:error-flag*) result)
+	 (t (KKCP:error sj3-error-code 
+			'kkcp:make-stdy stdy)))))
+
+(defun KKCP:henkan-begin (henkan-string)
+  (let ((result (sj3-server-henkan-begin henkan-string)))
+    (cond((null sj3-error-code) result)
+	 ((eq sj3-error-code ':sj3-no-connection)
+	  (EGG:open-sj3)
+	  (KKCP:henkan-begin henkan-string))
+	 ((null *KKCP:error-flag*) result)
+	 (t (KKCP:error sj3-error-code 'KKCP:henkan-begin henkan-string)))))
+
+(defun KKCP:henkan-next (bunsetu-no)
+  (let ((result (sj3-server-henkan-next bunsetu-no)))
+    (cond ((null sj3-error-code) result)
+	  ((eq sj3-error-code ':sj3-no-connection)
+	   (EGG:open-sj3)
+	   (KKCP:henkan-next bunsetu-no))
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'KKCP:henkan-next bunsetu-no)))))
+
+(defun KKCP:henkan-kakutei (bunsetu-no jikouho-no)
+  ;;; NOTE: $B<!8uJd%j%9%H$,@_Dj$5$l$F$$$k$3$H$r3NG'$7$F;HMQ$9$k$3$H!#(B
+  (let ((result (sj3-server-henkan-kakutei bunsetu-no jikouho-no)))
+    (cond ((null sj3-error-code) result)
+	  ((eq sj3-error-code ':sj3-no-connection)
+	   (EGG:open-sj3)
+	   (KKCP:henkan-kakutei bunsetu-no jikouho-no))
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'KKCP:henkan-kakutei bunsetu-no jikouho-no)))))
+
+(defun KKCP:bunsetu-henkou (bunsetu-no bunsetu-length)
+  (let ((result (sj3-server-bunsetu-henkou bunsetu-no bunsetu-length)))
+    (cond ((null sj3-error-code) result)
+	  ((eq sj3-error-code ':sj3-no-connection)
+	   (EGG:open-sj3)
+	   (KKCP:bunsetu-henkou bunsetu-no bunsetu-length))
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'kkcp:bunsetu-henkou bunsetu-no bunsetu-length)))))
+
+
+(defun KKCP:henkan-quit ()
+  (let ((result (sj3-server-henkan-quit)))
+    (cond ((null sj3-error-code) result)
+	  ((eq sj3-error-code ':sj3-no-connection)
+	   (EGG:open-sj3)
+	   (KKCP:henkan-quit))
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'KKCP:henkan-quit)))))
+
+(defun KKCP:henkan-end (&optional bunsetuno)
+  (let ((result (sj3-server-henkan-end bunsetuno)))
+    (cond ((null sj3-error-code) result)
+	  ((eq sj3-error-code ':sj3-no-connection)
+	   (EGG:open-sj3)
+	   (KKCP:henkan-end bunsetuno))	  
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'KKCP:henkan-end)))))
+
+(defun KKCP:dict-add (dictno kanji yomi bunpo)
+  (let ((result (sj3-server-dict-add dictno kanji yomi bunpo)))
+    (cond ((null sj3-error-code) result)
+	  ((eq sj3-error-code ':sj3-no-connection)
+	   (EGG:open-sj3)
+	   (KKCP:dict-add dictno kanji yomi bunpo))
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'KKCP:dict-add dictno kanji yomi bunpo)))))
+
+(defun KKCP:dict-delete (dictno kanji yomi bunpo)
+  (let ((result (sj3-server-dict-delete dictno kanji yomi bunpo)))
+    (cond ((null sj3-error-code) result)
+	  ((eq sj3-error-code ':sj3-no-connection)
+	   (EGG:open-sj3)
+	   (KKCP:dict-delete dictno kanji yomi bunpo))
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'KKCP:dict-delete dictno kanji yomi bunpo)))))
+
+(defun KKCP:dict-info (dictno)
+  (let ((result (sj3-server-dict-info dictno)))
+    (cond ((null sj3-error-code) result)
+	  ((eq sj3-error-code ':sj3-no-connection)
+	   (EGG:open-sj3)
+	   (KKCP:dict-info dictno))
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'KKCP:dict-info dictno)))))
+
+(defun KKCP:make-directory (pathname)
+  (let ((result (sj3-server-make-directory pathname)))
+    (cond ((null sj3-error-code) result)
+	  ((eq sj3-error-code ':sj3-no-connection)
+	   (EGG:open-sj3)
+	   (KKCP:make-directory pathname))
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'kkcp:make-directory pathname)))))
+
+(defun KKCP:file-access (pathname mode)
+  (let ((result (sj3-server-file-access pathname mode)))
+    (cond ((null sj3-error-code)
+	   (if (= result 0) t nil))
+	  ((eq sj3-error-code ':sj3-no-connection)
+	   (EGG:open-sj3)
+	   (KKCP:file-access pathname mode))
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'kkcp:file-access pathname mode)))))
+
+(defun KKCP:server-close ()
+  (let ((result (sj3-server-close)))
+    (cond ((null sj3-error-code) result)
+	  ((null *KKCP:error-flag*) result)
+	  (t (KKCP:error sj3-error-code 'KKCP:server-close)))))
+
+;;;----------------------------------------------------------------------
+;;;
+;;; Kana Kanji Henkan 
+;;;
+;;;----------------------------------------------------------------------
+
+;;;
+;;; Entry functions for egg-startup-file
+;;;
+
+(defvar *default-sys-dic-directory* "/usr/sony/dict/sj3")
+
+(defun set-default-sys-dic-directory (pathname)
+  "$B%7%9%F%`<-=q$NI8=`(Bdirectory PATHNAME$B$r;XDj$9$k!#(B
+PATHNAME$B$O4D6-JQ?t$r4^$s$G$h$$!#(B"
+
+  (setq pathname (substitute-in-file-name pathname))
+
+  (if (not (file-name-absolute-p pathname))
+      (error "Default directory must be absolute pathname")
+    (if (null (KKCP:file-access pathname 0))
+	(error 
+	 (format "System Default directory(%s) $B$,$"$j$^$;$s!#(B" pathname))
+      (setq *default-sys-dic-directory* (file-name-as-directory pathname)))))
+
+(defvar *default-usr-dic-directory* "/usr/sony/dict/sj3/user/$USER")
+
+(defun set-default-usr-dic-directory (pathname)
+  "$BMxMQ<T<-=q$NI8=`(Bdirectory PATHNAME$B$r;XDj$9$k!#(B
+PATHNAME$B$O4D6-JQ?t$r4^$s$G$h$$!#(B"
+
+  (setq pathname (file-name-as-directory (substitute-in-file-name pathname)))
+
+  (if (not (file-name-absolute-p pathname))
+      (error "Default directory must be absolute pathname")
+    (if (null (KKCP:file-access  pathname 0))
+	(let ((updir (file-name-directory (substring pathname 0 -1))))
+	  (if (null (KKCP:file-access updir 0))
+	      (error 
+	       (format "User Default directory(%s) $B$,$"$j$^$;$s!#(B" pathname))
+	    (if (yes-or-no-p (format "User Default directory(%s) $B$r:n$j$^$9$+!)(B" pathname))
+		(progn
+		  (KKCP:make-directory (directory-file-name pathname))
+		  (notify "User Default directory(%s) $B$r:n$j$^$7$?!#(B" pathname))
+	      nil ;;; do nothing
+	      ))))
+      (setq *default-usr-dic-directory* pathname)))
+
+(defun setsysdic (dict)
+  (let ((dictfile
+	 (concat (if (not (file-name-absolute-p dict)) 
+		     *default-sys-dic-directory*
+		   "")
+		 dict)))
+    (egg:setsysdict (expand-file-name dictfile))))
+
+(defun setusrdic (dict)
+  (let ((dictfile
+	 (concat (if (not (file-name-absolute-p dict))
+		     *default-usr-dic-directory*
+		   "")
+		 dict)))
+  (egg:setusrdict (expand-file-name dictfile))))
+
+(defvar egg:*dict-list* nil)
+
+(defun setusrstdy (stdy)
+  (let ((stdyfile
+	 (concat (if (not (file-name-absolute-p stdy))
+		     *default-usr-dic-directory*
+		   "")
+		 stdy)))
+  (egg:setusrstdy (expand-file-name stdyfile))))
+
+(defun egg:setsysdict (dict)
+  (cond((assoc (file-name-nondirectory dict) egg:*dict-list*)
+	(beep)
+	(notify "$B4{$KF1L>$N%7%9%F%`<-=q(B %s $B$,EPO?$5$l$F$$$^$9!#(B"
+		(file-name-nondirectory dict))
+	)
+       ((null (KKCP:file-access dict 0))
+	(beep)
+	(notify "$B%7%9%F%`<-=q(B %s $B$,$"$j$^$;$s!#(B" dict))
+       (t(let* ((*KKCP:error-flag* nil)
+		(rc (KKCP:use-dict dict)))
+	   (if (null rc)
+	       (error "EGG: setsysdict failed. :%s" dict)
+	       (setq egg:*dict-list*
+		     (cons (cons (file-name-nondirectory dict) dict)
+			   egg:*dict-list*)))))))
+
+;;; dict-no --> dict-name
+(defvar egg:*usr-dict* nil)
+
+;;; dict-name --> dict-no
+(defvar egg:*dict-menu* nil)
+
+(defmacro push-end (val loc)
+  (list 'push-end-internal val (list 'quote loc)))
+
+(defun push-end-internal (val loc)
+  (set loc
+       (if (eval loc)
+	   (nconc (eval loc) (cons val nil))
+	 (cons val nil))))
+
+(defun egg:setusrdict (dict)
+  (cond((assoc (file-name-nondirectory dict) egg:*dict-list*)
+	(beep)
+	(notify "$B4{$KF1L>$NMxMQ<T<-=q(B %s $B$,EPO?$5$l$F$$$^$9!#(B"
+		(file-name-nondirectory dict))
+	)
+       ((null (KKCP:file-access dict 0))
+	(notify "$BMxMQ<T<-=q(B %s $B$,$"$j$^$;$s!#(B" dict)
+	(if (yes-or-no-p (format "$BMxMQ<T<-=q(B %s $B$r:n$j$^$9$+!)(B" dict))
+	    (let ((*KKCP:error-flag* nil))
+	      (if (KKCP:make-dict dict)
+		  (progn
+		    (notify "$BMxMQ<T<-=q(B %s $B$r:n$j$^$7$?!#(B" dict)
+		    (let* ((*KKCP:error-flag* nil)
+			   (dict-no (KKCP:use-dict dict "")))
+		      (cond((numberp dict-no)
+			    (setq egg:*usr-dict* 
+				  (cons (cons dict-no dict) egg:*usr-dict*))
+			    (push-end (cons (file-name-nondirectory dict)
+					    dict-no) egg:*dict-menu*))
+			   (t (error "EGG: setusrdict failed. :%s" dict)))))
+		(error "EGG: setusrdict failed. : %s" dict)))))
+       (t (let* ((*KKCP:error-flag* nil)
+		 (dict-no (KKCP:use-dict dict "")))
+	    (cond((numberp dict-no)
+		  (setq egg:*usr-dict* (cons(cons dict-no dict) 
+					    egg:*usr-dict*))
+		  (push-end (cons (file-name-nondirectory dict) dict-no)
+			    egg:*dict-menu*)
+		  (setq egg:*dict-list*
+			(cons (cons (file-name-nondirectory dict) dict)
+			      egg:*dict-list*)))
+		 (t (error "EGG: setusrdict failed. : %s" dict)))))))
+
+(defun egg:setusrstdy (stdy)
+  (cond((null (KKCP:file-access stdy 0))
+	(notify "$B3X=,%U%!%$%k(B %s $B$,$"$j$^$;$s!#(B" stdy)
+	(if (yes-or-no-p (format "$B3X=,%U%!%$%k(B %s $B$r:n$j$^$9$+!)(B" stdy))
+	    (if (null (KKCP:make-stdy stdy))
+		(error "EGG: setusrstdy failed. : %s" stdy)
+	      (notify "$B3X=,%U%!%$%k(B %s $B$r:n$j$^$7$?!#(B" stdy)
+	      (if (null (KKCP:use-stdy stdy))
+		  (error "EGG: setusrstdy failed. : %s" stdy))
+	      )))
+	(t (if (null (KKCP:use-stdy stdy))
+	       (error "EGG: setusrstdy failed. : %s" stdy)))))
+
+
+;;;
+;;; SJ3 interface
+;;;
+
+(defun get-sj3-host-name ()
+  (cond((and (boundp 'sj3-host-name) (stringp sj3-host-name))
+	sj3-host-name)
+       ((and (boundp 'sj3serv-host-name) (stringp sj3serv-host-name))
+	sj3serv-host-name)
+       (t(getenv "SJ3SERV"))))				; 92.7.7 by Y.Kawabe
+
+(fset 'get-sj3serv-host-name (symbol-function 'get-sj3-host-name))
+
+(defun set-sj3-host-name (name)
+  (interactive "sHost name: ")
+  (let ((*KKCP:error-flag* nil))
+    (disconnect-sj3))
+  (setq sj3-host-name name)
+  )
+
+(defvar egg-default-startup-file "eggrc-sj3"
+  "*Egg startup file name (system default)")
+
+(defvar egg-startup-file ".eggrc-sj3"
+  "*Egg startup file name.")
+
+(defvar egg-startup-file-search-path (append '("~" ".") load-path)
+  "*List of directories to search for start up file to load.")
+
+(defun egg:search-file (filename searchpath)
+  (let ((result nil))
+    (if (null (file-name-directory filename))
+	(let ((path searchpath))
+	  (while (and path (null result ))
+	    (let ((file (substitute-in-file-name
+			 (expand-file-name filename (if (stringp (car path)) (car path) nil)))))
+	      (if (file-exists-p file) (setq result file)
+		(setq path (cdr path))))))
+      (let((file (substitute-in-file-name (expand-file-name filename))))
+	(if (file-exists-p file) (setq result file))))
+    result))
+
+(defun EGG:open-sj3 ()
+  (KKCP:server-open (or (get-sj3-host-name) (system-name))
+  		    (user-login-name))
+  (setq egg:*usr-dict* nil
+	egg:*dict-list* nil
+	egg:*dict-menu* nil)
+  (notify "$B%[%9%H(B %s $B$N(B SJ3 $B$r5/F0$7$^$7$?!#(B" (or (get-sj3-host-name) "local"))
+  (let ((eggrc (or (egg:search-file egg-startup-file egg-startup-file-search-path)
+		   (egg:search-file egg-default-startup-file load-path))))
+    (if eggrc (load-file eggrc)
+      (progn
+	(KKCP:server-close)
+	(error "eggrc-search-path $B>e$K(B egg-startup-file $B$,$"$j$^$;$s!#(B")))))
+
+(defun disconnect-sj3 ()
+  (interactive)
+  (KKCP:server-close))
+
+(defun close-sj3 ()
+  (interactive)
+  (KKCP:server-close))
+
+;;;
+;;; Kanji henkan
+;;;
+
+(defvar egg:*kanji-kanabuff* nil)
+
+(defvar *bunsetu-number* nil)
+
+(defun bunsetu-su ()
+  (sj3-bunsetu-suu))
+
+(defun bunsetu-length (number)
+  (sj3-bunsetu-yomi-moji-suu number))
+
+(defun kanji-moji-suu (str)
+  (let ((max (length str)) (count 0) (i 0))
+    (while (< i max)
+      (setq count (1+ count))
+      (if (< (aref str i) 128) (setq i (1+ i)) (setq i (+ i 3))))
+    count))
+
+(defun bunsetu-position (number)
+  (let ((pos egg:*region-start*) (i 0))
+    (while (< i number)
+      (setq pos (+ pos (bunsetu-kanji-length  i) (length egg:*bunsetu-kugiri*)))
+      (setq i (1+ i)))
+    pos))
+
+(defun bunsetu-kanji-length (bunsetu-no)
+  (sj3-bunsetu-kanji-length bunsetu-no))
+
+(defun bunsetu-kanji (number)
+  (sj3-bunsetu-kanji number))
+
+(defun bunsetu-kanji-insert (bunsetu-no)
+  (sj3-bunsetu-kanji bunsetu-no (current-buffer)))
+
+(defun bunsetu-set-kanji (bunsetu-no kouho-no) 
+  (sj3-server-henkan-kakutei bunsetu-no kouho-no))
+
+(defun bunsetu-yomi  (number) 
+  (sj3-bunsetu-yomi number))
+
+(defun bunsetu-yomi-insert (bunsetu-no)
+  (sj3-bunsetu-yomi bunsetu-no (current-buffer)))
+
+(defun bunsetu-yomi-equal (number yomi)
+  (sj3-bunsetu-yomi-equal number yomi))
+
+(defun bunsetu-kouho-suu (bunsetu-no)
+  (let ((no (sj3-bunsetu-kouho-suu bunsetu-no)))
+    (if (< 1 no) no
+      (KKCP:henkan-next bunsetu-no)
+      (sj3-bunsetu-kouho-suu bunsetu-no))))
+
+(defun bunsetu-kouho-list (number) 
+  (let ((no (bunsetu-kouho-suu number)))
+    (if (= no 1)
+	(KKCP:henkan-next number))
+    (sj3-bunsetu-kouho-list number)))
+
+(defun bunsetu-kouho-number (bunsetu-no)
+  (sj3-bunsetu-kouho-number bunsetu-no))
+
+;;;;
+;;;; User entry : henkan-region, henkan-paragraph, henkan-sentence
+;;;;
+
+(defconst egg:*bunsetu-face* nil "*$BJ8@aI=<($KMQ$$$k(B face $B$^$?$O(B nil")
+(make-variable-buffer-local
+ (defvar egg:*bunsetu-overlay* nil "$BJ8@a$NI=<($K;H$&(B overlay"))
+
+(defconst egg:*bunsetu-kugiri* " " "*$BJ8@a$N6h@Z$j$r<($9J8;zNs(B")
+
+
+(defconst egg:*henkan-face* nil "*$BJQ49NN0h$rI=<($9$k(B face $B$^$?$O(B nil")
+(make-variable-buffer-local
+ (defvar egg:*henkan-overlay* nil "$BJQ49NN0h$NI=<($K;H$&(B overlay"))
+
+(defconst egg:*henkan-open*  "|" "*$BJQ49$N;OE@$r<($9J8;zNs(B")
+(defconst egg:*henkan-close* "|" "*$BJQ49$N=*E@$r<($9J8;zNs(B")
+
+(defun egg:henkan-face-on ()
+  (if (overlayp egg:*henkan-overlay*) nil
+    (setq egg:*henkan-overlay* (make-overlay 1 1 nil))
+    (overlay-put egg:*henkan-overlay* 'face egg:*henkan-face*) )
+  (move-overlay egg:*henkan-overlay* egg:*region-start* egg:*region-end* (current-buffer)) )
+
+(defun egg:henkan-face-off ()
+  (and (overlayp egg:*henkan-overlay*)
+       (delete-overlay egg:*henkan-overlay*) ))
+
+(defun henkan-region (start end)
+  (interactive "r")
+  (if (interactive-p) (set-mark (point))) ;;; to be fixed
+  (henkan-region-internal start end))
+
+(defvar henkan-mode-indicator "$B4A(B")
+
+(defun henkan-region-internal (start end)
+  "region$B$r$+$J4A;zJQ49$9$k!#(B"
+  (setq egg:*kanji-kanabuff* (buffer-substring start end))
+  (if overwrite-mode
+      (setq egg:*overwrite-mode-deleted-chars* 
+	    (if egg:*henkan-fence-mode* 0
+	      (length egg:*kanji-kanabuff*))))
+  (setq *bunsetu-number* nil)
+  (let ((result (KKCP:henkan-begin egg:*kanji-kanabuff*)))
+    (if  result
+	(progn
+	  (mode-line-egg-mode-update henkan-mode-indicator)
+	  (goto-char start)
+	  (or (markerp egg:*region-start*)
+	      (setq egg:*region-start* (make-marker)))
+	  (or (markerp egg:*region-end*)
+	      (setq egg:*region-end* (set-marker-type (make-marker) t)))
+	  (if (null (marker-position egg:*region-start*))
+	      (progn
+		;;;(setq egg:*global-map-backup* (current-global-map))
+		(setq egg:*local-map-backup* (current-local-map))
+		;; XEmacs change:
+		(buffer-disable-undo (current-buffer))
+		(goto-char start)
+		(delete-region start end)
+		(insert egg:*henkan-open*)
+		(set-marker egg:*region-start* (point))
+		(insert egg:*henkan-close*)
+		(set-marker egg:*region-end* egg:*region-start*)
+		(egg:henkan-face-on)
+		(goto-char egg:*region-start*)
+		)
+	    (progn
+	      (egg:fence-face-off)
+	      (delete-region (- egg:*region-start* (length egg:*fence-open*)) 
+			     egg:*region-start*)
+	      (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*fence-close*)))
+	      (goto-char egg:*region-start*)
+	      (insert egg:*henkan-open*)
+	      (set-marker egg:*region-start* (point))
+	      (goto-char egg:*region-end*)
+	      (let ((point (point)))
+		(insert egg:*henkan-close*)
+		(set-marker egg:*region-end* point))
+	      (goto-char start)
+	      (delete-region start end)
+	      (egg:henkan-face-on))
+	    )
+	  (henkan-insert-kouho 0)
+	  (henkan-goto-bunsetu 0)
+	  ;;;(use-global-map henkan-mode-map)
+	  ;;;(use-local-map nil)
+	  (use-local-map henkan-mode-map)
+	  )))
+  )
+
+(defun henkan-paragraph ()
+  "Kana-kanji henkan  paragraph at or after point."
+  (interactive )
+  (save-excursion
+    (forward-paragraph)
+    (let ((end (point)))
+      (backward-paragraph)
+      (henkan-region-internal (point) end ))))
+
+(defun henkan-sentence ()
+  "Kana-kanji henkan sentence at or after point."
+  (interactive )
+  (save-excursion
+    (forward-sentence)
+    (let ((end (point)))
+      (backward-sentence)
+      (henkan-region-internal (point) end ))))
+
+(defun henkan-word ()
+  "Kana-kanji henkan word at or after point."
+  (interactive)
+  (save-excursion
+    (re-search-backward "\\b\\w" nil t)
+    (let ((start (point)))
+      (re-search-forward "\\w\\b" nil t)
+      (henkan-region-internal start (point)))))
+
+;;;
+;;; Kana Kanji Henkan Henshuu mode
+;;;
+
+(defun set-egg-henkan-mode-format (open close kugiri &optional henkan-face bunsetu-face)
+   "$BJQ49(B mode $B$NI=<(J}K!$r@_Dj$9$k!#(BOPEN $B$OJQ49$N;OE@$r<($9J8;zNs$^$?$O(B nil$B!#(B
+CLOSE$B$OJQ49$N=*E@$r<($9J8;zNs$^$?$O(B nil$B!#(B
+KUGIRI$B$OJ8@a$N6h@Z$j$rI=<($9$kJ8;zNs$^$?$O(B nil$B!#(B
+HENKAN-FACE $B$,;XDj$5$l$F(B nil $B$G$J$1$l$P!"JQ496h4V$rI=<($9$k(B face $B$H$7$F;H$o$l$k!#(B
+BUNSETU-FACE $B$,;XDj$5$l$F(B nil $B$G$J$1$l$P!"CmL\$7$F$$$kJ8@a$rI=<($9$k(B face $B$H$7$F;H$o$l$k(B"
+
+  (interactive (list (read-string "$BJQ493+;OJ8;zNs(B: ")
+		     (read-string "$BJQ49=*N;J8;zNs(B: ")
+		     (read-string "$BJ8@a6h@Z$jJ8;zNs(B: ")
+		     (cdr (assoc (completing-read "$BJQ496h4VI=<(B0@-(B: " egg:*face-alist*)
+				 egg:*face-alist*))
+		     (cdr (assoc (completing-read "$BJ8@a6h4VI=<(B0@-(B: " egg:*face-alist*)
+				 egg:*face-alist*))
+		     ))
+
+  (if (and (or (stringp open)  (null open))
+	   (or (stringp close) (null close))
+	   (or (stringp kugiri) (null kugiri))
+	   (or (null henkan-face) (memq henkan-face (face-list)))
+	   (or (null bunsetu-face) (memq henkan-face (face-list))))
+      (progn
+	(setq egg:*henkan-open* (or open "")
+	      egg:*henkan-close* (or close "")
+	      egg:*bunsetu-kugiri* (or kugiri "")
+	      egg:*henkan-face* henkan-face
+	      egg:*bunsetu-face* bunsetu-face)
+	(if (overlayp egg:*henkan-overlay*)
+	    (overlay-put egg:*henkan-overlay* 'face egg:*henkan-face*))
+	(if (overlayp egg:*bunsetu-overlay*)
+	    (overlay-put egg:*bunsetu-overlay* 'face egg:*bunsetu-face*))
+
+	t)
+    (error "Wrong type of arguments: %1 %2 %3 %4 %5" open close kugiri henkan-face bunsetu-face)))
+
+(defun henkan-insert-kouho (bunsetu-no)
+  (let ((max (bunsetu-su)) (i bunsetu-no))
+    (while (< i max)
+      (bunsetu-kanji-insert i) 
+      (insert  egg:*bunsetu-kugiri* )
+      (setq i (1+ i)))
+    (if (< bunsetu-no max) (delete-char (- (length egg:*bunsetu-kugiri*))))))
+
+(defun henkan-kakutei ()
+  (interactive)
+  (egg:bunsetu-face-off *bunsetu-number*)
+  (egg:henkan-face-off)
+  (delete-region (- egg:*region-start* (length egg:*henkan-open*))
+		 egg:*region-start*)
+  (delete-region egg:*region-start* egg:*region-end*)
+  (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*henkan-close*)))
+  (goto-char egg:*region-start*)
+  (let ((i 0) (max (bunsetu-su)))
+    (while (< i max)
+      ;;;(KKCP:henkan-kakutei i (bunsetu-kouho-number i))
+      (bunsetu-kanji-insert i)
+      (if (not overwrite-mode)
+	  (undo-boundary))
+      (setq i (1+ i))
+      ))
+  (KKCP:henkan-end)
+  (egg:quit-egg-mode)
+  )
+
+(defun henkan-kakutei-before-point ()
+  (interactive)
+  (egg:bunsetu-face-off *bunsetu-number*)
+  (egg:henkan-face-off)
+  (delete-region egg:*region-start* egg:*region-end*)
+  (goto-char egg:*region-start*)
+  (let ((i 0) (max *bunsetu-number*))
+    (while (< i max)
+      ;;;(KKCP:henkan-kakutei i (bunsetu-kouho-number i))
+      (bunsetu-kanji-insert i)
+      (if (not overwrite-mode)
+	  (undo-boundary))
+      (setq i (1+ i))
+      ))
+  (KKCP:henkan-end *bunsetu-number*)
+  (delete-region (- egg:*region-start* (length egg:*henkan-open*))
+		 egg:*region-start*)
+  (insert egg:*fence-open*)
+  (set-marker egg:*region-start* (point))
+  (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*henkan-close*)))
+  (goto-char egg:*region-end*)
+  (let ((point (point)))
+    (insert egg:*fence-close*)
+    (set-marker egg:*region-end* point))
+  (goto-char egg:*region-start*)
+  (egg:fence-face-on)
+  (let ((point (point))
+	(i *bunsetu-number*) (max (bunsetu-su)))
+    (while (< i max)
+      (bunsetu-yomi-insert i)
+      (setq i (1+ i)))
+    ;;;(insert "|")
+    ;;;(insert egg:*fence-close*)
+    ;;;(set-marker egg:*region-end* (point))
+    (goto-char point))
+  (setq egg:*mode-on* t)
+  ;;;(use-global-map fence-mode-map)
+  ;;;(use-local-map  nil)
+  (use-local-map fence-mode-map)
+  (egg:mode-line-display))
+
+(defun egg:set-bunsetu-face (no face switch)
+  (if (not switch)
+      (egg:bunsetu-face-off no) ;; JIC
+    (if (overlayp egg:*bunsetu-overlay*) nil
+      (setq egg:*bunsetu-overlay* (make-overlay 1 1 nil))
+      (overlay-put egg:*bunsetu-overlay* 'face egg:*bunsetu-face*))
+    (move-overlay egg:*bunsetu-overlay*
+		  (if (eq face 'modeline)
+		      (let ((point (bunsetu-position no)))
+			(+ point (1+ (char-boundary-p point))))
+		    (bunsetu-position no))
+
+		  (if (= no (1- (bunsetu-su)))
+		      egg:*region-end*
+		    (- (bunsetu-position (1+ no))
+		       (length egg:*bunsetu-kugiri*)))
+		  (current-buffer))))
+
+(defun egg:bunsetu-face-on (no)
+  (egg:set-bunsetu-face no egg:*bunsetu-face* t))
+
+(defun egg:bunsetu-face-off (no)
+  ;; ``no'' will be ignored
+  (and (overlayp egg:*bunsetu-overlay*)
+       (delete-overlay egg:*bunsetu-overlay*)) )
+
+(defun henkan-goto-bunsetu (number)
+  (setq *bunsetu-number*
+	(check-number-range number 0 (1- (bunsetu-su))))
+  (goto-char (bunsetu-position *bunsetu-number*))
+  (egg:bunsetu-face-on *bunsetu-number*)
+  )
+
+(defun henkan-forward-bunsetu ()
+  (interactive)
+  (henkan-goto-bunsetu (1+ *bunsetu-number*))
+  )
+
+(defun henkan-backward-bunsetu ()
+  (interactive)
+  (henkan-goto-bunsetu (1- *bunsetu-number*))
+  )
+
+(defun henkan-first-bunsetu ()
+  (interactive)
+  (henkan-goto-bunsetu 0))
+
+(defun henkan-last-bunsetu ()
+  (interactive)
+  (henkan-goto-bunsetu (1- (bunsetu-su)))
+  )
+ 
+(defun check-number-range (i min max)
+  (cond((< i min) max)
+       ((< max i) min)
+       (t i)))
+
+(defun henkan-hiragana ()
+  (interactive)
+  (henkan-goto-kouho (- (bunsetu-kouho-suu *bunsetu-number*) 1)))
+
+(defun henkan-katakana ()
+  (interactive)
+  (henkan-goto-kouho (- (bunsetu-kouho-suu *bunsetu-number*) 2)))
+
+(defun henkan-next-kouho ()
+  (interactive)
+  (henkan-goto-kouho (1+ (bunsetu-kouho-number *bunsetu-number*))))
+
+(defun henkan-previous-kouho ()
+  (interactive)
+  (henkan-goto-kouho (1- (bunsetu-kouho-number *bunsetu-number*))))
+
+(defun henkan-goto-kouho (kouho-number)
+  (let ((point (point))
+	(yomi  (bunsetu-yomi *bunsetu-number*))
+	(i *bunsetu-number*)
+	(max (bunsetu-su)))
+    (setq kouho-number 
+	  (check-number-range kouho-number 
+			      0
+			      (1- (bunsetu-kouho-suu *bunsetu-number*))))
+    (while (< i max)
+      (if (bunsetu-yomi-equal i yomi)
+	  (let ((p1 (bunsetu-position i)))
+	    (delete-region p1
+			   (+ p1 (bunsetu-kanji-length i)))
+	    (goto-char p1)
+	    (bunsetu-set-kanji i kouho-number)
+	    (bunsetu-kanji-insert i)))
+      (setq i (1+ i)))
+    (goto-char point))
+  (egg:bunsetu-face-on *bunsetu-number*))
+
+(defun henkan-bunsetu-chijime ()
+  (interactive)
+  (or (= (bunsetu-length *bunsetu-number*) 1)
+      (bunsetu-length-henko (1-  (bunsetu-length *bunsetu-number*)))))
+
+(defun henkan-bunsetu-nobasi ()
+  (interactive)
+  (if (not (= (1+ *bunsetu-number*) (bunsetu-su)))
+      (bunsetu-length-henko (1+ (bunsetu-length *bunsetu-number*)))))
+
+(defun henkan-saishou-bunsetu ()
+  (interactive)
+  (bunsetu-length-henko 1))
+
+(defun henkan-saichou-bunsetu ()
+  (interactive)
+  (let ((max (bunsetu-su)) (i *bunsetu-number*)
+	(l 0))
+    (while (< i max)
+      (setq l (+ l (bunsetu-length i)))
+      (setq i (1+ i)))
+    (bunsetu-length-henko l)))
+
+(defun bunsetu-length-henko (length)
+  (let ((r (KKCP:bunsetu-henkou *bunsetu-number* length)))
+    (cond(r
+	  (delete-region 
+	   (bunsetu-position *bunsetu-number*) egg:*region-end*)
+	  (goto-char (bunsetu-position *bunsetu-number*))
+	  (henkan-insert-kouho *bunsetu-number*)
+	  (henkan-goto-bunsetu *bunsetu-number*))
+	 (t
+	  (egg:bunsetu-face-on *bunsetu-number*)))))
+
+(defun henkan-quit ()
+  (interactive)
+  (egg:bunsetu-face-off *bunsetu-number*)
+  (egg:henkan-face-off)
+  (delete-region (- egg:*region-start* (length egg:*henkan-open*))
+		 egg:*region-start*)
+  (delete-region egg:*region-start* egg:*region-end*)
+  (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*henkan-close*)))
+  (goto-char egg:*region-start*)
+  (insert egg:*fence-open*)
+  (set-marker egg:*region-start* (point))
+  (insert egg:*kanji-kanabuff*)
+  (let ((point (point)))
+    (insert egg:*fence-close*)
+    (set-marker egg:*region-end* point)
+    )
+  (goto-char egg:*region-end*)
+  (egg:fence-face-on)
+  (KKCP:henkan-quit)
+  (setq egg:*mode-on* t)
+  ;;;(use-global-map fence-mode-map)
+  ;;;(use-local-map  nil)
+  (use-local-map fence-mode-map)
+  (egg:mode-line-display)
+  )
+
+(defun henkan-select-kouho ()
+  (interactive)
+  (if (not (eq (selected-window) (minibuffer-window)))
+      (let ((kouho-list (bunsetu-kouho-list *bunsetu-number*))
+	    menu)
+	(setq menu
+	      (list 'menu "$B<!8uJd(B:"
+		    (let ((l kouho-list) (r nil) (i 0))
+		      (while l
+			(setq r (cons (cons (car l) i) r))
+			(setq i (1+ i))
+			(setq l (cdr l)))
+		      (reverse r))))
+	(henkan-goto-kouho 
+	 (menu:select-from-menu menu 
+			       (bunsetu-kouho-number *bunsetu-number*))))
+    (beep)))
+
+(defun henkan-kakutei-and-self-insert ()
+  (interactive)
+  (setq unread-command-events (list last-command-char))
+  (henkan-kakutei))
+
+
+(defvar henkan-mode-map (make-keymap))
+
+(defvar henkan-mode-esc-map (make-keymap))
+
+(let ((ch 0))
+  (while (<= ch 127)
+    (define-key henkan-mode-map (make-string 1 ch) 'undefined)
+    (define-key henkan-mode-esc-map (make-string 1 ch) 'undefined)
+    (setq ch (1+ ch))))
+
+(let ((ch 32))
+  (while (< ch 127)
+    (define-key henkan-mode-map (make-string 1 ch) 'henkan-kakutei-and-self-insert)
+    (setq ch (1+ ch))))
+	
+(define-key henkan-mode-map "\e"    henkan-mode-esc-map)
+(define-key henkan-mode-map "\ei"  'undefined) ;; henkan-inspect-bunsetu
+					       ;; not support for sj3
+(define-key henkan-mode-map "\es"  'henkan-select-kouho)
+(define-key henkan-mode-map "\eh"  'henkan-hiragana)
+(define-key henkan-mode-map "\ek"  'henkan-katakana)
+(define-key henkan-mode-map "\e<"  'henkan-saishou-bunsetu)
+(define-key henkan-mode-map "\e>"  'henkan-saichou-bunsetu)
+(define-key henkan-mode-map " "    'henkan-next-kouho)
+(define-key henkan-mode-map "\C-@" 'henkan-next-kouho)
+(define-key henkan-mode-map "\C-a" 'henkan-first-bunsetu)
+(define-key henkan-mode-map "\C-b" 'henkan-backward-bunsetu)
+(define-key henkan-mode-map "\C-c" 'henkan-quit)
+(define-key henkan-mode-map "\C-d" 'undefined)
+(define-key henkan-mode-map "\C-e" 'henkan-last-bunsetu)
+(define-key henkan-mode-map "\C-f" 'henkan-forward-bunsetu)
+(define-key henkan-mode-map "\C-g" 'henkan-quit)
+(define-key henkan-mode-map "\C-h" 'help-command)
+(define-key henkan-mode-map "\C-i" 'henkan-bunsetu-chijime)
+(define-key henkan-mode-map "\C-j" 'undefined)
+(define-key henkan-mode-map "\C-k" 'henkan-kakutei-before-point)
+(define-key henkan-mode-map "\C-l" 'henkan-kakutei)
+(define-key henkan-mode-map "\C-m" 'henkan-kakutei)
+(define-key henkan-mode-map "\C-n" 'henkan-next-kouho)
+(define-key henkan-mode-map "\C-o" 'henkan-bunsetu-nobasi)
+(define-key henkan-mode-map "\C-p" 'henkan-previous-kouho)
+(define-key henkan-mode-map "\C-q" 'undefined)
+(define-key henkan-mode-map "\C-r" 'undefined)
+(define-key henkan-mode-map "\C-s" 'undefined)
+(define-key henkan-mode-map "\C-t" 'undefined)
+(define-key henkan-mode-map "\C-u" 'undefined)
+(define-key henkan-mode-map "\C-v" 'undefined)
+(define-key henkan-mode-map "\C-w" 'undefined)
+(define-key henkan-mode-map "\C-x" 'undefined)
+(define-key henkan-mode-map "\C-y" 'undefined)
+(define-key henkan-mode-map "\C-z" 'undefined)
+(define-key henkan-mode-map "\177" 'henkan-quit)
+
+(defun henkan-help-command ()
+  "Display documentation fo henkan-mode."
+  (interactive)
+  (with-output-to-temp-buffer "*Help*"
+    (princ (substitute-command-keys henkan-mode-document-string))
+    (print-help-return-message)))
+
+(defvar henkan-mode-document-string "$B4A;zJQ49%b!<%I(B:
+$BJ8@a0\F0(B
+  \\[henkan-first-bunsetu]\t$B@hF,J8@a(B\t\\[henkan-last-bunsetu]\t$B8eHxJ8@a(B  
+  \\[henkan-backward-bunsetu]\t$BD>A0J8@a(B\t\\[henkan-forward-bunsetu]\t$BD>8eJ8@a(B
+$BJQ49JQ99(B
+  $B<!8uJd(B    \\[henkan-previous-kouho]  \t$BA08uJd(B    \\[henkan-next-kouho]
+  $BJ8@a?-$7(B  \\[henkan-bunsetu-nobasi]  \t$BJ8@a=L$a(B  \\[henkan-bunsetu-chijime]
+  $BJQ498uJdA*Br(B  \\[henkan-select-kouho]
+$BJQ493NDj(B
+  $BA4J8@a3NDj(B  \\[henkan-kakutei]  \t$BD>A0J8@a$^$G3NDj(B  \\[henkan-kakutei-before-point]
+$BJQ49Cf;_(B    \\[henkan-quit]
+")
+  
+;;;----------------------------------------------------------------------
+;;;
+;;; Dictionary management Facility
+;;;
+;;;----------------------------------------------------------------------
+
+;;;
+;;; $B<-=qEPO?(B 
+;;;
+
+;;;;
+;;;; User entry: toroku-region
+;;;;
+
+(defun remove-regexp-in-string (regexp string)
+  (cond((not(string-match regexp string))
+	string)
+       (t(let ((str nil)
+	     (ostart 0)
+	     (oend   (match-beginning 0))
+	     (nstart (match-end 0)))
+	 (setq str (concat str (substring string ostart oend)))
+	 (while (string-match regexp string nstart)
+	   (setq ostart nstart)
+	   (setq oend   (match-beginning 0))
+	   (setq nstart (match-end 0))
+	   (setq str (concat str (substring string ostart oend))))
+	 str))))
+
+(defun toroku-region (start end)
+  (interactive "r")
+  (let*((kanji
+	 (remove-regexp-in-string "[\0-\37]" (buffer-substring start end)))
+	(yomi (read-hiragana-string
+	       (format "$B<-=qEPO?!X(B%s$B!Y(B  $BFI$_(B :" kanji)))
+	(type (menu:select-from-menu *sj3-bunpo-menu*))
+	(dict-no 
+	 (menu:select-from-menu (list 'menu "$BEPO?<-=qL>(B:" egg:*dict-menu*))))
+    ;;;(if (string-match "[\0-\177]" kanji)
+    ;;;	(error "Kanji string contains hankaku character. %s" kanji))
+    ;;;(if (string-match "[\0-\177]" yomi)
+    ;;;	(error "Yomi string contains hankaku character. %s" yomi))
+    (KKCP:dict-add dict-no kanji yomi type)
+    (let ((hinshi (nth 1 (assq type *sj3-bunpo-code*)))
+	  (gobi   (nth 2 (assq type *sj3-bunpo-code*)))
+	  (dict-name (cdr (assq dict-no egg:*usr-dict*))))
+      (notify "$B<-=q9`L\!X(B%s$B!Y(B(%s: %s)$B$r(B%s$B$KEPO?$7$^$7$?!#(B"
+	      (if gobi (concat kanji " " gobi) kanji)
+	      (if gobi (concat yomi  " " gobi) yomi)
+	      hinshi dict-name))))
+
+
+
+;;; (lsh 1 18)
+(defvar *sj3-bunpo-menu*
+  '(menu "$BIJ;l(B:"
+   (("$BL>;l(B"      .
+     (menu "$BIJ;l(B:$BL>;l(B:"
+	   (("$BL>;l(B"		. 1)
+	    ("$BL>;l(B($B$*!D(B)"	. 2)
+	    ("$BL>;l(B($B$4!D(B)"	. 3)
+	    ("$BL>;l(B($B!DE*(B/$B2=(B)"	. 4)
+	    ("$BL>;l(B($B$*!D$9$k(B)"	. 5)
+	    ("$BL>;l(B($B!D$9$k(B)"	. 6)
+	    ("$BL>;l(B($B$4!D$9$k(B)"	. 7)
+	    ("$BL>;l(B($B!D$J(B/$B$K(B)"	. 8)
+	    ("$BL>;l(B($B$*!D$J(B/$B$K(B)"	. 9)
+	    ("$BL>;l(B($B$4!D$J(B/$B$K(B)"	. 10)
+	    ("$BL>;l(B($BI{;l(B)"	. 11))))
+    ("$BBeL>;l(B"    . 12)
+    ("$BID;z(B"      . 21)
+    ("$BL>A0(B"      . 22)
+    ("$BCOL>(B"      . 24)
+    ("$B8)(B/$B6hL>(B"   . 25)
+    ("$BF0;l(B"      .
+	  (menu "$BIJ;l(B:$BF0;l(B:"
+		(("$B%5JQ8l44(B"      . 80)
+		 ("$B%6JQ8l44(B"      . 81)
+		 ("$B0lCJITJQ2=It(B"  . 90)
+		 ("$B%+9T8^CJ8l44(B"  . 91)
+		 ("$B%,9T8^CJ8l44(B"  . 92)   
+		 ("$B%59T8^CJ8l44(B"  . 93)   
+		 ("$B%?9T8^CJ8l44(B"  . 94)   
+		 ("$B%J9T8^CJ8l44(B"  . 95)   
+		 ("$B%P9T8^CJ8l44(B"  . 96)   
+		 ("$B%^9T8^CJ8l44(B"  . 97)   
+		 ("$B%i9T8^CJ8l44(B"  . 98)   
+		 ("$B%o9T8^CJ8l44(B"  . 99))))   
+    ("$BO"BN;l(B"         . 26)
+    ("$B@\B3;l(B"         . 27)
+    ("$B=u?t;l(B"         . 29)
+    ("$B?t;l(B"           . 30)
+    ("$B@\F,8l(B"         . 31)
+    ("$B@\Hx8l(B"         . 36)
+    ("$BI{;l(B"           . 45)
+    ("$BI{;l(B2"          . 46)
+    ("$B7AMF;l8l44(B"     . 60)
+    ("$B7AMFF0;l8l44(B"   . 71)
+    ("$BC14A;z(B"         . 189))))
+
+(defvar *sj3-bunpo-code*
+  '(
+    ( 1   "$BL>;l(B" )
+    ( 2   "$BL>;l(B($B$*!D(B)" )
+    ( 3   "$BL>;l(B($B$4!D(B)" )
+    ( 4   "$BL>;l(B($B!DE*(B/$B2=(B)" "$BE*(B" nil)
+    ( 5   "$BL>;l(B($B$*!D$9$k(B)" "$B$9$k(B" nil)
+    ( 6   "$BL>;l(B($B!D$9$k(B)" "$B$9$k(B" nil)
+    ( 7   "$BL>;l(B($B$4!D$9$k(B)" "$B$9$k(B" nil)
+    ( 8   "$BL>;l(B($B!D$J(B/$B$K(B)" "$B$J(B/$B$K(B" nil)
+    ( 9   "$BL>;l(B($B$*!D$J(B/$B$K(B)" "$B$J(B/$B$K(B" nil)
+    ( 10  "$BL>;l(B($B$4!D$J(B/$B$K(B)" "$B$J(B/$B$K(B" nil)
+    ( 11  "$BL>;l(B($BI{;l(B)" )
+    ( 12  "$BBeL>;l(B" )
+    ( 21  "$BID;z(B" )
+    ( 22  "$BL>A0(B" )
+    ( 24  "$BCOL>(B" )
+    ( 25  "$B8)(B/$B6hL>(B" )
+    ( 26  "$BO"BN;l(B" )
+    ( 27  "$B@\B3;l(B" )
+    ( 29  "$B=u?t;l(B" )
+    ( 30  "$B?t;l(B"   )
+    ( 31  "$B@\F,8l(B" )
+    ( 36  "$B@\Hx8l(B" )
+    ( 45  "$BI{;l(B" )
+    ( 46  "$BI{;l(B2" )
+    ( 60  "$B7AMF;l8l44(B"           "$B$$(B" ("" "" "" "" ""))
+    ( 71  "$B7AMFF0;l8l44(B"         "$B$K(B" ("" "" "" "" "") )
+    ( 80  "$B%5JQ8l44(B"             "$B$9$k(B" ("" "" "" "" ""))
+    ( 81  "$B%6JQ8l44(B"             "$B$:$k(B" ("" "" "" "" ""))
+    ( 90  "$B0lCJITJQ2=It(B"         "$B$k(B" ("" "" "" "" ""))
+    ( 91  "$B%+9T8^CJ8l44(B"         "$B$/(B" ("$B$+$J$$(B" "$B$-$^$9(B" "$B$/(B" "$B$/$H$-(B" "$B$1(B"))
+    ( 92  "$B%,9T8^CJ8l44(B"         "$B$0(B" ("$B$,$J$$(B" "$B$.$^$9(B" "" "" ""))
+    ( 93  "$B%59T8^CJ8l44(B"         "$B$9(B" ("" "" "" "" ""))
+    ( 94  "$B%?9T8^CJ8l44(B"         "$B$D(B" ("" "" "" "" ""))
+    ( 95  "$B%J9T8^CJ8l44(B"         "$B$L(B" ("" "" "" "" ""))   
+    ( 96  "$B%P9T8^CJ8l44(B"         "$B$V(B" ("" "" "" "" ""))   
+    ( 97  "$B%^9T8^CJ8l44(B"         "$B$`(B" ("" "" "" "" ""))   
+    ( 98  "$B%i9T8^CJ8l44(B"         "$B$k(B" ("" "" "" "" ""))   
+    ( 99  "$B%o9T8^CJ8l44(B"         "$B$&(B" ("" "" "" "" ""))   
+    ( 189  "$BC14A;z(B"  )
+    ( 190  "$BITDj(B"  )
+    ( 1000  "$B$=$NB>(B"  )
+    ))
+
+;;;
+;;; $B<-=qJT=87O(B DicEd
+;;;
+
+(defvar *diced-window-configuration* nil)
+
+(defvar *diced-dict-info* nil)
+
+(defvar *diced-dno* nil)
+
+;;;;;
+;;;;; User entry : edit-dict
+;;;;;
+
+(defun edit-dict ()
+  (interactive)
+  (let*((dict-no 
+	 (menu:select-from-menu (list 'menu "$B<-=qL>(B:" egg:*dict-menu*)))
+	(dict-name (file-name-nondirectory 
+		    (cdr (assq dict-no egg:*usr-dict*))))
+	(dict-info (KKCP:dict-info dict-no)))
+    (if (null dict-info)
+	(message "$B<-=q(B: %s $B$KEPO?$5$l$F$$$k9`L\$O$"$j$^$;$s!#(B" dict-name)
+      (progn
+	(setq *diced-dno* dict-no)
+	(setq *diced-window-configuration* (current-window-configuration))
+	(pop-to-buffer "*Nihongo Dictionary Information*")
+	(setq major-mode 'diced-mode)
+	(setq mode-name "Diced")
+	(setq mode-line-buffer-identification 
+	      (concat "DictEd: " dict-name
+		      (make-string  
+		       (max 0 (- 17 (string-width dict-name))) ?  )
+		      ))
+	(sit-for 0) ;; will redislay.
+	;;;(use-global-map diced-mode-map)
+	(use-local-map diced-mode-map)
+	(diced-display dict-info)
+	))))
+
+(defun diced-redisplay ()
+  (let ((dict-info (KKCP:dict-info *diced-dno*)))
+    (if (null dict-info)
+	(progn
+	  (message "$B<-=q(B: %s $B$KEPO?$5$l$F$$$k9`L\$O$"$j$^$;$s!#(B"
+		   (file-name-nondirectory 
+		    (cdr (assq *diced-dno* egg:*usr-dict*))))
+	  (diced-quit))
+      (diced-display dict-info))))
+
+(defun diced-display (dict-info)
+	;;; (values (list (record yomi kanji bunpo)))
+	;;;                         0    1     2
+  (setq *diced-dict-info* dict-info)
+  (setq buffer-read-only nil)
+  (erase-buffer)
+  (let ((l-yomi
+	 (apply 'max
+		(mapcar (function (lambda (l) (string-width (nth 0 l))))
+			dict-info)))
+	(l-kanji 
+	 (apply 'max
+		(mapcar (function (lambda (l) (string-width (nth 1 l))))
+			dict-info))))
+    (while dict-info
+      (let*((yomi (nth 0 (car dict-info)))
+	    (kanji (nth 1 (car dict-info)))
+	    (bunpo (nth 2 (car dict-info)))
+	    (gobi   (nth 2 (assq bunpo *sj3-bunpo-code*)))
+	    (hinshi (nth 1 (assq bunpo *sj3-bunpo-code*))))
+
+	(insert "  " yomi)
+	(if gobi (insert " " gobi))
+	(insert-char ?  
+		     (- (+ l-yomi 10) (string-width yomi)
+			(if gobi (+ 1 (string-width gobi)) 0)))
+	(insert kanji)
+	(if gobi (insert " " gobi))
+	(insert-char ?  
+		     (- (+ l-kanji 10) (string-width kanji)
+			(if gobi (+ 1 (string-width gobi)) 0)))
+	(insert hinshi ?\n)
+	(setq dict-info (cdr dict-info))))
+    (goto-char (point-min)))
+  (setq buffer-read-only t))
+
+(defun diced-add ()
+  (interactive)
+  (diced-execute t)
+  (let*((kanji  (read-from-minibuffer "$B4A;z!'(B"))
+	(yomi  (read-from-minibuffer "$BFI$_!'(B"))
+	(bunpo (menu:select-from-menu *sj3-bunpo-menu*))
+	(gobi   (nth 2 (assq bunpo *sj3-bunpo-code*)))
+	(hinshi (nth 1 (assq bunpo *sj3-bunpo-code*)))
+	(item (if gobi (concat kanji " " gobi) kanji))
+	(item-yomi (if gobi (concat yomi " " gobi) yomi))
+	(dict-name (cdr (assq *diced-dno* egg:*usr-dict*))))
+    (if (notify-yes-or-no-p "$B<-=q9`L\!X(B%s$B!Y(B(%s: %s)$B$r(B%s$B$KEPO?$7$^$9!#(B" 
+	      item item-yomi hinshi (file-name-nondirectory dict-name))
+	(progn
+	  (KKCP:dict-add *diced-dno* kanji yomi bunpo)
+	  (notify "$B<-=q9`L\!X(B%s$B!Y(B(%s: %s)$B$r(B%s$B$KEPO?$7$^$7$?!#(B" 
+		  item item-yomi hinshi dict-name)
+	  (diced-redisplay)))))
+	      
+(defun diced-delete ()
+  (interactive)
+  (beginning-of-line)
+  (if (= (following-char) ?  )
+      (let ((buffer-read-only nil))
+	(delete-char 1) (insert "D") (backward-char 1))))
+    
+(defun diced-undelete ()
+  (interactive)
+  (beginning-of-line)
+  (if (= (following-char) ?D)
+      (let ((buffer-read-only nil))
+	(delete-char 1) (insert " ") (backward-char 1))
+    (beep)))
+
+(defun diced-quit ()
+  (interactive)
+  (setq buffer-read-only nil)
+  (erase-buffer)
+  (setq buffer-read-only t)
+  (bury-buffer (get-buffer "*Nihongo Dictionary Information*"))
+  (set-window-configuration *diced-window-configuration*)
+  )
+
+(defun diced-execute (&optional display)
+  (interactive)
+  (goto-char (point-min))
+  (let ((no  0))
+    (while (not (eobp))
+      (if (= (following-char) ?D)
+	  (let* ((dict-item (nth no *diced-dict-info*))
+		 (yomi (nth 0 dict-item))
+		 (kanji (nth 1 dict-item))
+		 (bunpo (nth 2 dict-item))
+		 (gobi   (nth 2 (assq bunpo *sj3-bunpo-code*)))
+		 (hinshi (nth 1 (assq bunpo *sj3-bunpo-code*)))
+		 (dict-name (cdr (assq *diced-dno* egg:*usr-dict*)))
+		 (item (if gobi (concat kanji " " gobi) kanji))
+		 (item-yomi (if gobi (concat yomi " " gobi) yomi)))
+	    (if (notify-yes-or-no-p "$B<-=q9`L\!X(B%s$B!Y(B(%s: %s)$B$r(B%s$B$+$i:o=|$7$^$9!#(B"
+				item item-yomi hinshi (file-name-nondirectory 
+						       dict-name))
+		(progn
+		  (KKCP:dict-delete *diced-dno* kanji yomi bunpo)
+		  (notify "$B<-=q9`L\!X(B%s$B!Y(B(%s: %s)$B$r(B%s$B$+$i:o=|$7$^$7$?!#(B"
+			  item item-yomi hinshi dict-name)
+		  ))))
+      (setq no (1+ no))
+      (forward-line 1)))
+  (forward-line -1)
+  (if (not display) (diced-redisplay)))
+
+(defun diced-next-line ()
+  (interactive)
+  (beginning-of-line)
+  (forward-line 1)
+  (if (eobp) (progn (beep) (forward-line -1))))
+
+(defun diced-end-of-buffer ()
+  (interactive)
+  (end-of-buffer)
+  (forward-line -1))
+
+(defun diced-scroll-down ()
+  (interactive)
+  (scroll-down)
+  (if (eobp) (forward-line -1)))
+
+(defun diced-mode ()
+  "Mode for \"editing\" dictionaries.
+In diced, you are \"editing\" a list of the entries in dictionaries.
+You can move using the usual cursor motion commands.
+Letters no longer insert themselves. Instead, 
+
+Type  a to Add new entry.
+Type  d to flag an entry for Deletion.
+Type  n to move cursor to Next entry.
+Type  p to move cursor to Previous entry.
+Type  q to Quit from DicEd.
+Type  u to Unflag an entry (remove its D flag).
+Type  x to eXecute the deletions requested.
+"
+ )
+
+(defvar diced-mode-map (let ((map (make-keymap))) (suppress-keymap map) map))
+
+(define-key diced-mode-map "a"    'diced-add)
+(define-key diced-mode-map "d"    'diced-delete)
+(define-key diced-mode-map "n"    'diced-next-line)
+(define-key diced-mode-map "p"    'previous-line)
+(define-key diced-mode-map "q"    'diced-quit)
+(define-key diced-mode-map "u"    'diced-undelete)
+(define-key diced-mode-map "x"    'diced-execute)
+
+(define-key diced-mode-map "\C-h" 'help-command)
+(define-key diced-mode-map "\C-n" 'diced-next-line)
+(define-key diced-mode-map "\C-p" 'previous-line)
+(define-key diced-mode-map "\C-v" 'scroll-up)
+(define-key diced-mode-map "\e<"  'beginning-of-buffer)
+(define-key diced-mode-map "\e>"  'diced-end-of-buffer)
+(define-key diced-mode-map "\ev"  'diced-scroll-down)
+
+;;; End of sj3-egg.el
+;; 92.7.7 by Y.Kawabe -- commented out
+;; (if (boundp 'SJ3) 
+;;    (load-library "sj3fns"))