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

Import from CVS: tag r20-0b30
author cvs
date Mon, 13 Aug 2007 09:02:59 +0200
parents
children 0d2f883870bc
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/egg/egg.el	Mon Aug 13 09:02:59 2007 +0200
@@ -0,0 +1,2844 @@
+;; Japanese Character Input Package for Egg
+;; Coded by S.Tomura, Electrotechnical Lab. (tomura@etl.go.jp)
+
+;; This file is part of Egg on Mule (Multilingal Environment)
+
+;; Egg is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; 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 General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to
+;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;;==================================================================
+;;;
+;;; $BF|K\8l4D6-(B $B!V$?$^$4!W(B $BBh#3HG(B    
+;;;
+;;;=================================================================== 
+
+;;;
+;;;$B!V$?$^$4!W$O%M%C%H%o!<%/$+$J4A;zJQ49%5!<%P$rMxMQ$7!"(BMule $B$G$NF|K\(B
+;;; $B8l4D6-$rDs6!$9$k%7%9%F%`$G$9!#!V$?$^$4!WBh#2HG$G$O(B Wnn V3 $B$*$h$S(B 
+;;; Wnn V4 $B$N$+$J4A;zJQ49%5!<%P$r;HMQ$7$F$$$^$9!#(B
+;;;
+
+;;; $BL>A0$O(B $B!VBt;3(B/$BBT$?$;$F(B/$B$4$a$s$J$5$$!W$N3FJ8@a$N@hF,#12;$G$"$k!V$?!W(B
+;;; $B$H!V$^!W$H!V$4!W$r<h$C$F!"!V$?$^$4!W$H8@$$$^$9!#EE;R5;=QAm9g8&5f=j(B
+;;; $B$N6S8+(B $BH~5.;R;a$NL?L>$K0M$k$b$N$G$9!#(Begg $B$O!V$?$^$4!W$N1QLu$G$9!#(B
+
+;;;
+;;; $B;HMQK!$O(B info/egg-jp $B$r8+$F2<$5$$!#(B
+;;;
+
+;;;
+;;; $B!V$?$^$4!W$K4X$9$kDs0F!"Cn>pJs$O(B tomura@etl.go.jp $B$K$*Aw$j2<$5$$!#(B
+;;;
+
+;;;
+;;;                      $B")(B 305 $B0q>k8)$D$/$P;TG_1`(B1-1-4
+;;;                      $BDL;:>J9)6H5;=Q1!EE;R5;=QAm9g8&5f=j(B
+;;;                      $B>pJs%"!<%-%F%/%A%cIt8@8l%7%9%F%`8&5f<<(B
+;;;
+;;;                                                     $B8MB<(B $BE/(B  
+
+;;;
+;;; ($BCm0U(B)$B$3$N%U%!%$%k$O4A;z%3!<%I$r4^$s$G$$$^$9!#(B 
+;;;
+;;;   $BBh#3HG(B  $B#1#9#9#1G/#27n(B  $B#4F|(B
+;;;   $BBh#2HG(B  $B#1#9#8#9G/#67n(B  $B#1F|(B
+;;;   $BBh#1HG(B  $B#1#9#8#8G/#77n#1#4F|(B
+;;;   $B;CDjHG(B  $B#1#9#8#8G/#67n#2#4F|(B
+
+;;;=================================================================== 
+;;;
+;;; (eval-when (load) (require 'wnn-client))
+;;;
+
+(defvar egg-version "3.09" "Version number of this version of Egg. ")
+;;; Last modified date: Fri Sep 25 12:59:00 1992
+
+;;;;  $B=$@5MW5a%j%9%H(B
+
+;;;;  read-hiragana-string, read-kanji-string $B$G;HMQ$9$kJ?2>L>F~NO%^%C%W$r(B roma-kana $B$K8GDj$7$J$$$GM_$7$$!%(B
+
+;;;;  $B=$@5%a%b(B
+
+;;; 95.6.5 modified by S.Tomura <tomura@etl.go.jp>
+;;; $BJQ49D>8e$KO"B3$7$FJQ49$9$k>l9g$rG'<1$9$k$?$a$K!"(B"-in-cont" $B$K4XO"$7$?(B
+;;; $BItJ,$rDI2C$7$?!#!J$3$NItJ,$O>-Mh:F=$@5$9$kM=Dj!#!K(B
+
+;;; 93.6.19  modified by T.Shingu <shingu@cpr.canon.co.jp>
+;;; egg:*in-fence-mode* should be buffer local.
+
+;;; 93.6.4   modified by T.Shingu <shingu@cpr.canon.co.jp>
+;;; In its-defrule**, length is called instead of chars-in-string.
+
+;;; 93.3.15  modified by T.Enami <enami@sys.ptg.sony.co.jp>
+;;; egg-self-insert-command simulates the original more perfectly.
+
+;;; 92.12.20 modified by S.Tomura <tomura@etl.go.jp>
+;;; In its:simulate-input, sref is called instead of aref.
+
+;;; 92.12.20 modified by T.Enami <enami@sys.ptg.sony.co.jp>
+;;; egg-self-insert-command calls cancel-undo-boundary to simulate original.
+
+;;; 92.11.4 modified by M.Higashida <manabu@sigmath.osaka-u.ac.jp>
+;;; read-hiragana-string sets minibuffer-preprompt correctly.
+
+;;; 92.10.26, 92.10.30 modified by T.Saneto sanewo@pdp.crl.sony.co.jp
+;;; typo fixed.
+
+;;; 92.10.18 modified by K. Handa <handa@etl.go.jp>
+;;; special-symbol-input $BMQ$N%F!<%V%k$r(B autoload $B$K!#(B
+;;; busyu.el $B$N(B autoload $B$N;XDj$r(B mule-init.el $B$+$i(B egg.el $B$K0\$9!#(B
+
+;;;  92.9.20 modified by S. Tomura
+;;;; hiragana-region $B$NCn$N=$@5(B
+
+;;;; 92.9.19 modified by Y. Kawabe
+;;;; some typos
+
+;;;; 92.9.19 modified by Y. Kawabe<kawabe@sramhc.sra.co.jp>
+;;;; menu $B$NI=<(4X78$N(B lenght $B$r(B string-width $B$KCV$-49$($k!%(B
+
+;;; 92.8.19 modified for Mule Ver.0.9.6 by K.Handa <handa@etl.go.jp>
+;;;; menu:select-from-menu calls string-width instead of length.
+
+;;;; 92.8.1 modified by S. Tomura
+;;;; internal mode $B$rDI2C!%(Bits:*internal-mode-alist* $BDI2C!%(B
+
+;;;; 92.7.31 modified by S. Tomura
+;;;; its-mode-map $B$,(B super mode map $B$r;}$D$h$&$KJQ99$7$?!%$3$l$K$h$j(B 
+;;;; mode map $B$,6&M-$G$-$k!%(B its-define-mode, get-next-map $B$J$I$rJQ99!%(B 
+;;;; get-next-map-locally $B$rDI2C!%(Bits-defrule** $B$rJQ99!%(B
+
+;;;; 92.7.31 modified by S. Tomura
+;;;; its:make-kanji-buffer , its:*kanji* $B4XO"%3!<%I$r:o=|$7$?!%(B
+
+;;;; 92.7.31 modified by S. Tomura
+;;;;  egg:select-window-hook $B$r=$@5$7!$(Bminibuffer $B$+$i(B exit $B$9$k$H$-$K!$(B 
+;;;; $B3F<oJQ?t$r(B default-value $B$KLa$9$h$&$K$7$?!%$3$l$K$h$C$F(B 
+;;;; minibufffer $B$KF~$kA0$K3F<o@_Dj$,2DG=$H$J$k!%(B
+
+;;; 92.7.14  modified for Mule Ver.0.9.5 by T.Ito <toshi@his.cpl.melco.co.jp>
+;;;	Attribute bold can be used.
+;;;	Unnecessary '*' in comments of variables deleted.
+;;; 92.7.8   modified for Mule Ver.0.9.5 by Y.Kawabe <kawabe@sra.co.jp>
+;;;	special-symbol-input keeps the position selected last.
+;;; 92.7.8   modified for Mule Ver.0.9.5 by T.Shingu <shingu@cpr.canon.co.jp>
+;;;	busyu-input and kakusuu-input are added in *symbol-input-menu*.
+;;; 92.7.7   modified for Mule Ver.0.9.5 by K.Handa <handa@etl.go.jp>
+;;;	In egg:quit-mode, overwrite-mode is supported correctly.
+;;;	egg:*overwrite-mode-deleted-chars* is not used now.
+;;; 92.6.26  modified for Mule Ver.0.9.5 by K.Handa <handa@etl.go.jp>
+;;;	Funtion dump-its-mode-map gets obsolete.
+;;; 92.6.26  modified for Mule Ver.0.9.5 by M.Shikida <shikida@cs.titech.ac.jp>
+;;;	Backquote ` is registered in *hankaku-alist* and *zenkaku-alist*.
+;;; 92.6.17  modified for Mule Ver.0.9.5 by T.Shingu <shingu@cpr.canon.co.jp>
+;;;	Bug in make-jis-second-level-code-alist fixed.
+;;; 92.6.14  modified for Mule Ver.0.9.5 by T.Enami <enami@sys.ptg.sony.co.jp>
+;;;	menu:select-from-menu is replaced with new version.
+;;; 92.5.18  modified for Mule Ver.0.9.4 by T.Shingu <shingu@cpr.canon.co.jp>
+;;;	lisp/wnn-egg.el is devided into two parts: this file and wnn*-egg.el.
+
+;;;;
+;;;; Mule Ver.0.9.3 $B0JA0(B
+;;;;
+
+;;;; April-15-92 for Mule Ver.0.9.3
+;;;;	by T.Enami <enami@sys.ptg.sony.co.jp> and K.Handa <handa@etl.go.jp>
+;;;;	notify-internal calls 'message' with correct argument.
+
+;;;; April-11-92 for Mule Ver.0.9.3
+;;;;	by T.Enami <enami@sys.ptg.sony.co.jp> and K.Handa <handa@etl.go.jp>
+;;;;	minibuffer $B$+$iH4$1$k;~(B egg:select-window-hook $B$G(B egg:*input-mode* $B$r(B
+;;;;	t $B$K$9$k!#(Bhook $B$N7A$rBgI}=$@5!#(B
+
+;;;; April-3-92 for Mule Ver.0.9.2 by T.Enami <enami@sys.ptg.sony.co.jp>
+;;;; minibuffer $B$+$iH4$1$k;~(B egg:select-window-hook $B$,(B new-buffer $B$N(B
+;;;; egg:*mode-on* $B$J$I$r(B nil $B$K$7$F$$$k$N$r=$@5!#(B
+
+;;;; Mar-22-92 by K.Handa
+;;;; etags $B$,:n$k(B TAGS $B$KITI,MW$J$b$N$rF~$l$J$$$h$&$K$9$k$?$a4X?tL>JQ99(B
+;;;; define-its-mode -> its-define-mode, defrule -> its-defrule
+
+;;;; Mar-16-92 by K.Handa
+;;;; global-map $B$X$N(B define-key $B$r(B mule-keymap $B$KJQ99!#(B
+
+;;;; Mar-13-92 by K.Handa
+;;;; Language specific part $B$r(B japanese.el,... $B$K0\$7$?!#(B
+
+;;;; Feb-*-92 by K. Handa
+;;;; nemacs 4 $B$G$O(B minibuffer-window-selected $B$,GQ;_$K$J$j!$4XO"$9$k%3!<%I$r:o=|$7$?!%(B
+
+;;;; Jan-13-92 by S. Tomura
+;;;; mc-emacs or nemacs 4 $BBP1~:n6H3+;O!%(B
+
+;;;; Aug-9-91 by S. Tomura
+;;;; ?\^ $B$r(B ?^ $B$K=$@5!%(B
+
+;;;;  menu $B$r(B key map $B$r8+$k$h$&$K$9$k!%(B
+
+;;;;  Jul-6-91 by S. Tomura
+;;;;  setsysdict $B$N(B error $B%a%C%;!<%8$rJQ99!%(B
+
+;;;;  Jun-11-91 by S. Tomura
+;;;;  its:*defrule-verbose* $B$rDI2C!%(B
+;;;;
+
+;;;;  Mar-25-91 by S. Tomura
+;;;;  reset-its-mode $B$rGQ;_(B
+
+;;;;  Mar-23-91 by S. Tomura
+;;;;  read-hiragana-string $B$r=$@5!$(B read-kanji-string $B$rDI2C!$(B
+;;;;  isearch:read-kanji-string $B$r@_Dj!%(B
+
+;;;;  Mar-22-91 by S. Tomura
+;;;;  defrule-conditional, defrule-select-mode-temporally $B$rDI2C!#(B
+;;;;  for-each $B$N4J0WHG$H$7$F(B dolist $B$rDI2C!#(B
+;;;;  enable-double-n-syntax $B$r3hMQ!%$[$+$K(B use-kuten-for-comma, use-touten-for-period $B$rDI2C(B
+
+;;;;  Mar-5-91 by S. Tomura
+;;;;  roma-kana-word, henkan-word, roma-kanji-word $B$rDI2C$7$?!%(B
+
+;;;;  Jan-14-91 by S. Tomura
+;;;;  $BF~NOJ8;zJQ497O(B ITS(Input character Translation System) $B$r2~B$$9$k!%(B
+;;;;  $BJQ49$O:G:8:GD9JQ49$r9T$J$$!$JQ49$N$J$$$b$N$O$b$H$N$^$^$H$J$k!%(B
+;;;;  $B2~B$$NF05!$ON)LZ!w7D1~$5$s$N%O%s%0%kJ8;z$NF~NOMW5a$G$"$k!%(B
+;;;;  its:* $B$rDI2C$7$?!%$^$?=>Mh(B fence-self-insert-command $B$H(B roma-kana-region 
+;;;;  $BFs2U=j$K$o$+$l$F$$$?%3!<%I$r(B its:translate-region $B$K$h$C$F0lK\2=$7$?!%(B
+
+;;;;  July-30-90 by S. Tomura
+;;;;  henkan-region $B$r(Boverwrite-mode $B$KBP1~$5$;$k!%JQ?t(B 
+;;;;  egg:*henkan-fence-mode*, egg:*overwrite-mode-deleted-chars*
+;;;;  $B$rDI2C$7!$(Bhenkan-fence-region, henkan-region-internal, 
+;;;;  quit-egg-mode $B$rJQ99$9$k!%(B
+
+;;;;  Mar-4-90 by K.Handa
+;;;;  New variable alphabet-mode-indicator, transparent-mode-indicator,
+;;;;  and henkan-mode-indicator.
+
+;;;;  Feb-27-90 by enami@ptgd.sony.co.jp
+;;;;  menu:select-from-menu $B$G#22U=j$"$k(B ((and (<= ?0 ch) (<= ch ?9)...
+;;;;  $B$N0lJ}$r(B ((and (<= ?0 ch) (<= ch ?9)... $B$K=$@5(B
+
+;;;;  Feb-07-89
+;;;;  bunsetu-length-henko $B$NCf$N(B egg:*attribute-off $B$N0LCV$r(B KKCP $B$r8F$VA0$K(B
+;;;;  $BJQ99$9$k!#(B wnn-client $B$G$O(B KKCP $B$r8F$V$HJ8@a>pJs$,JQ2=$9$k!#(B
+
+;;;;  Feb-01-89
+;;;;  henkan-goto-kouho $B$N(B egg:set-bunsetu-attribute $B$N0z?t(B
+;;;;  $B$N=gHV$,4V0c$C$F$$$?$N$r=$@5$7$?!#!J(Btoshi@isvax.isl.melco.co.jp
+;;;;  (Toshiyuki Ito)$B$N;XE&$K$h$k!#!K(B
+
+;;;;  Dec-25-89
+;;;;  meta-flag t $B$N>l9g$NBP1~$r:F=$@5$9$k!#(B
+;;;;  overwrite-mode $B$G$N(B undo $B$r2~A1$9$k!#(B
+
+;;;;  Dec-21-89
+;;;;  bug fixed by enami@ptdg.sony.co.jp
+;;;;     (fboundp 'minibuffer-window-selected )
+;;;;  -->(boundp  'minibuffer-window-selected )
+;;;;  self-insert-after-hook $B$r(B buffer local $B$K$7$FDj5A$r(B kanji.el $B$X0\F0!#(B
+
+;;;;  Dec-15-89
+;;;;  kill-all-local-variables $B$NDj5A$r(B kanji.el $B$X0\F0$9$k!#(B
+
+;;;;  Dec-14-89
+;;;;  meta-flag t $B$N>l9g$N=hM}$r=$@5$9$k(B
+;;;;  overwrite-mode $B$KBP1~$9$k!#(B
+
+;;;;  Dec-12-89
+;;;;  egg:*henkan-open*, egg:*henkan-close* $B$rDI2C!#(B
+;;;;  egg:*henkan-attribute* $B$rDI2C(B
+;;;;  set-egg-fence-mode-format, set-egg-henkan-mode-format $B$rDI2C(B
+
+;;;;  Dec-12-89
+;;;;  *bunpo-code* $B$K(B 1000: "$B$=$NB>(B" $B$rDI2C(B
+
+;;;;  Dec-11-89
+;;;;  egg:*fence-attribute* $B$r?7@_(B
+;;;;  egg:*bunsetu-attribute* $B$r?7@_(B
+
+;;;;  Dec-11-89
+;;;;  attribute-*-region $B$rMxMQ$9$k$h$&$KJQ99$9$k!#(B
+;;;;  menu:make-selection-list $B$O(B width $B$,>.$5$$;~$K(Bloop $B$9$k!#$3$l$r=$@5$7$?!#(B
+
+;;;;  Dec-10-89
+;;;;  set-marker-type $B$rMxMQ$9$kJ}<0$KJQ99!#(B
+
+;;;;  Dec-07-89
+;;;;  egg:search-path $B$rDI2C!#(B
+;;;;  egg-default-startup-file $B$rDI2C$9$k!#(B
+
+;;;;  Nov-22-89
+;;;;  egg-startup-file $B$rDI2C$9$k!#(B
+;;;;  eggrc-search-path $B$r(B egg-startup-file-search-path $B$KL>A0JQ99!#(B
+
+;;;;  Nov-21-89
+;;;;  Nemacs 3.2 $B$KBP1~$9$k!#(Bkanji-load* $B$rGQ;_$9$k!#(B
+;;;;  wnnfns.c $B$KBP1~$7$?=$@5$r2C$($k!#(B
+;;;;  *Notification* buffer $B$r8+$($J$/$9$k!#(B
+
+;;;;  Oct-2-89
+;;;;  *zenkaku-alist* $B$N(B $BJ8;zDj?t$N=q$-J}$,4V0c$C$F$$$?!#(B
+
+;;;;  Sep-19-89
+;;;;  toggle-egg-mode $B$N=$@5!J(Bkanji-flag$B!K(B
+;;;;  egg-self-insert-command $B$N=$@5(B $B!J(Bkanji-flag$B!K(B
+
+;;;;  Sep-18-89
+;;;;  self-insert-after-hook $B$NDI2C(B
+
+;;;;  Sep-15-89
+;;;;  EGG:open-wnn bug fix
+;;;;  provide wnn-egg feature
+
+;;;;  Sep-13-89
+;;;;  henkan-kakutei-before-point $B$r=$@5$7$?!#(B
+;;;;  enter-fence-mode $B$NDI2C!#(B
+;;;;  egg-exit-hook $B$NDI2C!#(B
+;;;;  henkan-region-internal $B$NDI2C!#(Bhenkan-region$B$O(B point $B$r(Bmark $B$9$k!#(B
+;;;;  eggrc-search-path $B$NDI2C!#(B
+
+;;;;  Aug-30-89
+;;;;  kanji-kanji-1st $B$rD{@5$7$?!#(B
+
+;;;;  May-30-89
+;;;;  EGG:open-wnn $B$O(B get-wnn-host-name $B$,(B nil $B$N>l9g!"(B(system-name) $B$r;HMQ$9$k!#(B
+
+;;;;  May-9-89
+;;;;  KKCP:make-directory added.
+;;;;  KKCP:file-access bug fixed.
+;;;;  set-default-usr-dic-directory modified.
+
+;;;;  Mar-16-89
+;;;;  minibuffer-window-selected $B$r;H$C$F(B minibuffer $B$N(B egg-mode$BI=<(5!G=DI2C(B
+
+;;;;  Mar-13-89
+;;;;   mode-line-format changed. 
+
+;;;;  Feb-27-89
+;;;;  henkan-saishou-bunsetu added
+;;;;  henkan-saichou-bunsetu added
+;;;;  M-<    henkan-saishou-bunsetu
+;;;;  M->    henkan-saichou-bunsetu
+
+;;;;  Feb-14-89
+;;;;   C-h in henkan mode: help-command added
+
+;;;;  Feb-7-89
+;;;;   egg-insert-after-hook is added.
+
+;;;;   M-h   fence-hiragana
+;;;;   M-k   fence-katakana
+;;;;   M->   fence-zenkaku
+;;;;   M-<   fence-hankaku
+
+;;;;  Dec-19-88 henkan-hiragana, henkan-katakara$B$rDI2C!'(B
+;;;;    M-h     henkan-hiragana
+;;;;    M-k     henkan-katakana
+
+;;;;  Ver. 2.00 kana2kanji.c $B$r;H$o$:(B wnn-client.el $B$r;HMQ$9$k$h$&$KJQ99!#(B
+;;;;            $B4XO"$7$F0lIt4X?t$rJQ99(B
+
+;;;;  Dec-2-88 special-symbol-input $B$rDI2C!((B
+;;;;    C-^   special-symbol-input
+
+;;;;  Nov-18-88 henkan-mode-map $B0lItJQ99!((B
+;;;;    M-i  henkan-inspect-bunsetu
+;;;;    M-s  henkan-select-kouho
+;;;;    C-g  henkan-quit
+
+;;;;  Nov-18-88 jserver-henkan-kakutei $B$N;EMMJQ99$KH<$$!"(Bkakutei $B$N%3!<(B
+;;;;  $B%I$rJQ99$7$?!#(B
+
+;;;;  Nov-17-88 kakutei-before-point $B$G(B point $B0J9_$N4V0c$C$?ItJ,$NJQ49(B
+;;;;  $B$,IQEY>pJs$KEPO?$5$l$J$$$h$&$K=$@5$7$?!#$3$l$K$O(BKKCC:henkan-end 
+;;;;  $B$N0lIt;EMM$HBP1~$9$k(Bkana2kanji.c$B$bJQ99$7$?!#(B
+
+;;;;  Nov-17-88 henkan-inspect-bunsetu $B$rDI2C$7$?!#(B
+
+;;;;  Nov-17-88 $B?7$7$$(B kana2kanji.c $B$KJQ99$9$k!#(B
+
+;;;;  Sep-28-88 defrule$B$,CM$H$7$F(Bnil$B$rJV$9$h$&$KJQ99$7$?!#(B
+
+;;;;  Aug-25-88 $BJQ493X=,$r@5$7$/9T$J$&$h$&$KJQ99$7$?!#(B
+;;;;  KKCP:henkan-kakutei$B$O(BKKCP:jikouho-list$B$r8F$s$@J8@a$KBP$7$F$N$_E,(B
+;;;;  $BMQ$G$-!"$=$l0J30$N>l9g$N7k2L$OJ]>Z$5$l$J$$!#$3$N>r7o$rK~$?$9$h$&(B
+;;;;  $B$K(BKKCP:jikouho-list$B$r8F$s$G$$$J$$J8@a$KBP$7$F$O(B
+;;;;  KKCP:henkan-kakutei$B$r8F$P$J$$$h$&$K$7$?!#(B
+
+;;;;  Aug-25-88 egg:do-auto-fill $B$r=$@5$7!"J#?t9T$K$o$?$k(Bauto-fill$B$r@5(B
+;;;;  $B$7$/9T$J$&$h$&$K=$@5$7$?!#(B
+
+;;;;  Aug-25-88 menu command$B$K(B\C-l: redraw $B$rDI2C$7$?!#(B
+
+;;;;  Aug-25-88 toroku-region$B$GEPO?$9$kJ8;zNs$+$i(Bno graphic character$B$r(B
+;;;;  $B<+F0E*$K=|$/$3$H$K$7$?!#(B
+
+;; XEmacs addition: (and remove disable-undo variable)
+;; For Emacs V18/Nemacs compatibility
+(and (not (fboundp 'buffer-disable-undo))
+     (fboundp 'buffer-flush-undo)
+     (defalias 'buffer-disable-undo 'buffer-flush-undo))
+
+(eval-when-compile (require 'egg-jsymbol))
+
+;;;----------------------------------------------------------------------
+;;;
+;;; Version control routine
+;;;
+;;;----------------------------------------------------------------------
+
+(and (equal (user-full-name) "Satoru Tomura")
+     (defun egg-version-update (arg)
+       (interactive "P")
+       (if (equal (buffer-name (current-buffer)) "wnn-egg.el")
+	   (save-excursion
+	    (goto-char (point-min))
+	    (re-search-forward "(defvar 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)))
+	      (search-forward "Egg last modified date: ")
+	      (kill-line)
+	      (insert (current-time-string)))
+	    (save-buffer)
+	    (if arg (byte-compile-file (buffer-file-name)))
+	 )))
+     )
+;;;
+;;;----------------------------------------------------------------------
+;;;
+;;; Utilities
+;;;
+;;;----------------------------------------------------------------------
+
+;;; 
+;;;;
+
+(defun characterp (form)
+  (numberp form))
+
+(defun coerce-string (form)
+  (cond((stringp form) form)
+       ((characterp form) (char-to-string form))))
+
+(defun coerce-internal-string (form)
+  (cond((stringp form)
+	(if (= (chars-in-string form) 1) 
+	    (string-to-char form)
+	  form))
+       ((characterp form) form)))
+
+;;; kill-all-local-variables $B$+$iJ]8n$9$k(B local variables $B$r;XDj$G$-$k(B
+;;; $B$h$&$KJQ99$9$k!#(B
+
+(put 'egg:*input-mode* 'permanent-local t)
+(put 'egg:*mode-on* 'permanent-local t)
+(put 'its:*current-map* 'permanent-local t)
+(put 'mode-line-egg-mode 'permanent-local t)
+
+;;;----------------------------------------------------------------------
+;;;
+;;; 16$B?JI=8=$N(BJIS $B4A;z%3!<%I$r(B minibuffer $B$+$iFI$_9~$`(B
+;;;
+;;;----------------------------------------------------------------------
+
+;;;
+;;; User entry:  jis-code-input
+;;;
+
+(defun jis-code-input ()
+  (interactive)
+  (insert-jis-code-from-minibuffer "JIS $B4A;z%3!<%I(B(16$B?J?tI=8=(B): "))
+
+(defun insert-jis-code-from-minibuffer (prompt)
+  (let ((str (read-from-minibuffer prompt)) val)
+    (while (null (setq val (read-jis-code-from-string str)))
+      (beep)
+      (setq str (read-from-minibuffer prompt str)))
+    (insert (make-character lc-jp (car val) (cdr val)))))
+
+(defun hexadigit-value (ch)
+  (cond((and (<= ?0 ch) (<= ch ?9))
+	(- ch ?0))
+       ((and (<= ?a ch) (<= ch ?f))
+	(+ (- ch ?a) 10))
+       ((and (<= ?A ch) (<= ch ?F))
+	(+ (- ch ?A) 10))))
+
+(defun read-jis-code-from-string (str)
+  (if (and (= (length str) 4)
+	   (<= 2 (hexadigit-value (aref str 0)))
+	   (hexadigit-value (aref str 1))
+	   (<= 2 (hexadigit-value (aref str 2)))
+	   (hexadigit-value (aref str 3)))
+  (cons (+ (* 16 (hexadigit-value (aref str 0)))
+	       (hexadigit-value (aref str 1)))
+	(+ (* 16 (hexadigit-value (aref str 2)))
+	   (hexadigit-value (aref str 3))))))
+
+;;;----------------------------------------------------------------------	
+;;;
+;;; $B!V$?$^$4!W(B Notification System
+;;;
+;;;----------------------------------------------------------------------
+
+(defconst *notification-window* " *Notification* ")
+
+;;;(defmacro notify (str &rest args)
+;;;  (list 'notify-internal
+;;;	(cons 'format (cons str args))))
+
+(defun notify (str &rest args)
+  (notify-internal (apply 'format (cons str args))))
+
+(defun notify-internal (message &optional noerase)
+  (save-excursion
+    (let ((notify-buff (get-buffer-create *notification-window*)))
+      (set-buffer notify-buff)
+      (goto-char (point-max))
+      (setq buffer-read-only nil)
+      (insert (substring (current-time-string) 4 19) ":: " message ?\n )
+      (setq buffer-read-only t)
+      (bury-buffer notify-buff)
+      (message "%s" message)		; 92.4.15 by T.Enami
+      (if noerase nil
+	(sleep-for 1) (message "")))))
+
+;;;(defmacro notify-yes-or-no-p (str &rest args)
+;;;  (list 'notify-yes-or-no-p-internal 
+;;;	(cons 'format (cons str args))))
+
+(defun notify-yes-or-no-p (str &rest args)
+  (notify-yes-or-no-p-internal (apply 'format (cons str args))))
+
+(defun notify-yes-or-no-p-internal (message)
+  (save-window-excursion
+    (pop-to-buffer *notification-window*)
+    (goto-char (point-max))
+    (setq buffer-read-only nil)
+    (insert (substring (current-time-string) 4 19) ":: " message ?\n )
+    (setq buffer-read-only t)
+    (yes-or-no-p "$B$$$$$G$9$+!)(B")))
+
+(defun notify-y-or-n-p (str &rest args)
+  (notify-y-or-n-p-internal (apply 'format (cons str args))))
+
+(defun notify-y-or-n-p-internal (message)
+  (save-window-excursion
+    (pop-to-buffer *notification-window*)
+    (goto-char (point-max))
+    (setq buffer-read-only nil)
+    (insert (substring (current-time-string) 4 19) ":: " message ?\n )
+    (setq buffer-read-only t)
+    (y-or-n-p "$B$$$$$G$9$+!)(B")))
+
+(defun select-notification ()
+  (interactive)
+  (pop-to-buffer *notification-window*)
+  (setq buffer-read-only t))
+
+;;;----------------------------------------------------------------------
+;;;
+;;; $B!V$?$^$4!W(B Menu System
+;;;
+;;;----------------------------------------------------------------------
+
+;;;
+;;;  minibuffer $B$K(B menu $B$rI=<(!&A*Br$9$k(B
+;;;
+
+;;;
+;;; menu $B$N;XDjJ}K!!'(B
+;;;
+;;; <menu item> ::= ( menu <prompt string>  <menu-list> )
+;;; <menu list> ::= ( <menu element> ... )
+;;; <menu element> ::= ( <string> . <value> ) | <string>
+;;;                    ( <char>   . <value> ) | <char>
+
+;;; select-menu-in-minibuffer
+
+(defvar menu:*select-items* nil)
+(defvar menu:*select-menus* nil)
+(defvar menu:*select-item-no* nil)
+(defvar menu:*select-menu-no* nil)
+(defvar menu:*select-menu-stack* nil)
+(defvar menu:*select-start* nil)
+(defvar menu:*select-positions* nil)
+
+(defvar menu-mode-map (make-keymap))
+
+(define-key menu-mode-map "\C-a" 'menu:begining-of-menu)
+(define-key menu-mode-map "\C-e" 'menu:end-of-menu)
+(define-key menu-mode-map "\C-f" 'menu:next-item)
+(define-key menu-mode-map "\C-b" 'menu:previous-item)
+(define-key menu-mode-map "\C-n" 'menu:next-item-old)
+(define-key menu-mode-map "\C-g" 'menu:quit)
+(define-key menu-mode-map "\C-p" 'menu:previous-item-old)
+(define-key menu-mode-map "\C-l" 'menu:refresh)
+;;; 0 .. 9 a .. z A .. z
+(define-key menu-mode-map "\C-m" 'menu:select)
+(define-key menu-mode-map [return] 'menu:select)
+(define-key menu-mode-map [left] 'menu:previous-item)
+(define-key menu-mode-map [right] 'menu:next-item)
+(define-key menu-mode-map [up] 'menu:previous-item-old)
+(define-key menu-mode-map [down] 'menu:next-item-old)
+
+;; 92.6.14 by T.Enami -- This function was completely modified.
+(defun menu:select-from-menu (menu &optional initial position)
+  (let ((echo-keystrokes 0)
+	(inhibit-quit t)
+	(menubuffer (get-buffer-create " *menu*"))
+	(minibuffer (window-buffer (minibuffer-window)))
+	value)
+    (save-window-excursion
+      (if (fboundp 'redirect-frame-focus)
+	  (redirect-frame-focus (selected-frame)
+				(window-frame (minibuffer-window))))
+      (set-window-buffer (minibuffer-window) menubuffer)
+      (select-window (minibuffer-window))
+      (set-buffer menubuffer)
+      (delete-region (point-min) (point-max))
+      (insert (nth 1 menu))
+      (let* ((window-width (window-width (selected-window)))
+	     (finished nil))
+	(setq menu:*select-menu-stack* nil
+	      menu:*select-positions* nil
+	      menu:*select-start* (point)
+	      menu:*select-menus*
+	      (menu:make-selection-list (nth 2 menu)
+					(- window-width  
+					   ;;; 92.8.19 by K.Handa
+					   (string-width (nth 1 menu)))))
+	;; 92.7.8 by Y.Kawabe
+	(cond
+	 ((and (numberp initial)
+	       (<= 0 initial)
+	       (< initial (length (nth 2 menu))))
+	  (menu:select-goto-item-position initial))
+	 ((and (listp initial) (car initial)
+	       (<= 0 (car initial))
+	       (< (car initial) (length (nth 2 menu))))
+	  (menu:select-goto-item-position (car initial))
+	  (while (and (setq initial (cdr initial))
+		      (setq value (menu:item-value (nth menu:*select-item-no* 
+							menu:*select-items*)))
+		      (listp value) (eq (car value) 'menu))
+	    (setq menu:*select-positions*
+		  (cons (menu:select-item-position) menu:*select-positions*))
+	    (setq menu:*select-menu-stack*
+		  (cons (list menu:*select-items* menu:*select-menus*
+			      menu:*select-item-no* menu:*select-menu-no*
+			      menu)
+			menu:*select-menu-stack*))
+	    (setq menu value)
+	    (delete-region (point-min) (point-max)) (insert (nth 1 menu))
+	    (setq menu:*select-start* (point))
+	    (setq menu:*select-menus*
+		  (menu:make-selection-list
+		   ;;; 92.9.19 by Y. Kawabe
+		   (nth 2 menu) (- window-width (string-width (nth 1 menu)))))
+	    (if (and (numberp (car initial))
+		     (<= 0 (car initial))
+		     (< (car initial) (length (nth 2 menu))))
+		(menu:select-goto-item-position (car initial))
+	      (setq menu:*select-item-no* 0)
+	      (menu:select-goto-menu 0)))
+	  (setq value nil))
+	 (t
+	  (setq menu:*select-item-no* 0)
+	  (menu:select-goto-menu 0))
+	 )
+	;; end of patch
+	(while (not finished)
+	  (let ((ch (read-event)))
+	    (setq quit-flag nil)
+	    (cond
+	     ((eq ch ?\C-a)
+	      (menu:select-goto-item 0))
+	     ((eq ch ?\C-e)
+	      (menu:select-goto-item (1- (length menu:*select-items*))))
+	     ((or (eq ch ?\C-f) (eq ch 'right))
+	      ;;(menu:select-goto-item (1+ menu:*select-item-no*))
+	      (menu:select-next-item)
+	      )
+	     ((or (eq ch ?\C-b) (eq ch 'left))
+	      ;;(menu:select-goto-item (1- menu:*select-item-no*))
+	      (menu:select-previous-item)
+	      )
+	     ((or (eq ch ?\C-n) (eq ch 'down))
+	      (menu:select-goto-menu (1+ menu:*select-menu-no*)))
+	     ((eq ch ?\C-g)
+	      (if menu:*select-menu-stack*
+		  (let ((save (car menu:*select-menu-stack*)))
+		    (setq menu:*select-menu-stack*
+			  (cdr menu:*select-menu-stack*))
+		    (setq menu:*select-items* (nth 0 save);92.10.26 by T.Saneto
+			  menu:*select-menus*    (nth 1 save)
+			  menu:*select-item-no*  (nth 2 save)
+			  menu:*select-menu-no*  (nth 3 save)
+			  menu                   (nth 4 save))
+		    (setq menu:*select-positions*
+			  (cdr menu:*select-positions*))
+		    (delete-region (point-min) (point-max))
+		    (insert (nth 1 menu))
+		    (setq menu:*select-start* (point))
+		    (menu:select-goto-menu menu:*select-menu-no*)
+		    (menu:select-goto-item menu:*select-item-no*)
+		    )
+		(setq finished t
+		      value nil)))
+	     ((or (eq ch ?\C-p) (eq ch 'up))
+	      (menu:select-goto-menu (1- menu:*select-menu-no*)))
+	     ((eq ch ?\C-l)  ;;; redraw menu
+	      (menu:select-goto-menu menu:*select-menu-no*))
+	     ((and (numberp ch) (<= ?0 ch) (<= ch ?9)
+		   (<= ch (+ ?0 (1- (length menu:*select-items*)))))
+	      (menu:select-goto-item (- ch ?0)))
+	     ((and (numberp ch) (<= ?a ch) (<= ch ?z)
+		   (<= (+ 10 ch) (+ ?a (1- (length menu:*select-items*)))))
+	      (menu:select-goto-item (+ 10 (- ch ?a))))
+	     ((and (numberp ch) (<= ?A ch) (<= ch ?Z)
+		   (<= (+ 10 ch) (+ ?A (1- (length menu:*select-items*)))))
+	      (menu:select-goto-item (+ 10 (- ch ?A))))
+	     ((or (eq ch ?\C-m) (eq ch 'return))
+	      (setq value (menu:item-value (nth menu:*select-item-no* 
+						menu:*select-items*)))
+	      (setq menu:*select-positions* 
+		    (cons (menu:select-item-position)
+			  menu:*select-positions*))
+	      (if (and (listp value)
+		       (eq (car value) 'menu))
+		  (progn
+		    (setq menu:*select-menu-stack*
+			  (cons
+			   (list menu:*select-items* menu:*select-menus*
+				 menu:*select-item-no* menu:*select-menu-no*
+				 menu)
+			   menu:*select-menu-stack*))
+		    (setq menu value)
+		    (delete-region (point-min) (point-max))
+		    (insert (nth 1 menu))
+		    (setq menu:*select-start* (point))
+		    (setq menu:*select-menus*
+			  ;;; 92.9.19 by Y. Kawabe
+			  (menu:make-selection-list
+			   (nth 2 menu)
+			   (- window-width
+			      (string-width (nth 1 menu)))))
+		    (setq menu:*select-item-no* 0)
+		    (menu:select-goto-menu 0)
+		    (setq value nil)
+		    )
+		(setq finished t)))
+	     (t (beep))))))
+      (delete-region (point-min) (point-max))
+      (setq menu:*select-positions*
+	    (nreverse menu:*select-positions*))
+      (set-window-buffer (minibuffer-window) minibuffer)
+      (if (null value)
+	  (setq quit-flag t)
+	(if position
+	    (cons value menu:*select-positions*)
+	  value)))))
+
+(defun menu:select-item-position ()
+  (let ((p 0) (m 0))
+    (while (< m menu:*select-menu-no*)
+      (setq p (+ p (length (nth m menu:*select-menus*))))
+      (setq m (1+ m)))
+    (+ p menu:*select-item-no*)))
+    
+(defun menu:select-goto-item-position (pos)
+  (let ((m 0) (i 0) (p 0))
+    (while (<= (+ p (length (nth m menu:*select-menus*))) pos)
+      (setq p (+ p (length (nth m menu:*select-menus*))))
+      (setq m (1+ m)))
+    (setq menu:*select-item-no* (- pos p))
+    (menu:select-goto-menu m)))
+
+(defun menu:select-goto-menu (no)
+  (setq menu:*select-menu-no*
+	(check-number-range no 0 (1- (length menu:*select-menus*))))
+  (setq menu:*select-items* (nth menu:*select-menu-no* menu:*select-menus*))
+  (delete-region menu:*select-start* (point-max))
+  (if (<= (length menu:*select-items*) menu:*select-item-no*)
+      (setq menu:*select-item-no* (1- (length menu:*select-items*))))
+  (goto-char menu:*select-start*)
+  (let ((l menu:*select-items*) (i 0))
+    (while l
+      (insert (if (<= i 9) (format "  %d." i)
+		(format "  %c." (+ (- i 10) ?a)))
+	      (menu:item-string (car l)))
+      (setq l (cdr l)
+	    i (1+ i))))
+  (menu:select-goto-item menu:*select-item-no*))
+
+(defun menu:select-goto-item (no)
+  (setq menu:*select-item-no* 
+	(check-number-range no 0
+			    (1- (length menu:*select-items*))))
+  (let ((p (+ 2 menu:*select-start*)) (i 0))
+    (while (< i menu:*select-item-no*)
+      (setq p (+ p (length (menu:item-string (nth i menu:*select-items*))) 4))
+      (setq i (1+ i)))
+    (goto-char p)))
+    
+(defun menu:select-next-item ()
+  (if (< menu:*select-item-no* (1- (length menu:*select-items*)))
+      (menu:select-goto-item (1+ menu:*select-item-no*))
+    (progn
+      (setq menu:*select-item-no* 0)
+      (menu:select-goto-menu (1+ menu:*select-menu-no*)))))
+
+(defun menu:select-previous-item ()
+  (if (< 0 menu:*select-item-no*)
+      (menu:select-goto-item (1- menu:*select-item-no*))
+    (progn 
+      (setq menu:*select-item-no* 1000)
+      (menu:select-goto-menu (1- menu:*select-menu-no*)))))
+
+(defvar menu:*display-item-value* nil)
+
+(defun menu:item-string (item)
+  (cond((stringp item) item)
+       ((numberp item) (char-to-string item))
+       ((consp item)
+	(if menu:*display-item-value*
+	    (format "%s [%s]"
+		    (cond ((stringp (car item)) (car item))
+			  ((numberp (car item)) (char-to-string (car item)))
+			  (t ""))
+		    (cdr item))
+	  (cond ((stringp (car item))
+		 (car item))
+		((numberp (car item))
+		 (char-to-string (car item)))
+		(t ""))))
+       (t "")))
+
+(defun menu:item-value (item)
+  (cond((stringp item) item)
+       (t (cdr item))))
+
+(defun menu:make-selection-list (items width)
+  (let ((whole nil) (line nil) (size 0))
+    (while items
+      ;;; 92.9.19 by Y. Kawabe
+      (if (<= width (+ size 4 (string-width (menu:item-string(car items)))))
+	  (if line
+	      (setq whole (cons (reverse line) whole)
+		    line nil
+		    size 0)
+	    (setq whole (cons (list (car items)) whole)
+		  size 0
+		  items (cdr items)))
+	;;; 92.9.19 by Y. Kawabe
+	(setq line (cons (car items) line)
+	      size (+ size 4 (string-width(menu:item-string (car items))))
+	      items (cdr items))))
+    (if line
+	(reverse (cons (reverse line) whole))
+      (reverse whole))))
+
+
+;;;----------------------------------------------------------------------
+;;;
+;;;  $B0l3g7?JQ495!G=(B
+;;;
+;;;----------------------------------------------------------------------
+
+(defvar ascii-char "[\40-\176]")
+
+(defvar ascii-space "[ \t]")
+(defvar ascii-symbols "[\40-\57\72-\100\133-\140\173-\176]")
+(defvar ascii-numeric "[\60-\71]")
+(defvar ascii-English-Upper "[\101-\132]")
+(defvar ascii-English-Lower "[\141-\172]")
+
+(defvar ascii-alphanumeric "[\60-\71\101-\132\141-\172]")
+
+(defvar kanji-char "\\cj")
+(defvar kanji-space "$B!!(B")
+(defvar kanji-symbols "\\cS")
+(defvar kanji-numeric "[$B#0(B-$B#9(B]")
+(defvar kanji-English-Upper "[$B#A(B-$B#Z(B]")
+(defvar kanji-English-Lower  "[$B#a(B-$B#z(B]")
+;;; Bug fixed by Yoshida@CSK on 88-AUG-24
+(defvar kanji-hiragana "\\cH")
+(defvar kanji-katakana "\\cK")
+;;;
+(defvar kanji-Greek-Upper "[$B&!(B-$B&8(B]")
+(defvar kanji-Greek-Lower "[$B&A(B-$B&X(B]")
+(defvar kanji-Russian-Upper "[$B'!(B-$B'A(B]")
+(defvar kanji-Russian-Lower "[$B'Q(B-$B'q(B]")
+(defvar kanji-Kanji-1st-Level  "[$B0!(B-$BOS(B]")
+(defvar kanji-Kanji-2nd-Level  "[$BP!(B-$Bt$(B]")
+
+(defvar kanji-kanji-char "\\(\\cH\\|\\cK\\|\\cC\\)")
+
+(defvar aletter (concat "\\(" ascii-char "\\|" kanji-char "\\)"))
+
+;;;
+;;; $B$R$i$,$JJQ49(B
+;;;
+
+(defun hiragana-region (start end)
+  (interactive "r")
+    (goto-char start)
+    (while (re-search-forward kanji-katakana end end)
+      (let ((ch (preceding-char)))
+	(cond( (<= ch ?$B%s(B)
+	       (delete-char -1)
+	       (insert (make-character lc-jp ?\244 (char-component ch 2))))))))
+
+(defun hiragana-paragraph ()
+  "hiragana  paragraph at or after point."
+  (interactive )
+  (save-excursion
+    (forward-paragraph)
+    (let ((end (point)))
+      (backward-paragraph)
+      (hiragana-region (point) end ))))
+
+(defun hiragana-sentence ()
+  "hiragana  sentence at or after point."
+  (interactive )
+  (save-excursion
+    (forward-sentence)
+    (let ((end (point)))
+      (backward-sentence)
+      (hiragana-region (point) end ))))
+
+;;;
+;;; $B%+%?%+%JJQ49(B
+;;;
+
+(defun katakana-region (start end)
+  (interactive "r")
+  (let ((point (point)))
+    (goto-char start)
+    (while (re-search-forward kanji-hiragana end end)
+      (let ((ch (char-component (preceding-char) 2)))
+	(delete-char -1)
+	(insert (make-character lc-jp ?\245 ch))))))
+
+(defun katakana-paragraph ()
+  "katakana  paragraph at or after point."
+  (interactive )
+  (save-excursion
+    (forward-paragraph)
+    (let ((end (point)))
+      (backward-paragraph)
+      (katakana-region (point) end ))))
+
+(defun katakana-sentence ()
+  "katakana  sentence at or after point."
+  (interactive )
+  (save-excursion
+    (forward-sentence)
+    (let ((end (point)))
+      (backward-sentence)
+      (katakana-region (point) end ))))
+
+;;;
+;;; $BH>3QJQ49(B
+;;; 
+
+(defun hankaku-region (start end)
+  (interactive "r")
+  (save-restriction
+    (narrow-to-region start end)
+    (goto-char (point-min))
+    (while (re-search-forward "\\cS\\|\\cA" (point-max) (point-max))
+      (let* ((ch (preceding-char))
+	     (ch1 (char-component ch 1))
+	     (ch2 (char-component ch 2)))
+	(cond ((= ?\241 ch1)
+	       (let ((val (cdr (assq ch2 *hankaku-alist*))))
+		 (if val (progn
+			   (delete-char -1)
+			   (insert val)))))
+	      ((= ?\243 ch1)
+	       (delete-char -1)
+	       (insert (- ch2 ?\200 ))))))))
+
+(defun hankaku-paragraph ()
+  "hankaku  paragraph at or after point."
+  (interactive )
+  (save-excursion
+    (forward-paragraph)
+    (let ((end (point)))
+      (backward-paragraph)
+      (hankaku-region (point) end ))))
+
+(defun hankaku-sentence ()
+  "hankaku  sentence at or after point."
+  (interactive )
+  (save-excursion
+    (forward-sentence)
+    (let ((end (point)))
+      (backward-sentence)
+      (hankaku-region (point) end ))))
+
+(defun hankaku-word (arg)
+  (interactive "p")
+  (let ((start (point)))
+    (forward-word arg)
+    (hankaku-region start (point))))
+
+(defvar *hankaku-alist*
+  '(( 161 . ?\  ) 
+    ( 170 . ?\! )
+    ( 201 . ?\" )
+    ( 244 . ?\# )
+    ( 240 . ?\$ )
+    ( 243 . ?\% )
+    ( 245 . ?\& )
+    ( 199 . ?\' )
+    ( 202 . ?\( )
+    ( 203 . ?\) )
+    ( 246 . ?\* )
+    ( 220 . ?\+ )
+    ( 164 . ?\, )
+    ( 221 . ?\- )
+    ( 165 . ?\. )
+    ( 191 . ?\/ )
+    ( 167 . ?\: )
+    ( 168 . ?\; )
+    ( 227 . ?\< )
+    ( 225 . ?\= )
+    ( 228 . ?\> )
+    ( 169 . ?\? )
+    ( 247 . ?\@ )
+    ( 206 . ?\[ )
+    ( 239 . ?\\ )
+    ( 207 . ?\] )
+    ( 176 . ?^ )
+    ( 178 . ?\_ )
+    ( 208 . ?\{ )
+    ( 195 . ?\| )
+    ( 209 . ?\} )
+    ( 177 . ?\~ )
+    ( 198 . ?` )			; 92.6.26 by M.Shikida
+    ))
+
+;;;
+;;; $BA43QJQ49(B
+;;;
+
+(defun zenkaku-region (start end)
+  (interactive "r")
+  (save-restriction
+    (narrow-to-region start end)
+    (goto-char (point-min))
+    (while (re-search-forward "[ -~]" (point-max) (point-max))
+      (let ((ch (preceding-char)))
+	(if (and (<= ?  ch) (<= ch ?~))
+	    (progn
+	      (delete-char -1)
+	      (let ((zen (cdr (assq ch *zenkaku-alist*))))
+		(if zen (insert zen)
+		  (insert (make-character lc-jp ?\243 (+ ?\200 ch)))))))))))
+
+(defun zenkaku-paragraph ()
+  "zenkaku  paragraph at or after point."
+  (interactive )
+  (save-excursion
+    (forward-paragraph)
+    (let ((end (point)))
+      (backward-paragraph)
+      (zenkaku-region (point) end ))))
+
+(defun zenkaku-sentence ()
+  "zenkaku  sentence at or after point."
+  (interactive )
+  (save-excursion
+    (forward-sentence)
+    (let ((end (point)))
+      (backward-sentence)
+      (zenkaku-region (point) end ))))
+
+(defun zenkaku-word (arg)
+  (interactive "p")
+  (let ((start (point)))
+    (forward-word arg)
+    (zenkaku-region start (point))))
+
+(defvar *zenkaku-alist*
+  '((?  . "$B!!(B") 
+    (?! . "$B!*(B")
+    (?\" . "$B!I(B")
+    (?# . "$B!t(B")
+    (?$ . "$B!p(B")
+    (?% . "$B!s(B")
+    (?& . "$B!u(B")
+    (?' . "$B!G(B")
+    (?( . "$B!J(B")
+    (?) . "$B!K(B")
+    (?* . "$B!v(B")
+    (?+ . "$B!\(B")
+    (?, . "$B!$(B")
+    (?- . "$B!](B")
+    (?. . "$B!%(B")
+    (?/ . "$B!?(B")
+    (?: . "$B!'(B")
+    (?\; . "$B!((B")
+    (?< . "$B!c(B")
+    (?= . "$B!a(B")
+    (?> . "$B!d(B")
+    (?? . "$B!)(B")
+    (?@ . "$B!w(B")
+    (?[ . "$B!N(B")
+    (?\\ . "$B!o(B")
+    (?] . "$B!O(B")
+    (?^ . "$B!0(B")
+    (?_ . "$B!2(B")
+    (?{ . "$B!P(B")
+    (?| . "$B!C(B")
+    (?} . "$B!Q(B")
+    (?~ . "$B!1(B")
+    (?` . "$B!F(B")))			; 92.6.26 by M.Shikida
+
+;;;
+;;; $B%m!<%^;z$+$JJQ49(B
+;;;
+
+(defun roma-kana-region (start end )
+  (interactive "r")
+  (its:translate-region start end nil (its:get-mode-map "roma-kana")))
+
+(defun roma-kana-paragraph ()
+  "roma-kana  paragraph at or after point."
+  (interactive )
+  (save-excursion
+    (forward-paragraph)
+    (let ((end (point)))
+      (backward-paragraph)
+      (roma-kana-region (point) end ))))
+
+(defun roma-kana-sentence ()
+  "roma-kana  sentence at or after point."
+  (interactive )
+  (save-excursion
+    (forward-sentence)
+    (let ((end (point)))
+      (backward-sentence)
+      (roma-kana-region (point) end ))))
+
+(defun roma-kana-word ()
+  "roma-kana 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)
+      (roma-kana-region start (point)))))
+
+;;;
+;;; $B%m!<%^;z4A;zJQ49(B
+;;;
+
+(defun roma-kanji-region (start end)
+  (interactive "r")
+  (roma-kana-region start end)
+  (save-restriction
+    (narrow-to-region start (point))
+    (goto-char (point-min))
+    (replace-regexp "\\($B!!(B\\| \\)" "")
+    (goto-char (point-max)))
+  (henkan-region-internal start (point)))
+
+(defun roma-kanji-paragraph ()
+  "roma-kanji  paragraph at or after point."
+  (interactive )
+  (save-excursion
+    (forward-paragraph)
+    (let ((end (point)))
+      (backward-paragraph)
+      (roma-kanji-region (point) end ))))
+
+(defun roma-kanji-sentence ()
+  "roma-kanji  sentence at or after point."
+  (interactive )
+  (save-excursion
+    (forward-sentence)
+    (let ((end (point)))
+      (backward-sentence)
+      (roma-kanji-region (point) end ))))
+
+(defun roma-kanji-word ()
+  "roma-kanji 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)
+      (roma-kanji-region start (point)))))
+
+
+;;;----------------------------------------------------------------------
+;;;
+;;; $B!V$?$^$4!WF~NOJ8;zJQ497O(B ITS
+;;; 
+;;;----------------------------------------------------------------------
+
+(defun egg:member (elt list)
+  (while (not (or (null list) (equal elt (car list))))
+    (setq list (cdr list)))
+  list)
+
+;;;
+;;; Mode name --> map
+;;;
+;;; ITS mode name: string
+
+(defvar its:*mode-alist* nil)
+(defvar its:*internal-mode-alist* nil)
+
+(defun its:get-mode-map (name)
+  (or (cdr (assoc name its:*mode-alist*))
+      (cdr (assoc name its:*internal-mode-alist*))))
+
+(defun its:set-mode-map (name map &optional internalp)
+  (let ((place (assoc name 
+		      (if internalp its:*internal-mode-alist*
+			its:*mode-alist*))))
+    (if place (let ((mapplace (cdr place)))
+		(setcar mapplace (car map))
+		(setcdr mapplace (cdr map)))
+      (progn (setq place (cons name map))
+	     (if internalp
+		 (setq its:*internal-mode-alist*
+		       (append its:*internal-mode-alist* (list place)))
+	       (setq its:*mode-alist* 
+		     (append its:*mode-alist* (list place))))))))
+
+;;;
+;;; ITS mode indicators
+;;; Mode name --> indicator
+;;;
+
+(defun its:get-mode-indicator (name)
+  (let ((map (its:get-mode-map name)))
+    (if map (map-indicator map)
+      name)))
+
+(defun its:set-mode-indicator (name indicator)
+  (let ((map (its:get-mode-map name)))
+    (if map
+	(map-set-indicator map indicator)
+      (its-define-mode name indicator))))
+
+;;;
+;;; ITS mode declaration
+;;;
+
+(defvar its:*processing-map* nil)
+
+(defun its-define-mode (name &optional indicator reset supers internalp) 
+  "its-mode NAME $B$rDj5AA*Br$9$k!%B>$N(B its-mode $B$,A*Br$5$l$k$^$G$O(B 
+its-defrule $B$J$I$O(B NAME $B$KBP$7$F5,B'$rDI2C$9$k!%(BINDICATOR $B$,(B non-nil 
+$B$N;~$K$O(B its-mode NAME $B$rA*Br$9$k$H(B mode-line $B$KI=<($5$l$k!%(BRESET $B$,(B 
+non-nil $B$N;~$K$O(B its-mode $B$NDj5A$,6u$K$J$k!%(BSUPERS $B$O>e0L$N(B its-mode 
+$BL>$r%j%9%H$G;XDj$9$k!%(BINTERNALP $B$O(B mode name $B$rFbItL>$H$9$k!%(B
+its-defrule, its-defrule-conditional, defule-select-mode-temporally $B$r(B
+$B;2>H(B"
+
+  (if (null(its:get-mode-map name))
+      (progn 
+	(setq its:*processing-map* 
+	      (make-map nil (or indicator name) nil (mapcar 'its:get-mode-map supers)))
+	(its:set-mode-map name its:*processing-map* internalp)
+	)
+    (progn (setq its:*processing-map* (its:get-mode-map name))
+	   (if indicator
+	       (map-set-indicator its:*processing-map* indicator))
+	   (if reset
+	       (progn
+		 (map-set-state its:*processing-map* nil)
+		 (map-set-alist its:*processing-map* nil)
+		 ))
+	   (if supers
+	       (progn
+		 (map-set-supers its:*processing-map* (mapcar 'its:get-mode-map supers))))))
+  nil)
+
+;;;
+;;; defrule related utilities
+;;;
+
+(put 'for-each 'lisp-indent-hook 1)
+
+(defmacro for-each (vars &rest body)
+  "(for-each ((VAR1 LIST1) ... (VARn LISTn)) . BODY) $B$OJQ?t(B VAR1 $B$NCM(B
+$B$r%j%9%H(B LIST1 $B$NMWAG$KB+G{$7!$!%!%!%JQ?t(B VARn $B$NCM$r%j%9%H(B LISTn $B$NMW(B
+$BAG$KB+G{$7$F(B BODY $B$r<B9T$9$k!%(B"
+
+  (for-each* vars (cons 'progn body)))
+
+(defun for-each* (vars body)
+  (cond((null vars) body)
+       (t (let((tvar (make-symbol "temp"))
+	       (var  (car (car vars)))
+	       (val  (car (cdr (car vars)))))
+	    (list 'let (list (list tvar val)
+			     var)
+		  (list 'while tvar
+			(list 'setq var (list 'car tvar))
+			(for-each* (cdr vars) body)
+			(list 'setq tvar (list 'cdr tvar))))))))
+			     
+(put 'dolist 'lisp-indent-hook 1)
+
+(defmacro dolist (pair &rest body)
+  "(dolist (VAR LISTFORM) . BODY) $B$O(BVAR $B$K=g<!(B LISTFORM $B$NMWAG$rB+G{$7(B
+$B$F(B BODY $B$r<B9T$9$k(B"
+
+  (for-each* (list pair) (cons 'progn body)))
+
+;;;
+;;; defrule
+;;; 
+
+(defun its:make-standard-action (output next)
+  "OUTPUT $B$H(B NEXT $B$+$i$J$k(B standard-action $B$r:n$k!%(B"
+
+  (if (and (stringp output) (string-equal output ""))
+      (setq output nil))
+  (if (and (stringp next)   (string-equal next   ""))
+      (setq next nil))
+  (cond((null output)
+	(cond ((null next) nil)
+	      (t (list nil next))))
+       ((consp output)
+	;;; alternative output
+	(list (cons 0 output) next))
+       ((null next) output)
+       (t
+	(list output next))))
+
+(defun its:standard-actionp (action)
+  "ACITION $B$,(B standard-action $B$G$"$k$+$I$&$+$rH=Dj$9$k!%(B"
+  (or (stringp action)
+      (and (consp action)
+	   (or (stringp (car action))
+	       (and (consp (car action))
+		    (numberp (car (car action))))
+	       (null (car action)))
+	   (or (null (car (cdr action)))
+	       (stringp (car (cdr action)))))))
+
+(defvar its:make-terminal-state 'its:default-make-terminal-state 
+  "$B=*C<$N>uBV$G$NI=<($r:n@.$9$k4X?t$r;XDj$9$k(B. $B4X?t$O(B map input
+action state $B$r0z?t$H$7$F8F$P$l!$>uBVI=<($NJ8;zNs$rJV$9!%(B")
+
+(defun its:default-make-terminal-state (map input action state)
+  (cond(state state)
+       (t input)))
+
+(defun its:make-terminal-state-hangul (map input action state)
+  (cond((its:standard-actionp action) (action-output action))
+       (t nil)))
+
+(defvar its:make-non-terminal-state 'its:default-make-standard-non-terminal-state
+  "$BHs=*C<$N>uBV$G$NI=<($r:n@.$9$k4X?t$r;XDj$9$k!%4X?t$O(B map input $B$r(B
+$B0z?t$H$7$F8F$P$l!$>uBVI=<($NJ8;zNs$rJV$9(B" )
+
+(defun its:default-make-standard-non-terminal-state (map input)
+  " ****"
+  (concat
+   (map-state-string map)
+   (char-to-string (aref input (1- (length input))))))
+
+(defun its-defrule (input output &optional next state map) 
+
+  "INPUT $B$,F~NO$5$l$k$H(B OUTPUT $B$KJQ49$9$k!%(BNEXT $B$,(B nil $B$G$J$$$H$-$OJQ(B
+$B49$7$?8e$K(B NEXT $B$,F~NO$5$l$?$h$&$KJQ49$rB3$1$k!%(BINPUT$B$,F~NO$5$l$?;~E@(B
+$B$GJQ49$,3NDj$7$F$$$J$$;~$O(B STATE $B$r%U%'%s%9>e$KI=<($9$k!%JQ49$,3NDj$7(B
+$B$F$$$J$$;~$KI=<($9$kJ8;zNs$OJQ?t(B its:make-terminal-state $B$*$h$S(B $BJQ?t(B 
+its:make-non-terminal-state $B$K;X<($5$l$?4X?t$K$h$C$F@8@.$5$l$k!%JQ495,(B
+$BB'$O(B MAP $B$G;XDj$5$l$?JQ49I=$KEPO?$5$l$k!%(BMAP $B$,(B nil $B$N>l9g$O$b$C$H$b:G(B
+$B6a$K(B its-define-mode $B$5$l$?JQ49I=$KEPO?$5$l$k!%$J$*(B OUTPUT $B$,(B nil $B$N>l(B
+$B9g$O(B INPUT $B$KBP$9$kJQ495,B'$,:o=|$5$l$k!%(B"
+
+  (its-defrule* input
+    (its:make-standard-action output next) state 
+    (if (stringp map) map
+      its:*processing-map*)))
+
+(defmacro its-defrule-conditional (input &rest conds)
+  "(its-defrule-conditional INPUT ((COND1 OUTPUT1) ... (CONDn OUTPUTn)))$B$O(B 
+INPUT $B$,F~NO$5$l$?;~$K>r7o(B CONDi $B$r=g<!D4$Y!$@.N)$7$?;~$K$O(B OUTPUTi $B$r(B
+$B=PNO$9$k!%(B"
+  (list 'its-defrule* input (list 'quote (cons 'cond conds))))
+
+(defmacro its-defrule-conditional* (input state map &rest conds)
+  "(its-defrule-conditional INPUT STATE MAP ((COND1 OUTPUT1) ... (CONDn
+OUTPUTn)))$B$O(B INPUT $B$,F~NO$5$l$?;~$K>uBV(B STATE $B$rI=<($7!$>r7o(B CONDi $B$r(B
+$B=g<!D4$Y!$@.N)$7$?;~$K$O(B OUTPUTi $B$r=PNO$9$k!%(B"
+  (list 'its-defrule* input (list 'quote (cons 'cond conds)) state map))
+
+(defun its-defrule-select-mode-temporally (input name)
+  "INPUT $B$,F~NO$5$l$k$H(B temporally-mode $B$H$7$F(B NAME $B$,A*Br$5$l$k!%(B"
+
+  (its-defrule* input (list 'quote (list 'its:select-mode-temporally name))))
+
+(defun its-defrule* (input action &optional state map)
+  (its:resize (length input))
+  (setq map (cond((stringp map) (its:get-mode-map map))
+		 ((null map) its:*processing-map*)
+		 (t map)))
+  (its-defrule** 0 input action state map)
+  map)
+
+(defvar its:*defrule-verbose* t "nil$B$N>l9g(B, its-defrule $B$N7Y9p$rM^@)$9$k(B")
+
+(defun its-defrule** (i input action state map)
+  (cond((= (length input) i)		;93.6.4 by T.Shingu
+	(map-set-state
+	 map 
+	 (coerce-internal-string 
+	  (funcall its:make-terminal-state map input action state)))
+	(if (and its:*defrule-verbose* (map-action map))
+	    (if action
+		(notify "(its-defrule \"%s\" \"%s\" ) $B$r:FDj5A$7$^$7$?!%(B"
+			input action)
+	      (notify "(its-defrule \"%s\" \"%s\" )$B$r:o=|$7$^$7$?!%(B"
+		      input (map-action map))))
+	(if (and (null action) (map-terminalp map)) nil
+	  (progn (map-set-action map action)
+		 map)))
+       (t
+	(let((newmap
+	      (or (get-next-map-locally map (sref input i))
+		  (make-map (funcall its:make-non-terminal-state
+				     map
+				     (substring input 0 (+ i (char-bytes (sref input i)))))))))
+	  (set-next-map map (sref input i) 
+			(its-defrule** (+ i (char-bytes (sref input i))) input action state newmap)))
+	(if (and (null (map-action map))
+		 (map-terminalp map))
+	    nil
+	  map))))
+
+;;;
+;;; map: 
+;;;
+;;; <map-alist> ::= ( ( <char> . <map> ) ... )
+;;; <topmap> ::= ( nil <indicator> <map-alist>  <supers> )
+;;; <supers> ::= ( <topmap> .... )
+;;; <map>    ::= ( <state> <action>    <map-alist> )
+;;; <action> ::= <output> | ( <output> <next> ) ....
+
+(defun make-map (&optional state action alist supers)
+  (list state action alist supers))
+
+(defun map-topmap-p (map)
+  (null (map-state map)))
+
+(defun map-supers (map)
+  (nth 3 map))
+
+(defun map-set-supers (map val)
+  (setcar (nthcdr 3 map) val))
+
+(defun map-terminalp (map)
+  (null (map-alist map)))
+
+(defun map-state (map)
+  (nth 0 map))
+
+(defun map-state-string (map)
+  (coerce-string (map-state map)))
+
+(defun map-set-state (map val)
+  (setcar (nthcdr 0 map) val))
+
+(defun map-indicator (map)
+  (map-action map))
+(defun map-set-indicator (map indicator)
+  (map-set-action map indicator))
+
+(defun map-action (map)
+  (nth 1 map))
+(defun map-set-action (map val)
+  (setcar (nthcdr 1 map) val))
+
+(defun map-alist (map)
+  (nth 2 map))
+
+(defun map-set-alist (map alist)
+  (setcar (nthcdr 2 map) alist))
+
+(defun get-action (map)
+  (if (null map) nil
+    (let ((action (map-action map)))
+      (cond((its:standard-actionp action)
+	    action)
+	   ((symbolp action) (condition-case nil
+				 (funcall action)
+			       (error nil)))
+	   (t (condition-case nil
+		  (eval action)
+		(error nil)))))))
+
+(defun action-output (action)
+  (cond((stringp action) action)
+       (t (car action))))
+
+(defun action-next (action)
+  (cond((stringp action) nil)
+       (t (car (cdr action)))))
+
+(defun get-next-map (map ch)
+  (or (cdr (assq ch (map-alist map)))
+      (if (map-topmap-p map)
+	  (let ((supers (map-supers map))
+		(result nil))
+	    (while supers
+	      (setq result (get-next-map (car supers) ch))
+	      (if result
+		  (setq supers nil)
+		(setq supers (cdr supers))))
+	    result))))
+
+(defun get-next-map-locally (map ch)
+  (cdr (assq ch (map-alist map))))
+  
+(defun set-next-map (map ch val)
+  (let ((place (assq ch (map-alist map))))
+    (if place
+	(if val
+	    (setcdr place val)
+	  (map-set-alist map (delq place (map-alist map))))
+      (if val
+	  (map-set-alist map (cons (cons ch val)
+				   (map-alist map)))
+	val))))
+
+(defun its:simple-actionp (action)
+  (stringp action))
+
+(defun collect-simple-action (map)
+  (if (map-terminalp map)
+      (if (its:simple-actionp (map-action map))
+	  (list (map-action map))
+	nil)
+    (let ((alist (map-alist map))
+	  (result nil))
+      (while alist
+	(setq result 
+	      ;;; 92.9.19 by Y. Kawabe
+	      (append (collect-simple-action (cdr (car alist)))
+		      result))
+	(setq alist (cdr alist)))
+      result)))
+
+;;;----------------------------------------------------------------------
+;;;
+;;; Runtime translators
+;;;
+;;;----------------------------------------------------------------------
+      
+(defun its:simulate-input (i j  input map)
+  (while (<= i j)
+    (setq map (get-next-map map (sref input i))) ;92.12.26 by S.Tomura
+    (setq i (+ i (char-bytes (sref input i)))))	;92.12.26 by S.Tomura
+  map)
+
+;;; meta-flag $B$,(B on $B$N;~$K$O!"F~NO%3!<%I$K(B \200 $B$r(B or $B$7$?$b$N$,F~NO$5(B
+;;; $B$l$k!#$3$NItJ,$N;XE&$OEl9)Bg$NCf@n(B $B5.G7$5$s$K$h$k!#(B
+;;; pointted by nakagawa@titisa.is.titech.ac.jp Dec-11-89
+;;;
+;;; emacs $B$G$O(B $BJ8;z%3!<%I$O(B 0-127 $B$G07$&!#(B
+;;;
+
+(defvar its:*buff-s* (make-marker))
+(defvar its:*buff-e* (set-marker-type (make-marker) t))
+
+;;;    STATE     unread
+;;; |<-s   p->|<-    e ->|
+;;; s  : ch0  state0  map0
+;;;  +1: ch1  state1  map1
+;;; ....
+;;; (point):
+
+;;; longest matching region : [s m]
+;;; suspending region:        [m point]
+;;; unread region          :  [point e]
+
+
+(defvar its:*maxlevel* 10)
+(defvar its:*maps*   (make-vector its:*maxlevel* nil))
+(defvar its:*actions* (make-vector its:*maxlevel* nil))
+(defvar its:*inputs* (make-vector its:*maxlevel* 0))
+(defvar its:*level* 0)
+
+(defun its:resize (size)
+  (if (<= its:*maxlevel* size)
+      (setq its:*maxlevel* size
+	    its:*maps*    (make-vector size nil)
+	    its:*actions* (make-vector size nil)
+	    its:*inputs*  (make-vector size 0))))
+
+(defun its:reset-maps (&optional init)
+  (setq its:*level* 0)
+  (if init
+      (aset its:*maps* its:*level* init)))
+
+(defun its:current-map () (aref its:*maps* its:*level*))
+(defun its:previous-map () (aref its:*maps* (max 0 (1- its:*level*))))
+
+(defun its:level () its:*level*)
+
+(defun its:enter-newlevel (map ch output)
+  (setq its:*level* (1+ its:*level*))
+  (aset its:*maps* its:*level* map)
+  (aset its:*inputs* its:*level* ch)
+  (aset its:*actions* its:*level* output))
+
+(defvar its:*char-from-buff* nil)
+(defvar its:*interactive* t)
+
+(defun its:reset-input ()
+  (setq its:*char-from-buff* nil))
+
+(defun its:flush-input-before-point (from)
+  (save-excursion
+    (while (<= from its:*level*)
+      (its:insert-char (aref its:*inputs* from))
+      (setq from (1+ from)))))
+
+(defun its:peek-char ()
+  (if (= (point) its:*buff-e*)
+      (if its:*interactive*
+	  (setq unread-command-events (list (read-event)))
+	nil)
+    (following-char)))
+
+(defun its:read-char ()
+  (if (= (point) its:*buff-e*)
+      (progn 
+	(setq its:*char-from-buff* nil)
+	(if its:*interactive*
+	    (read-event)
+	  nil))
+    (let ((ch (following-char)))
+      (setq its:*char-from-buff* t)
+      (delete-char 1)
+      ch)))
+
+(defun its:push-char (ch)
+  (if its:*char-from-buff*
+      (save-excursion
+	(its:insert-char ch))
+    (if ch (setq unread-command-events (list ch)))))
+
+(defun its:insert-char (ch)
+  (insert ch))
+
+(defun its:ordinal-charp (ch)
+  (and (numberp ch) (<= ch 127)
+       (eq (lookup-key fence-mode-map (char-to-string ch)) 'fence-self-insert-command)))
+
+(defun its:delete-charp (ch)
+  (and (numberp ch) (<= ch 127)
+       (eq (lookup-key fence-mode-map (char-to-string ch)) 'fence-backward-delete-char)))
+    
+(defun fence-self-insert-command ()
+  (interactive)
+  (cond((or (not egg:*input-mode*)
+	    (null (get-next-map its:*current-map* last-command-event)))
+	(insert last-command-event))
+       (t
+	(insert last-command-event)
+	(its:translate-region (1- (point)) (point) t))))
+
+;;;
+;;; its: completing-read system
+;;;
+
+(defun its:all-completions (string alist &optional pred)
+  "A variation of all-completions.\n\
+Arguments are STRING, ALIST and optional PRED. ALIST must be no obarray."
+  (let ((tail alist) (allmatches nil))
+    (while tail
+      (let* ((elt (car tail))
+	     (eltstring (car elt)))
+	(setq tail (cdr tail))
+	(if (and (stringp eltstring)
+		 (<= (length string) (length eltstring))
+		 ;;;(not (= (aref eltstring 0) ? ))
+		 (string-equal string (substring eltstring 0 (length string))))
+	    (if (or (and pred
+			 (if (if (eq pred 'commandp)
+				 (commandp elt)
+			       (funcall pred elt))))
+		    (null pred))
+		(setq allmatches (cons elt allmatches))))))
+    (nreverse allmatches)))
+
+(defun its:temp-echo-area-contents (message)
+  (let ((inhibit-quit inhibit-quit)
+	(point-max (point-max)))
+    (goto-char point-max)
+    (insert message)
+    (goto-char point-max)
+    (setq inhibit-quit t)
+    (sit-for 2 nil)
+    ;;; 92.9.19 by Y. Kawabe, 92.10.30 by T.Saneto
+    (delete-region (point) (point-max))
+    (if quit-flag
+	(progn
+	  (setq quit-flag nil)
+	  (setq unread-command-events (list ?\^G))))))
+
+(defun car-string-lessp (item1 item2)
+  (string-lessp (car item1) (car item2)))
+
+(defun its:minibuffer-completion-help ()
+    "Display a list of possible completions of the current minibuffer contents."
+    (interactive)
+    (let ((completions))
+      (message "Making completion list...")
+      (setq completions (its:all-completions (buffer-string)
+					 minibuffer-completion-table
+					 minibuffer-completion-predicate))
+      (if (null completions)
+	  (progn
+	    ;;; 92.9.19 by Y. Kawabe
+	    (beep)
+	    (its:temp-echo-area-contents " [No completions]"))
+	(with-output-to-temp-buffer "*Completions*"
+	  (display-completion-list
+	   (sort completions 'car-string-lessp))))
+      nil))
+
+(defconst its:minibuffer-local-completion-map 
+  (copy-keymap minibuffer-local-completion-map))
+(define-key its:minibuffer-local-completion-map "?" 'its:minibuffer-completion-help)
+(define-key its:minibuffer-local-completion-map " " 'its:minibuffer-completion-help)
+
+(defconst its:minibuffer-local-must-match-map
+  (copy-keymap minibuffer-local-must-match-map))
+(define-key its:minibuffer-local-must-match-map "?" 'its:minibuffer-completion-help)
+(define-key its:minibuffer-local-must-match-map " " 'its:minibuffer-completion-help)
+
+(fset 'si:all-completions (symbol-function 'all-completions))
+(fset 'si:minibuffer-completion-help (symbol-function 'minibuffer-completion-help))
+
+(defun its:completing-read (prompt table &optional predicate require-match initial-input)
+  "See completing-read"
+  (let ((minibuffer-local-completion-map its:minibuffer-local-completion-map)
+	(minibuffer-local-must-match-map its:minibuffer-local-must-match-map)
+	(completion-auto-help nil))
+    (completing-read prompt table predicate t initial-input)))
+
+(defvar its:*completing-input-menu* '(menu "Which?" nil)) ;92.10.26 by T.Saneto
+
+(defun its:completing-input (map)
+  ;;; 
+  (let ((action (get-action map)))
+    (cond((and (null action)
+	       (= (length (map-alist map)) 1))
+	  (its:completing-input (cdr (nth 0 (map-alist map)))))
+	 (t
+	  (setcar (nthcdr 2 its:*completing-input-menu*)
+		  (map-alist map))
+	  (let ((values
+		 (menu:select-from-menu its:*completing-input-menu*
+					0 t)))
+	    (cond((consp values)
+		  ;;; get input char from menu
+		  )
+		 (t
+		  (its:completing-input map))))))))
+
+(defvar its:*make-menu-from-map-result* nil)
+
+(defun its:make-menu-from-map (map)
+  (let ((its:*make-menu-from-map-result* nil))
+    (its:make-menu-from-map* map "")
+    (list 'menu "Which?"  (reverse its:*make-menu-from-map-result*) )))
+
+(defun its:make-menu-from-map* (map string)
+  (let ((action (get-action map)))
+    (if action
+	(setq its:*make-menu-from-map-result*
+	      (cons (format "%s[%s]" string (action-output action))
+		    its:*make-menu-from-map-result*)))
+    (let ((alist (map-alist map)))
+      (while alist
+	(its:make-menu-from-map* 
+	 (cdr (car alist))
+	 (concat string (char-to-string (car (car alist)))))
+	(setq alist (cdr alist))))))
+
+(defvar its:*make-alist-from-map-result* nil)
+
+(defun its:make-alist-from-map (map &optional string)
+  (let ((its:*make-alist-from-map-result* nil))
+    (its:make-alist-from-map* map (or string ""))
+    (reverse its:*make-alist-from-map-result*)))
+
+(defun its:make-alist-from-map* (map string)
+  (let ((action (get-action map)))
+    (if action
+	(setq its:*make-alist-from-map-result*
+	      (cons (list string 
+			  (let ((action-output (action-output action)))
+			    (cond((and (consp action-output)
+				       (numberp (car action-output)))
+				  (format "%s..."
+				  (nth (car action-output) (cdr action-output))))
+				 ((stringp action-output)
+				  action-output)
+				 (t
+				  (format "%s" action-output)))))
+		    its:*make-alist-from-map-result*)))
+    (let ((alist (map-alist map)))
+      (while alist
+	(its:make-alist-from-map* 
+	 (cdr (car alist))
+	 (concat string (char-to-string (car (car alist)))))
+	(setq alist (cdr alist))))))
+
+(defvar its:*select-alternative-output-menu* '(menu "Which?" nil))
+
+(defun its:select-alternative-output (action-output)
+  ;;;; action-output : (pos item1 item2 item3 ....)
+  (let ((point (point))
+	(output (cdr action-output))
+	(ch 0))
+    (while (not (eq ch ?\^L))
+      (insert "<" (nth (car action-output)output) ">")
+      (setq ch (read-event))
+      (cond ((eq ch ?\^N)
+	     (setcar action-output
+		     (mod (1+ (car action-output)) (length output))))
+	    ((eq ch ?\^P)
+	     (setcar action-output
+		     (if (= 0 (car action-output))
+			 (1- (length output))
+		       (1- (car action-output)))))
+	    ((eq ch ?\^M)
+	     (setcar (nthcdr 2 its:*select-alternative-output-menu* )
+		     output)
+	     (let ((values 
+		    (menu:select-from-menu its:*select-alternative-output-menu*
+					   (car action-output)
+					   t)))
+	       (cond((consp values)
+		     (setcar action-output (nth 1 values))
+		     (setq ch ?\^L)))))
+	    ((eq ch ?\^L)
+	     )
+	    (t
+	     (beep)
+	     ))
+      (delete-region point (point)))
+    (if its:*insert-output-string*
+	(funcall its:*insert-output-string* (nth (car action-output) output))
+      (insert (nth (car action-output) output)))))
+      
+    
+
+;;; translate until 
+;;;      interactive --> not ordinal-charp
+;;; or
+;;;      not interactive  --> end of input
+
+(defvar its:*insert-output-string* nil)
+(defvar its:*display-status-string* nil)
+
+(defun its:translate-region (start end its:*interactive* &optional topmap)
+  (set-marker its:*buff-s* start)
+  (set-marker its:*buff-e* end)
+  (its:reset-input)
+  (goto-char its:*buff-s*)
+  (let ((topmap (or topmap its:*current-map*))
+	(map nil)
+	(ch nil)
+	(action nil)
+	(newmap nil)
+	(inhibit-quit t)
+	(its-quit-flag nil)
+	(echo-keystrokes 0))
+    (setq map topmap)
+    (its:reset-maps topmap)
+    (while (not its-quit-flag)
+      (setq ch (its:read-char))
+      (setq newmap (get-next-map map ch))
+      (setq action (get-action newmap))
+
+      (cond
+       ((and its:*interactive* (not its:*char-from-buff*) (numberp ch) (= ch ?\^@))
+	(delete-region its:*buff-s* (point))
+	(let ((i 1))
+	  (while (<= i its:*level*)
+	    (insert (aref its:*inputs* i))
+	    (setq i (1+ i))))
+	(let ((inputs (its:completing-read "ITS:>" 
+					   (its:make-alist-from-map topmap)
+					   nil
+					   t
+					   (buffer-substring its:*buff-s* (point)))))
+	  (delete-region its:*buff-s* (point))
+	  (save-excursion (insert inputs))
+	  (its:reset-maps)
+	  (setq map topmap)
+	  ))
+       ((or (null newmap)
+	    (and (map-terminalp newmap)
+		 (null action)))
+
+	(cond((and its:*interactive* (its:delete-charp ch))
+	      (delete-region its:*buff-s* (point))
+	      (cond((= its:*level* 0)
+		    (setq its-quit-flag t))
+		   ((= its:*level* 1)
+		    (its:insert-char (aref its:*inputs* 1))
+		    (setq its-quit-flag t))
+		   (t
+		    (its:flush-input-before-point (1+ its:*level*))
+		    (setq its:*level* (1- its:*level*))
+		    (setq map (its:current-map))
+		    (if (and its:*interactive*
+			     its:*display-status-string*)
+			(funcall its:*display-status-string* (map-state map))
+		      (insert (map-state map)))
+		    )))
+
+	     (t
+	      (let ((output nil))
+		(let ((i its:*level*) (newlevel (1+ its:*level*)))
+		  (aset its:*inputs* newlevel ch)
+		  (while (and (< 0 i) (null output))
+		    (if (and (aref its:*actions* i)
+			     (its:simulate-input (1+ i) newlevel its:*inputs* topmap))
+			(setq output i))
+		    (setq i (1- i)))
+		  (if (null output)
+		      (let ((i its:*level*))
+			(while (and (< 0 i) (null output))
+			  (if (aref its:*actions* i)
+			      (setq output i))
+			  (setq i (1- i)))))
+
+		  (cond(output 
+			(delete-region its:*buff-s* (point))
+			(cond((its:standard-actionp (aref its:*actions* output))
+			      (let ((action-output (action-output (aref its:*actions* output))))
+				(if (and (not its:*interactive*)
+					 (consp action-output))
+				    (setq action-output (nth (car action-output) (cdr action-output))))
+				(cond((stringp action-output)
+				      (if (and its:*interactive* 
+					       its:*insert-output-string*)
+					  (funcall its:*insert-output-string* action-output)
+					(insert action-output)))
+				     ((consp action-output)
+				      (its:select-alternative-output action-output)
+				      )
+				     (t
+				      (beep) (beep)
+				      )))
+			      (set-marker its:*buff-s* (point))
+			      (its:push-char ch)
+			      (its:flush-input-before-point (1+ output))
+			      (if (action-next (aref its:*actions* output))
+				  (save-excursion
+				    (insert (action-next (aref its:*actions* output)))))
+			      )
+			     ((symbolp (aref its:*actions* output))
+			      (its:push-char ch)
+			      (funcall (aref its:*actions* output))
+			      (its:reset-maps its:*current-map*)
+			      (setq topmap its:*current-map*)
+			      (set-marker its:*buff-s* (point)))
+			     (t 
+			      (its:push-char ch)
+					;92.10.26 by T.Saneto
+			      (eval (aref its:*actions* output))
+			      (its:reset-maps its:*current-map*)
+			      (setq topmap its:*current-map*)
+			      (set-marker its:*buff-s* (point))
+			      ))
+			)
+		       ((= 0 its:*level*)
+			(cond ((or (its:ordinal-charp ch)
+				   its:*char-from-buff*)
+			       (its:insert-char ch))
+			      (t (setq its-quit-flag t))))
+
+		       ((< 0 its:*level*)
+			(delete-region its:*buff-s* (point))
+			(its:insert-char (aref its:*inputs* 1))
+			(set-marker its:*buff-s* (point))
+			(its:push-char ch)
+			(its:flush-input-before-point 2)))))
+		    
+	      (cond((null ch)
+		    (setq its-quit-flag t))
+		   ((not its-quit-flag)
+		    (its:reset-maps)
+		    (set-marker its:*buff-s* (point))
+		    (setq map topmap))))))
+	       
+       ((map-terminalp newmap)
+	(its:enter-newlevel (setq map newmap) ch action)
+	(delete-region its:*buff-s* (point))
+	(let ((output nil) (m nil) (i (1- its:*level*)))
+	  (while (and (< 0 i) (null output))
+	    (if (and (aref its:*actions* i)
+		     (setq m (its:simulate-input (1+ i) its:*level* its:*inputs* topmap))
+		     (not (map-terminalp m)))
+		(setq output i))
+	    (setq i (1- i)))
+
+	  (cond((null output)
+		(cond ((its:standard-actionp action)
+		       (let ((action-output (action-output action)))
+			 (if (and (not its:*interactive*)
+				  (consp action-output))
+			     (setq action-output (nth (car action-output) (cdr action-output))))
+			 (cond((stringp action-output)
+			       (if (and its:*interactive* 
+					its:*insert-output-string*)
+				   (funcall its:*insert-output-string* action-output)
+				 (insert action-output)))
+			      ((consp action-output)
+			       (its:select-alternative-output action-output)
+			       )
+			      (t
+			       (beep) (beep)
+			       )))
+		       (cond((null (action-next action))
+			     (cond ((and (= (point) its:*buff-e*)
+					 its:*interactive*
+					 (its:delete-charp (its:peek-char)))
+				    nil)
+				   (t
+				    (set-marker its:*buff-s* (point))
+				    (its:reset-maps)
+				    (setq map topmap)
+				    )))
+			    (t
+			     (save-excursion (insert (action-next action)))
+			     (set-marker its:*buff-s* (point))
+			     (its:reset-maps)
+			     (setq map topmap))))
+		      ((symbolp action)
+		       (funcall action)
+		       (its:reset-maps its:*current-map*)
+		       (setq topmap its:*current-map*)
+		       (setq map topmap)
+		       (set-marker its:*buff-s* (point)))
+		      (t 
+		       (eval action)
+		       (its:reset-maps its:*current-map*)
+		       (setq topmap its:*current-map*)
+		       (setq map topmap)
+		       (set-marker its:*buff-s* (point)))))
+	       (t
+		(if (and its:*interactive* 
+			 its:*display-status-string*)
+		    (funcall its:*display-status-string* (map-state map))
+		  (insert (map-state map)))))))
+
+       ((null action)
+	(delete-region its:*buff-s* (point))
+	(if (and its:*interactive* 
+		 its:*display-status-string*)
+	    (funcall its:*display-status-string* (map-state newmap))
+	  (insert (map-state newmap)))
+	(its:enter-newlevel (setq map newmap)
+			    ch action))
+
+       (t
+	(its:enter-newlevel (setq map newmap) ch action)
+	(delete-region its:*buff-s* (point))
+	(if (and its:*interactive* 
+		 its:*display-status-string*)
+	    (funcall its:*display-status-string* (map-state map))
+	  (insert (map-state map))))))
+
+    (set-marker its:*buff-s* nil)
+    (set-marker its:*buff-e* nil)
+    (if (and its:*interactive* ch) (setq unread-command-events (list ch)))
+    ))
+
+;;;----------------------------------------------------------------------
+;;; 
+;;; ITS-map dump routine:
+;;;
+;;;----------------------------------------------------------------------
+
+;;;;;
+;;;;; User entry: dump-its-mode-map
+;;;;;
+
+;; 92.6.26 by K.Handa
+(defun dump-its-mode-map (name filename)
+  "Obsolete."
+  (interactive)
+  (message "This function is obsolete in the current version of Mule."))
+;;;
+;;; EGG mode variables
+;;;
+
+(defvar egg:*mode-on* nil "T if egg mode is on.")
+(make-variable-buffer-local 'egg:*mode-on*)
+(set-default 'egg:*mode-on* nil)
+
+(defvar egg:*input-mode* t "T if egg map is active.")
+(make-variable-buffer-local 'egg:*input-mode*)
+(set-default 'egg:*input-mode* t)
+
+(defvar egg:*in-fence-mode* nil "T if in fence mode.")
+(make-variable-buffer-local 'egg:*in-fence-mode*)
+(set-default 'egg:*in-fence-mode* nil)
+
+;;(load-library "its-dump/roma-kana")         ;;;(define-its-mode "roma-kana"        " a$B$"(B")
+;;(load-library "its-dump/roma-kata")         ;;;(define-its-mode "roma-kata"        " a$B%"(B")
+;;(load-library "its-dump/downcase")          ;;;(define-its-mode "downcase"         " a a")
+;;(load-library "its-dump/upcase")            ;;;(define-its-mode "upcase"           " a A")
+;;(load-library "its-dump/zenkaku-downcase")  ;;;(define-its-mode "zenkaku-downcase" " a$B#a(B")
+;;(load-library "its-dump/zenkaku-upcase")    ;;;(define-its-mode "zenkaku-upcase"   " a$B#A(B")
+;; 92.3.13 by K.Handa
+;; (load "its-hira")
+;; (load-library "its-kata")
+;; (load-library "its-hankaku")
+;; (load-library "its-zenkaku")
+
+
+(defvar its:*current-map* nil)
+(make-variable-buffer-local 'its:*current-map*)
+;; 92.3.13 by K.Handa
+;; moved to each language specific setup files (japanese.el, ...)
+;; (setq-default its:*current-map* (its:get-mode-map "roma-kana"))
+
+(defvar its:*previous-map* nil)
+(make-variable-buffer-local 'its:*previous-map*)
+(setq-default its:*previous-map* nil)
+
+;;;----------------------------------------------------------------------
+;;;
+;;; Mode line control functions;
+;;;
+;;;----------------------------------------------------------------------
+
+(defconst mode-line-egg-mode "--")
+(make-variable-buffer-local 'mode-line-egg-mode)
+
+(defvar   mode-line-egg-mode-in-minibuffer "--" "global variable")
+
+(defun egg:find-symbol-in-tree (item tree)
+  (if (consp tree)
+      (or (egg:find-symbol-in-tree item (car tree))
+	  (egg:find-symbol-in-tree item (cdr tree)))
+    (equal item tree)))
+
+;;;
+;;; nemacs Ver. 3.0 $B$G$O(B Fselect_window $B$,JQ99$K$J$j!"(Bminibuffer-window
+;;; $BB>$N(B window $B$H$N4V$G=PF~$j$,$"$k$H!"(Bmode-line $B$N99?7$r9T$J$$!"JQ?t(B 
+;;; minibuffer-window-selected $B$NCM$,99?7$5$l$k(B
+;;;
+
+;;; nemacs Ver. 4 $B$G$O(B Fselect_window $B$,JQ99$K$J$j!$(Bselect-window-hook 
+;;; $B$,Dj5A$5$l$?!%$3$l$K$H$b$J$$=>Mh!$:FDj5A$7$F$$$?(B select-window,
+;;; other-window, keyborad-quit, abort-recursive-edit, exit-minibuffer 
+;;; $B$r:o=|$7$?!%(B
+
+(defconst display-minibuffer-mode-in-minibuffer t)
+
+(defvar minibuffer-window-selected nil)
+
+(defun egg:select-window-hook (old new)
+  (if (and (eq old (minibuffer-window))
+           (not (eq new (minibuffer-window))))
+      (save-excursion
+	(set-buffer (window-buffer (minibuffer-window)))
+	(setq minibuffer-preprompt nil
+	      egg:*mode-on* (default-value 'egg:*mode-on*)
+	      egg:*input-mode* (default-value 'egg:*input-mode*)
+	      egg:*in-fence-mode* (default-value 'egg:*in-fence-mode*))))
+  (if (eq new (minibuffer-window))
+      (setq minibuffer-window-selected t)
+    (setq minibuffer-window-selected nil)))
+
+(setq select-window-hook 'egg:select-window-hook)
+
+;;;
+;;;
+;;;
+
+(defvar its:*reset-mode-line-format* nil)
+
+(if its:*reset-mode-line-format*
+    (setq-default mode-line-format
+		  (cdr mode-line-format)))
+
+(if (not (egg:find-symbol-in-tree 'mode-line-egg-mode mode-line-format))
+    (setq-default 
+     mode-line-format
+     (cons (list 'mc-flag
+		 (list 'display-minibuffer-mode-in-minibuffer
+		       ;;; minibuffer mode in minibuffer
+		       (list 
+			(list 'its:*previous-map* "<" "[")
+			'mode-line-egg-mode
+			(list 'its:*previous-map* ">" "]")
+			)
+		       ;;;; minibuffer mode in mode line
+		       (list 
+			(list 'minibuffer-window-selected
+			      (list 'display-minibuffer-mode
+				    "m"
+				    " ")
+			      " ")
+			(list 'its:*previous-map* "<" "[")
+			(list 'minibuffer-window-selected
+			      (list 'display-minibuffer-mode
+				    'mode-line-egg-mode-in-minibuffer
+				    'mode-line-egg-mode)
+			      'mode-line-egg-mode)
+			(list 'its:*previous-map* ">" "]")
+			)))
+	   mode-line-format)))
+
+;;;
+;;; minibuffer $B$G$N%b!<%II=<($r$9$k$?$a$K(B nemacs 4 $B$GDj5A$5$l$?(B 
+;;; minibuffer-preprompt $B$rMxMQ$9$k!%(B
+;;;
+
+(defconst egg:minibuffer-preprompt '("[" nil "]"))
+
+(defun mode-line-egg-mode-update (str)
+  (if (eq (current-buffer) (window-buffer (minibuffer-window)))
+      (if display-minibuffer-mode-in-minibuffer
+	  (progn
+	    (aset (nth 0 egg:minibuffer-preprompt) 0
+		  (if its:*previous-map* ?\< ?\[))
+	    (setcar (nthcdr 1 egg:minibuffer-preprompt)
+		    str)
+	    (aset (nth 2 egg:minibuffer-preprompt) 0
+		  (if its:*previous-map* ?\> ?\]))
+	    (setq minibuffer-preprompt
+		  egg:minibuffer-preprompt))
+	(setq display-minibuffer-mode t
+	      mode-line-egg-mode-in-minibuffer str))
+    (setq display-minibuffer-mode nil
+	  mode-line-egg-mode str))
+  (redraw-modeline t))
+
+(mode-line-egg-mode-update mode-line-egg-mode)
+
+;;;
+;;; egg mode line display
+;;;
+
+(defvar alphabet-mode-indicator "aA")
+(defvar transparent-mode-indicator "--")
+
+(defun egg:mode-line-display ()
+  (mode-line-egg-mode-update 
+   (cond((and egg:*in-fence-mode* (not egg:*input-mode*))
+	 alphabet-mode-indicator)
+	((and egg:*mode-on* egg:*input-mode*)
+	 (map-indicator its:*current-map*))
+	(t transparent-mode-indicator))))
+
+(defun egg:toggle-egg-mode-on-off ()
+  (interactive)
+  (setq egg:*mode-on* (not egg:*mode-on*))
+  (egg:mode-line-display))
+
+(defun its:select-mode (name)
+  (interactive (list (completing-read "ITS mode: " its:*mode-alist*)))
+  (if (its:get-mode-map name)
+      (progn
+	(setq its:*current-map* (its:get-mode-map name))
+	(egg:mode-line-display))
+    (beep))
+  )
+
+(defvar its:*select-mode-menu* '(menu "Mode:" nil))
+
+(defun its:select-mode-from-menu ()
+  (interactive)
+  (setcar (nthcdr 2 its:*select-mode-menu*) its:*mode-alist*)
+  (setq its:*current-map* (menu:select-from-menu its:*select-mode-menu*))
+  (egg:mode-line-display))
+
+(defvar its:*standard-modes* nil
+  "List of standard mode-map of EGG."
+  ;; 92.3.13 by K.Handa
+  ;; moved to each language specific setup files (japanese.el, ...)
+  ;; (list (its:get-mode-map "roma-kana")
+  ;;  (its:get-mode-map "roma-kata")
+  ;;  (its:get-mode-map "downcase")
+  ;;  (its:get-mode-map "upcase")
+  ;;  (its:get-mode-map "zenkaku-downcase")
+  ;;  (its:get-mode-map "zenkaku-upcase"))
+  )
+
+(defun its:find (map list)
+  (let ((n 0))
+    (while (and list (not (eq map (car list))))
+      (setq list (cdr list)
+	    n    (1+ n)))
+    (if list n nil)))
+
+(defun its:next-mode ()
+  (interactive)
+  (let ((pos (its:find its:*current-map* its:*standard-modes*)))
+    (setq its:*current-map*
+	  (nth (% (1+ pos) (length its:*standard-modes*))
+	       its:*standard-modes*))
+    (egg:mode-line-display)))
+
+(defun its:previous-mode ()
+  (interactive)
+  (let ((pos (its:find its:*current-map* its:*standard-modes*)))
+    (setq its:*current-map*
+	  (nth (1- (if (= pos 0) (length its:*standard-modes*) pos))
+	       its:*standard-modes*))
+    (egg:mode-line-display)))
+
+(defun its:select-hiragana () (interactive) (its:select-mode "roma-kana"))
+(defun its:select-katakana () (interactive) (its:select-mode "roma-kata"))
+(defun its:select-downcase () (interactive) (its:select-mode "downcase"))
+(defun its:select-upcase   () (interactive) (its:select-mode "upcase"))
+(defun its:select-zenkaku-downcase () (interactive) (its:select-mode "zenkaku-downcase"))
+(defun its:select-zenkaku-upcase   () (interactive) (its:select-mode "zenkaku-upcase"))
+
+(defun its:select-mode-temporally (name)
+  (interactive (list (completing-read "ITS mode: " its:*mode-alist*)))
+  (let ((map (its:get-mode-map name)))
+    (if map
+	(progn
+	  (if (null its:*previous-map*)
+	      (setq its:*previous-map* its:*current-map*))
+	  (setq its:*current-map*  map)
+	  (egg:mode-line-display))
+      (beep))))
+
+(defun its:select-previous-mode ()
+  (interactive)
+  (if (null its:*previous-map*)
+      (beep)
+    (setq its:*current-map* its:*previous-map*
+	  its:*previous-map* nil)
+    (egg:mode-line-display)))
+	  
+
+(defun toggle-egg-mode ()
+  (interactive)
+  (if mc-flag 
+      (if egg:*mode-on* (fence-toggle-egg-mode)
+	(progn
+	  (setq egg:*mode-on* t)
+	  (egg:mode-line-display)))))
+
+(defun fence-toggle-egg-mode ()
+  (interactive)
+  (if its:*current-map*
+      (progn
+	(setq egg:*input-mode* (not egg:*input-mode*))
+	(egg:mode-line-display))
+    (beep)))
+
+;;;
+;;; Changes on Global map 
+;;;
+
+(defvar si:*global-map* (copy-keymap global-map))
+
+(substitute-key-definition 'self-insert-command
+			   'egg-self-insert-command
+			   global-map)
+
+;;;
+;;; Currently entries C-\ and C-^ at global-map are undefined.
+;;;
+
+(define-key global-map "\C-\\" 'toggle-egg-mode)
+(define-key global-map "\C-x " 'henkan-region)
+
+;; 92.3.16 by K.Handa
+;; global-map => mule-keymap
+(define-key mule-keymap "m" 'its:select-mode-from-menu)
+(define-key mule-keymap ">" 'its:next-mode)
+(define-key mule-keymap "<" 'its:previous-mode)
+(define-key mule-keymap "h" 'its:select-hiragana)
+(define-key mule-keymap "k" 'its:select-katakana)
+(define-key mule-keymap "q" 'its:select-downcase)
+(define-key mule-keymap "Q" 'its:select-upcase)
+(define-key mule-keymap "z" 'its:select-zenkaku-downcase)
+(define-key mule-keymap "Z" 'its:select-zenkaku-upcase)
+
+;;;
+;;; auto fill controll
+;;;
+
+(defun egg:do-auto-fill ()
+  (if (and auto-fill-function (not buffer-read-only)
+	   (> (current-column) fill-column))
+      (let ((ocolumn (current-column)))
+	(funcall auto-fill-function)
+	(while (and (< fill-column (current-column))
+		    (< (current-column) ocolumn))
+  	  (setq ocolumn (current-column))
+	  (funcall auto-fill-function)))))
+
+;;;----------------------------------------------------------------------
+;;;
+;;;  Egg fence mode
+;;;
+;;;----------------------------------------------------------------------
+
+(defconst egg:*fence-open*   "|" "*$B%U%'%s%9$N;OE@$r<($9J8;zNs(B")
+(defconst egg:*fence-close*  "|" "*$B%U%'%s%9$N=*E@$r<($9J8;zNs(B")
+(defconst egg:*fence-face* nil  "*$B%U%'%s%9I=<($KMQ$$$k(B face $B$^$?$O(B nil")
+(make-variable-buffer-local
+ (defvar egg:*fence-overlay* nil "$B%U%'%s%9I=<(MQ(B overlay"))
+
+(defvar egg:*face-alist*
+  '(("nil" . nil)
+    ("highlight" . highlight) ("modeline" . modeline)
+    ("inverse" . modeline) ("underline" . underline) ("bold" . bold)
+    ("region" . region)))
+
+(defun set-egg-fence-mode-format (open close &optional face)
+  "fence mode $B$NI=<(J}K!$r@_Dj$9$k!#(BOPEN $B$O%U%'%s%9$N;OE@$r<($9J8;zNs$^$?$O(B nil$B!#(B\n\
+CLOSE$B$O%U%'%s%9$N=*E@$r<($9J8;zNs$^$?$O(B nil$B!#(B\n\
+$BBh(B3$B0z?t(B FACE $B$,;XDj$5$l$F(B nil $B$G$J$1$l$P!"%U%'%s%96h4V$NI=<($K$=$l$r;H$&!#(B"
+  (interactive (list (read-string "$B%U%'%s%93+;OJ8;zNs(B: ")
+		     (read-string "$B%U%'%s%9=*N;J8;zNs(B: ")
+		     (cdr (assoc (completing-read "$B%U%'%s%9I=<(B0@-(B: " egg:*face-alist*)
+				 egg:*face-alist*))))
+
+  (if (and (or (stringp open) (null open))
+	   (or (stringp close) (null close))
+	   (or (null face) (memq face (face-list))))
+      (progn
+	(setq egg:*fence-open* (or open "")
+	      egg:*fence-close* (or close "")
+	      egg:*fence-face* face)
+	(if (overlayp egg:*fence-overlay*)
+	    (overlay-put egg:*fence-overlay* 'face egg:*fence-face*))
+	t)
+    (error "Wrong type of argument: %s %s %s" open close face)))
+
+;(defconst egg:*region-start* (make-marker))
+;(defconst egg:*region-end*   (set-marker-type (make-marker) t))
+(defvar egg:*region-start* nil)
+(defvar egg:*region-end*   nil)
+(make-variable-buffer-local 'egg:*region-start*)
+(make-variable-buffer-local 'egg:*region-end*)
+(set-default 'egg:*region-start* nil)
+(set-default 'egg:*region-end* nil)
+(defvar egg:*global-map-backup* nil)
+(defvar egg:*local-map-backup*  nil)
+
+
+;;; Moved to kanji.el
+;;; (defvar self-insert-after-hook nil
+;;;  "Hook to run when extended self insertion command exits. Should take
+;;; two arguments START and END correspoding to character position.")
+
+(defvar egg:*self-insert-non-undo-count* 0
+  "counter to hold repetition of egg-self-insert-command.")
+
+(defun egg-self-insert-command (arg)
+  (interactive "p")
+  (if (and (not buffer-read-only)
+	   mc-flag
+	   egg:*mode-on* egg:*input-mode* 
+	   (not egg:*in-fence-mode*) ;;; inhibit recursive fence mode
+	   (not (= last-command-event  ?  )))
+      (egg:enter-fence-mode-and-self-insert)
+    (progn
+      ;; treat continuous 20 self insert as a single undo chunk.
+      ;; `20' is a magic number copied from keyboard.c
+      (if (or				;92.12.20 by T.Enami
+	   (not (eq last-command 'egg-self-insert-command))
+	   (>= egg:*self-insert-non-undo-count* 20))
+	  (setq egg:*self-insert-non-undo-count* 1)
+	(cancel-undo-boundary)
+	(setq egg:*self-insert-non-undo-count*
+	      (1+ egg:*self-insert-non-undo-count*)))
+      (self-insert-command arg)
+      (if egg-insert-after-hook
+	  (run-hooks 'egg-insert-after-hook))
+      (if self-insert-after-hook
+	  (if (<= 1 arg)
+	      (funcall self-insert-after-hook
+		       (- (point) arg) (point)))
+	(if (= last-command-event ? ) (egg:do-auto-fill))))))
+
+;;
+;; $BA03NDjJQ49=hM}4X?t(B 
+;;
+(defvar egg:*fence-open-backup* nil)
+(defvar egg:*fence-close-backup* nil)
+(defvar egg:*fence-face-backup* nil)
+
+(defconst egg:*fence-open-in-cont* "+" "*$BA03NDj>uBV$G$N(B *fence-open*")
+(defconst egg:*fence-close-in-cont* t "*$BA03NDj>uBV$G$N(B *fence-close*")
+(defconst egg:*fence-face-in-cont* t
+  "*$BA03NDj>uBV$G$N(B *fence-face*")
+
+(defun set-egg-fence-mode-format-in-cont (open close face)
+  "$BA03NDj>uBV$G$N(B fence mode $B$NI=<(J}K!$r@_Dj$9$k!#(BOPEN $B$O%U%'%s%9$N;OE@$r<($9J8(B
+$B;zNs!"(Bt $B$^$?$O(B nil$B!#(B\n\
+CLOSE$B$O%U%'%s%9$N=*E@$r<($9J8;zNs!"(Bt $B$^$?$O(B nil$B!#(B\n\
+FACE $B$O(B nil $B$G$J$1$l$P!"%U%'%s%96h4V$NI=<($K$=$l$r;H$&!#(B\n\
+$B$=$l$>$l$NCM$,(B t $B$N>l9g!"DL>o$N(B egg:*fence-open* $BEy$NCM$r0z$-7Q$0!#(B"
+  (interactive (list (read-string "$B%U%'%s%93+;OJ8;zNs(B: ")
+                     (read-string "$B%U%'%s%9=*N;J8;zNs(B: ")
+                     (cdr (assoc (completing-read "$B%U%'%s%9I=<(B0@-(B: " egg:*face
+-alist*)
+                                 egg:*face-alist*))))
+
+  (if (and (or (stringp open) (eq open t) (null open))
+           (or (stringp close) (eq close t) (null close))
+           (or (null face) (eq face t) (memq face (face-list))))
+      (progn
+        (setq egg:*fence-open-in-cont* (or open "")
+              egg:*fence-close-in-cont* (or close "")
+              egg:*fence-face-in-cont* face)
+        (if (overlayp egg:*fence-overlay*)
+            (overlay-put egg:*fence-overlay* 'face egg:*fence-face*))
+        t)
+    (error "Wrong type of argument: %s %s %s" open close face)))
+
+(defvar *in-cont-flag* nil
+ "$BD>A0$KJQ49$7$?D>8e$NF~NO$+$I$&$+$r<($9!#(B")
+
+(defvar *in-cont-backup-flag* nil)
+
+(defun egg:check-fence-in-cont ()
+  (if *in-cont-flag*
+      (progn
+	(setq *in-cont-backup-flag* t)
+	(setq egg:*fence-open-backup* egg:*fence-open*)
+	(setq egg:*fence-close-backup* egg:*fence-close*)
+	(setq egg:*fence-face-backup* egg:*fence-face*)
+        (or (eq egg:*fence-open-in-cont* t)
+            (setq egg:*fence-open* egg:*fence-open-in-cont*))
+        (or (eq egg:*fence-close-in-cont* t)
+            (setq egg:*fence-close* egg:*fence-close-in-cont*))
+        (or (eq egg:*fence-face-in-cont* t)
+            (setq egg:*fence-face* egg:*fence-face-in-cont*)))))
+
+(defun egg:restore-fence-in-cont ()
+  "Restore egg:*fence-open* and egg:*fence-close*"
+  (if *in-cont-backup-flag* 
+      (progn
+	(setq egg:*fence-open* egg:*fence-open-backup*)
+	(setq egg:*fence-close* egg:*fence-close-backup*)
+	(setq egg:*fence-face* egg:*fence-face-backup*)))
+  (setq *in-cont-backup-flag* nil)
+  )
+
+(defun egg:enter-fence-mode-and-self-insert () 
+  (setq *in-cont-flag*
+	(memq last-command '(henkan-kakutei henkan-kakutei-and-self-insert)))
+  (enter-fence-mode)
+  (setq unread-command-events (list last-command-event)))
+
+(defun egg:fence-face-on ()
+  (if egg:*fence-face*
+      (progn
+	(if (overlayp egg:*fence-overlay*)
+	    nil
+	  (setq egg:*fence-overlay* (make-overlay 1 1 nil t))
+	  (if egg:*fence-face* (overlay-put egg:*fence-overlay* 'face egg:*fence-face*)))
+	(move-overlay egg:*fence-overlay* egg:*region-start* egg:*region-end* ) )))
+
+(defun egg:fence-face-off ()
+  (and egg:*fence-face*
+       (overlayp egg:*fence-overlay*)
+       (delete-overlay egg:*fence-overlay*) ))
+
+(defun enter-fence-mode ()
+  ;; XEmacs change:
+  (buffer-disable-undo (current-buffer))
+  (setq egg:*in-fence-mode* t)
+  (egg:mode-line-display)
+  ;;;(setq egg:*global-map-backup* (current-global-map))
+  (setq egg:*local-map-backup*  (current-local-map))
+  ;;;(use-global-map fence-mode-map)
+  ;;;(use-local-map nil)
+  (use-local-map fence-mode-map)
+  (egg:check-fence-in-cont)            ; for Wnn6
+  (insert egg:*fence-open*)
+  (or (markerp egg:*region-start*) (setq egg:*region-start* (make-marker)))
+  (set-marker egg:*region-start* (point))
+  (insert egg:*fence-close*)
+  (or (markerp egg:*region-end*) (setq egg:*region-end* (set-marker-type (make-marker) t)))
+  (set-marker egg:*region-end* egg:*region-start*)
+  (egg:fence-face-on)
+  (goto-char egg:*region-start*)
+  )
+
+(defun henkan-fence-region-or-single-space ()
+  (interactive)
+  (if egg:*input-mode*   
+      (henkan-fence-region)
+    (insert ? )))
+
+(defvar egg:*henkan-fence-mode* nil)
+
+(defun henkan-fence-region ()
+  (interactive)
+  (setq egg:*henkan-fence-mode* t)
+  (egg:fence-face-off)
+  (henkan-region-internal egg:*region-start* egg:*region-end* ))
+
+(defun fence-katakana  ()
+  (interactive)
+  (katakana-region egg:*region-start* egg:*region-end* ))
+
+(defun fence-hiragana  ()
+  (interactive)
+  (hiragana-region egg:*region-start* egg:*region-end*))
+
+(defun fence-hankaku  ()
+  (interactive)
+  (hankaku-region egg:*region-start* egg:*region-end*))
+
+(defun fence-zenkaku  ()
+  (interactive)
+  (zenkaku-region egg:*region-start* egg:*region-end*))
+
+(defun fence-backward-char ()
+  (interactive)
+  (if (< egg:*region-start* (point))
+      (backward-char)
+    (beep)))
+
+(defun fence-forward-char ()
+  (interactive)
+  (if (< (point) egg:*region-end*)
+      (forward-char)
+    (beep)))
+
+(defun fence-beginning-of-line ()
+  (interactive)
+  (goto-char egg:*region-start*))
+
+(defun fence-end-of-line ()
+  (interactive)
+  (goto-char egg:*region-end*))
+
+(defun fence-transpose-chars (arg)
+  (interactive "P")
+  (if (and (< egg:*region-start* (point))
+	   (< (point) egg:*region-end*))
+      (transpose-chars arg)
+    (beep)))
+
+(defun egg:exit-if-empty-region ()
+  (if (= egg:*region-start* egg:*region-end*)
+      (fence-exit-mode)))
+
+(defun fence-delete-char ()
+  (interactive)
+  (if (< (point) egg:*region-end*)
+      (progn
+	(delete-char 1)
+	(egg:exit-if-empty-region))
+    (beep)))
+
+(defun fence-backward-delete-char ()
+  (interactive)
+  (if (< egg:*region-start* (point))
+      (progn
+	(delete-char -1)
+	(egg:exit-if-empty-region))
+    (beep)))
+
+(defun fence-kill-line ()
+  (interactive)
+  (delete-region (point) egg:*region-end*)
+  (egg:exit-if-empty-region))
+
+(defun fence-exit-mode ()
+  (interactive)
+  (delete-region (- egg:*region-start* (length egg:*fence-open*)) egg:*region-start*)
+  (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*fence-close*)))
+  (egg:fence-face-off)
+  (if its:*previous-map*
+      (setq its:*current-map* its:*previous-map*
+	    its:*previous-map* nil))
+  (egg:quit-egg-mode))
+
+(defvar egg-insert-after-hook nil)
+(make-variable-buffer-local 'egg-insert-after-hook)
+
+(defvar egg-exit-hook nil
+  "Hook to run when egg exits. Should take two arguments START and END
+correspoding to character position.")
+
+(defun egg:quit-egg-mode ()
+  ;;;(use-global-map egg:*global-map-backup*)
+  (use-local-map egg:*local-map-backup*)
+  (setq egg:*in-fence-mode* nil)
+  (egg:mode-line-display)
+  (if overwrite-mode
+      (let ((str (buffer-substring egg:*region-end* egg:*region-start*)))
+	(delete-text-in-column nil (+ (current-column) (string-width str)))))
+  (egg:restore-fence-in-cont)               ; for Wnn6
+  (setq egg:*henkan-fence-mode* nil)
+  (if self-insert-after-hook
+      (funcall self-insert-after-hook egg:*region-start* egg:*region-end*)
+    (if egg-exit-hook
+	(funcall egg-exit-hook egg:*region-start* egg:*region-end*)
+      (if (not (= egg:*region-start* egg:*region-end*))
+	  (egg:do-auto-fill))))
+  (set-marker egg:*region-start* nil)
+  (set-marker egg:*region-end*   nil)
+  ;; XEmacs change:
+  (buffer-enable-undo (current-buffer))
+  (if egg-insert-after-hook
+      (run-hooks 'egg-insert-after-hook))
+  )
+
+(defun fence-cancel-input ()
+  (interactive)
+  (delete-region egg:*region-start* egg:*region-end*)
+  (fence-exit-mode))
+
+(defun fence-mode-help-command ()
+  "Display documentation for fence-mode."
+  (interactive)
+  (let ((buf "*Help*"))
+    (if (eq (get-buffer buf) (current-buffer))
+	(henkan-quit)
+      (with-output-to-temp-buffer buf
+	(princ (substitute-command-keys "The keys that are defined for the fence mode here are:\\{fence-mode-map}"))
+	(print-help-return-message)))))
+
+(defvar fence-mode-map (make-keymap))
+
+(substitute-key-definition 'self-insert-command
+			   'fence-self-insert-command
+			   fence-mode-map global-map)
+
+(define-key fence-mode-map "\eh"  'fence-hiragana)
+(define-key fence-mode-map "\ek"  'fence-katakana)
+(define-key fence-mode-map "\e<"  'fence-hankaku)
+(define-key fence-mode-map "\e>"  'fence-zenkaku)
+(define-key fence-mode-map "\e\C-h" 'its:select-hiragana)
+(define-key fence-mode-map "\e\C-k" 'its:select-katakana)
+(define-key fence-mode-map "\eq"    'its:select-downcase)
+(define-key fence-mode-map "\eQ"    'its:select-upcase)
+(define-key fence-mode-map "\ez"    'its:select-zenkaku-downcase)
+(define-key fence-mode-map "\eZ"    'its:select-zenkaku-upcase)
+(define-key fence-mode-map " "    'henkan-fence-region-or-single-space)
+(define-key fence-mode-map "\C-@" 'henkan-fence-region)
+(define-key fence-mode-map [(control \ )] 'henkan-fence-region)
+(define-key fence-mode-map "\C-a" 'fence-beginning-of-line)
+(define-key fence-mode-map "\C-b" 'fence-backward-char)
+(define-key fence-mode-map "\C-c" 'fence-cancel-input)
+(define-key fence-mode-map "\C-d" 'fence-delete-char)
+(define-key fence-mode-map "\C-e" 'fence-end-of-line)
+(define-key fence-mode-map "\C-f" 'fence-forward-char)
+(define-key fence-mode-map "\C-g" 'fence-cancel-input)
+(define-key fence-mode-map "\C-h" 'fence-mode-help-command)
+(define-key fence-mode-map "\C-k" 'fence-kill-line)
+(define-key fence-mode-map "\C-l" 'fence-exit-mode)
+(define-key fence-mode-map "\C-m" 'fence-exit-mode)  ;;; RET
+(define-key fence-mode-map [return] 'fence-exit-mode)
+(define-key fence-mode-map "\C-q" 'its:select-previous-mode)
+(define-key fence-mode-map "\C-t" 'fence-transpose-chars)
+(define-key fence-mode-map "\C-w" 'henkan-fence-region)
+(define-key fence-mode-map "\C-z" 'eval-expression)
+(define-key fence-mode-map "\C-\\" 'fence-toggle-egg-mode)
+(define-key fence-mode-map "\C-_" 'jis-code-input)
+(define-key fence-mode-map "\177" 'fence-backward-delete-char)
+(define-key fence-mode-map [delete] 'fence-backward-delete-char)
+(define-key fence-mode-map [backspace] 'fence-backward-delete-char)
+(define-key fence-mode-map [right] 'fence-forward-char)
+(define-key fence-mode-map [left] 'fence-backward-char)
+
+
+;;;----------------------------------------------------------------------
+;;;
+;;; Read hiragana from minibuffer
+;;;
+;;;----------------------------------------------------------------------
+
+(defvar egg:*minibuffer-local-hiragana-map* (copy-keymap minibuffer-local-map))
+
+(substitute-key-definition 'self-insert-command
+			   'fence-self-insert-command
+			   egg:*minibuffer-local-hiragana-map*
+			   minibuffer-local-map)
+
+(defun read-hiragana-string (prompt &optional initial-input)
+  (save-excursion
+    (let ((minibuff (window-buffer (minibuffer-window))))
+      (set-buffer minibuff)
+      (setq egg:*input-mode* t
+	    egg:*mode-on*    t
+	    its:*current-map* (its:get-mode-map "roma-kana"))
+      (mode-line-egg-mode-update (its:get-mode-indicator its:*current-map*))))
+  (read-from-minibuffer prompt initial-input
+		       egg:*minibuffer-local-hiragana-map*))
+
+(defun read-kanji-string (prompt &optional initial-input)
+  (save-excursion
+    (let ((minibuff (window-buffer (minibuffer-window))))
+      (set-buffer minibuff)
+      (setq egg:*input-mode* t
+	    egg:*mode-on*    t
+	    its:*current-map* (its:get-mode-map "roma-kana"))
+      (mode-line-egg-mode-update (its:get-mode-indicator "roma-kana"))))
+  (read-from-minibuffer prompt initial-input))
+
+(defconst isearch:read-kanji-string 'read-kanji-string)
+
+;;; $B5-9fF~NO(B
+
+(defvar special-symbol-input-point nil)
+
+(defun special-symbol-input ()
+  (interactive)
+  (require 'egg-jsymbol)
+  ;; 92.7.8 by Y.Kawabe
+  (let ((item (menu:select-from-menu
+	       *symbol-input-menu* special-symbol-input-point t))
+	(code t))
+    (and (listp item)
+	 (setq code (car item) special-symbol-input-point (cdr item)))
+    ;; end of patch
+    (cond((stringp code) (insert code))
+	 ((consp code) (eval code))
+	 )))
+
+(define-key global-map "\C-^"  'special-symbol-input)
+
+(autoload 'busyu-input "busyu" nil t)	;92.10.18 by K.Handa
+(autoload 'kakusuu-input "busyu" nil t)	;92.10.18 by K.Handa
+
+;;; egg.el ends here