Remove non-free old and crusty clearcase pkg
[packages] / mule-packages / egg-its / egg-wnn.el
1 ;;;  egg-wnn.el --- a inputting method communicating with [jck]server
2
3 ;; Author: Satoru Tomura (tomura@etl.go.jp), and
4 ;;         Toshiaki Shingu (shingu@cpr.canon.co.jp)
5 ;; Keywords: inputting method
6
7 ;; This file is part of Egg on Mule (Multilingual Environment)
8
9 ;; Egg is free software; you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation; either version 2, or (at your option)
12 ;; any later version.
13
14 ;; Egg is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 ;; GNU General Public License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs; see the file COPYING.  If not, write to
21 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22
23 ;;; Commentary:
24
25 ;;;  Modified to provide english strings as well by Jareth Hein (jareth@camelot-soft.com)
26 ;;;  Modified for Wnn V4 and Wnn6 by Satoru Tomura(tomura@etl.go.jp)
27 ;;;  Modified for Wnn6 by OMRON
28 ;;;  Written by Toshiaki Shingu (shingu@cpr.canon.co.jp)
29 ;;;  Modified for Wnn V4 library on wnn4v3-egg.el
30
31 ;;; \e$B$?$^$4!V$?$+$J!W%P!<%8%g%s\e(B
32 ;;; \e$B!V$?$+$J!W$H$ODR$1J*$N$?$+$J$G$O$"$j$^$;$s!#\e(B
33 ;;; \e$B!V$?$^$4$h!?$+$7$3$/!?$J!<!<$l!W$NN,$r$H$C$FL?L>$7$^$7$?!#\e(B
34 ;;; Wnn V4 \e$B$N\e(B jl \e$B%i%$%V%i%j$r;H$$$^$9!#\e(B
35 ;;; \e$B%i%$%V%i%j$H$N%$%s%?!<%U%'!<%9$O\e(B wnnfns.c \e$B$GDj5A$5$l$F$$$^$9!#\e(B
36
37 ;;;  \e$B=$@5%a%b\e(B
38
39 ;;;  97/10/27 Help system modification by J.Hein
40 ;;;  97/2/4   Modified for use with XEmacs by J.Hein <jareth@camelot-soft.com>
41 ;;;           (mostly changes regarding extents and markers)
42 ;;;  94/2/3   kWnn support by H.Kuribayashi
43 ;;;  93/11/24 henkan-select-kouho: bug fixed
44 ;;;  93/7/22  hinsi-from-menu updated
45 ;;;  93/5/12  remove-regexp-in-string 
46 ;;;             fixed by Shuji NARAZAKI <narazaki@csce.kyushu-u.ac.jp>
47 ;;;  93/4/22  set-wnn-host-name, set-cwnn-host-name
48 ;;;  93/4/5   EGG:open-wnn, close-wnn modified by tsuiki.
49 ;;;  93/4/2   wnn-param-set
50 ;;;  93/4/2   modified along with wnn4fns.c
51 ;;;  93/3/3   edit-dict-item: bug fixed
52 ;;;  93/1/8   henkan-help-command modified.
53 ;;;  92/12/1  buffer local 'wnn-server-type' and 'cwnn-zhuyin'
54 ;;;      so as to support individual its mode with multiple buffers.
55 ;;;  92/11/26 set-cserver-host-name fixed.
56 ;;;  92/11/26 its:{previous,next}-mode by <yasutome@ics.osaka-u.ac.jp>
57 ;;;  92/11/25 set-wnn-host-name was changed to set-{j,c}server-host-name.
58 ;;;  92/11/25 redefined its:select-mode and its:select-mode-from-menu 
59 ;;;     defined in egg.el to run hook with its mode selection.
60 ;;;  92/11/20 bug fixed related to henkan mode attribute.
61 ;;;  92/11/12 get-wnn-host-name and set-wnn-host-name were changed.
62 ;;;  92/11/10 (set-dict-comment) bug fixed
63 ;;;  92/10/27 (henkan-region-internal) display message if error occurs.
64 ;;;  92/9/28 completely modified for chinese translation.
65 ;;;  92/9/28 diced-{use,hindo-set} bug fixed <tetsuya@rabbit.is.s.u-tokyo.ac.jp>
66 ;;;  92/9/22 touroku-henkan-mode by <tsuiki@sfc.keio.ac.jp>
67 ;;;  92/9/18 rewrite wnn-dict-add to support password files.
68 ;;;  92/9/8  henkan-region-internal was modified.
69 ;;;  92/9/8  henkan-mode-map " "  'henkan-next-kouho-dai -> 'henkan-next-kouho
70 ;;;  92/9/7  henkan-mode-map "\C-h" 'help-command -> 'henkan-help-command (Shuji Narazaki)
71 ;;;  92/9/3  wnn-server-get-msg without wnn-error-code.
72 ;;;  92/9/3  get-wnn-lang-name was modified.
73 ;;;  92/8/19 get-wnn-lang-name \e$B$NJQ99\e(B (by T.Matsuzawa)
74 ;;;  92/8/5  Bug in henkan-kakutei-first-char fixed. (by Y.Kasai)
75 ;;;  92/7/17 set-egg-henkan-format \e$B$NJQ99\e(B
76 ;;;  92/7/17 egg:error \e$B$N0z?t$r\e(B format &rest args \e$B$KJQ99\e(B
77 ;;;  92/7/17 henkan/gyaku-henkan-word \e$B$N=$@5\e(B
78 ;;;  92/7/17 henkan/gyaku-henkan-paragraph/sentence/word \e$B$G!"\e(B
79 ;;;          \e$BI=<($,Mp$l$k$N$r=$@5!J\e(Bsave-excursion \e$B$r$O$:$9!K\e(B
80 ;;;  92.7.14 Unnecessary '*' in comments of variables deleted. (by T.Ito)
81 ;;;  92/7/10 henkan-kakutei-first-char \e$B$rDI2C!"\e(BC-@ \e$B$K3d$jEv$F!#\e(B(by K.Handa)
82 ;;;  92/7/8  overwrite-mode \e$B$N%5%]!<%H\e(B(by K. Handa)
83 ;;;  92/6/30 startup file \e$B<~$j$NJQ99\e(B
84 ;;;  92/6/30 \e$BJQ49%b!<%I$N%"%H%j%S%e!<%H$K\e(B bold \e$B$rDI2C\e(B
85 ;;;          (by ITO Toshiyuki <toshi@his.cpl.melco.co.jp>)
86 ;;;  92/6/22 \e$B6uJ8;zNs$rJQ49$9$k$HMn$A$k%P%0$r=$@5\e(B
87 ;;;  92/5/20 set-egg-henkan-mode-format \e$B$N\e(B bug fix
88 ;;;  92/5/20 egg:set-bunsetu-attribute \e$B$,BgJ8@a$G@5$7$/F0$/$h$&$KJQ99\e(B
89 ;;;  92/5/19 version 0
90 ;;; ----------------------------------------------------------------
91
92 ;;; Code:
93
94 (require 'egg)
95 (make-variable-buffer-local 'wnn-server-type)
96 (make-variable-buffer-local 'cwnn-zhuyin)
97
98 (defvar egg:*sho-bunsetu-face* nil "*\e$B>.J8@aI=<($KMQ$$$k\e(B face \e$B$^$?$O\e(B nil")
99 (make-variable-buffer-local
100  (defvar egg:*sho-bunsetu-extent* nil "\e$B>.J8@a$NI=<($K;H$&\e(B extent"))
101
102 (defvar egg:*sho-bunsetu-kugiri* "-" "*\e$B>.J8@a$N6h@Z$j$r<($9J8;zNs\e(B")
103
104 (defvar egg:*dai-bunsetu-face* nil "*\e$BBgJ8@aI=<($KMQ$$$k\e(B face \e$B$^$?$O\e(B nil")
105 (make-variable-buffer-local
106  (defvar egg:*dai-bunsetu-extent* nil "\e$BBgJ8@a$NI=<($K;H$&\e(B extent"))
107
108 (defvar egg:*dai-bunsetu-kugiri* " " "*\e$BBgJ8@a$N6h@Z$j$r<($9J8;zNs\e(B")
109
110 (defvar egg:*henkan-face* nil "*\e$BJQ49NN0h$rI=<($9$k\e(B face \e$B$^$?$O\e(B nil")
111 (make-variable-buffer-local
112  (defvar egg:*henkan-extent* nil "\e$BJQ49NN0h$NI=<($K;H$&\e(B extent"))
113
114 (defvar egg:*henkan-open*  "|" "*\e$BJQ49$N;OE@$r<($9J8;zNs\e(B")
115 (defvar egg:*henkan-close* "|" "*\e$BJQ49$N=*E@$r<($9J8;zNs\e(B")
116
117 (make-variable-buffer-local
118  (defvar egg:henkan-mode-in-use nil "buffer \e$B$,JQ49Cf$N;~\e(B t"))
119
120 ;;; ----------------------------------------------------------------
121 ;;;     \e$B0J2<$N\e(B its mode \e$B4X78$N4X?t$O!"\e(Begg.el \e$B$GDj5A$5$l$F$$$k$,!"\e(B
122 ;;; \e$B$?$+$J$G$O\e(B its mode \e$B$N@ZBX$($KF14|$7$F!"\e(Bjserver/cserver,
123 ;;; pinyin/zhuyin \e$B$N@ZBX$($b9T$J$$$?$$$N$G!":FDj5A$7$F$$$k!#\e(B
124 ;;; \e$B=>$C$F!"\e(Begg.el, egg-wnn.el \e$B$N=g$K%m!<%I$7$J$1$l$P$J$i$J$$!#\e(B
125
126
127 (defun its:select-mode (name)
128 "Switch ITS mode to NAME or prompt for it if called interactively.
129 After changing, its:select-mode-hook is called."
130   (interactive (list (completing-read "ITS mode: " its:*mode-alist*)))
131   (if (its:get-mode-map name)
132       (progn
133         (setq its:*current-map* (its:get-mode-map name))
134         (egg:mode-line-display)
135         (run-hooks 'its:select-mode-hook))
136     (beep))
137   )
138
139 (defun its:select-mode-from-menu ()
140 "Select ITS mode from menu.
141 After changing, its:select-mode-hook is called."
142   (interactive)
143   (setcar (nthcdr 2 its:*select-mode-menu*) its:*mode-alist*)
144   (setq its:*current-map* (menu:select-from-menu its:*select-mode-menu*))
145   (egg:mode-line-display)
146   (run-hooks 'its:select-mode-hook))
147
148 (defvar its:select-mode-hook
149   (function
150    (lambda ()
151      (cond ((eq its:*current-map* (its:get-mode-map "roma-kana"))
152             (setq wnn-server-type 'jserver))
153            ((eq its:*current-map* (its:get-mode-map "PinYin"))
154             (setq wnn-server-type 'cserver)
155             (setq cwnn-zhuyin nil))
156            ((eq its:*current-map* (its:get-mode-map "zhuyin"))
157             (setq wnn-server-type 'cserver)
158             (setq cwnn-zhuyin t))
159            ((eq its:*current-map* (its:get-mode-map "hangul"))
160             (setq wnn-server-type 'kserver))
161            ))))
162
163 (defun its:next-mode ()
164 "Switch to next mode in list its:*standard-modes*
165 After changing, its:select-mode-hook is called."
166   (interactive)
167   (let ((pos (its:find its:*current-map* its:*standard-modes*)))
168     (setq its:*current-map*
169           (nth (% (1+ pos) (length its:*standard-modes*))
170                its:*standard-modes*))
171     (egg:mode-line-display)
172     (run-hooks 'its:select-mode-hook)))
173
174 (defun its:previous-mode ()
175 "Switch to previous mode in list its:*standard-modes*
176 After changing, its:select-mode-hook is called."
177   (interactive)
178   (let ((pos (its:find its:*current-map* its:*standard-modes*)))
179     (setq its:*current-map*
180           (nth (1- (if (= pos 0) (length its:*standard-modes*) pos))
181                its:*standard-modes*))
182     (egg:mode-line-display)
183     (run-hooks 'its:select-mode-hook)))
184
185 (defun read-current-its-string (prompt &optional initial-input henkan)
186   (let ((egg:fence-buffer (window-buffer (minibuffer-window)))
187         (old-its-map its:*current-map*)
188         ;;(minibuffer-exit-hook
189         ;; (append minibuffer-exit-hook
190         ;;         '((lambda () (use-local-map minibuffer-local-map)))))
191         )
192   (save-excursion
193     (set-buffer egg:fence-buffer)
194     (setq egg:*input-mode* t
195           egg:*mode-on*    t
196           its:*current-map* old-its-map)
197     (mode-line-egg-mode-update
198      (nth 1 (its:get-mode-indicator its:*current-map*)))
199     (read-from-minibuffer prompt initial-input
200                           (if henkan nil
201                             egg:*minibuffer-local-hiragana-map*)))))
202
203 ;;;----------------------------------------------------------------------
204 ;;;
205 ;;; Kana Kanji Henkan 
206 ;;;
207 ;;;----------------------------------------------------------------------
208
209 (defvar wnn-host-name nil "Jserver host name currently connected")
210 (defvar cwnn-host-name nil "Cserver host name currently connected")
211 (defvar kwnn-host-name nil "Kserver host name currently connected")
212 (defvar jserver-list nil "*List of jserver host name")
213 (defvar cserver-list nil "*List of cserver host name")
214 (defvar kserver-list nil "*List of kserver host name")
215
216 (defvar egg:*sai-henkan-start* nil)
217 (defvar egg:*sai-henkan-end* nil)
218 (defvar egg:*old-bunsetu-suu* nil)
219
220 (defun egg-wnn:kill-emacs-function ()
221   (let ((wnn-server-type))
222     (setq wnn-server-type 'jserver)
223     (close-wnn)
224     (setq wnn-server-type 'cserver)
225     (close-wnn)
226     (setq wnn-server-type 'kserver)
227     (close-wnn)))
228
229 (add-hook 'kill-emacs-hook 'egg-wnn:kill-emacs-function)
230
231 (defun egg:error (form &rest mesg)
232   (apply 'notify (or form "%s") mesg)
233   (apply 'error (or form "%s") mesg))
234
235 (defun wnn-toggle-english-messages ()
236 "Toggle whether wnn reports info in english or the native language of the server."
237   (interactive)
238   (setq wnn-english-messages (not wnn-english-messages)))
239
240 (defvar wnn-english-messages nil "*If non-nil, display messages from the [jck]server in English")
241
242 (make-symbol "english-mess")
243
244 (defun egg:msg-get (message)
245   (or
246    (nth 1 (assoc message (nth 1 (assoc (if wnn-english-messages 'english-mess wnn-server-type)
247                                        *egg-message-alist*))))
248    (format "No message. Check *egg-message-alist* %s %s"
249            wnn-server-type message)))
250
251 (defvar *egg-message-alist*
252   '((english-mess
253      ((open-wnn "Connected with Wnn on host %s")
254       (no-rcfile "No egg-startup-file on %s")
255       (file-saved "Wnn dictionary and frequency data recorded.")
256       (henkan-mode-indicator "\e$B4A\e(B")
257       (begin-henkan "Fence starting character: ")
258       (end-henkan "Fence ending character: ")
259       (kugiri-dai "Large bunsetsu separator: ")
260       (kugiri-sho "Small bunsetsu separator: ")
261       (face-henkan "Face for conversion: ")
262       (face-dai "Face for large bunsetsu: ")
263       (face-sho "Face for small bunsetsu: ")
264       (jikouho "Entries:")
265       (off-msg "%s %s(%s:%s) turned off.")
266       (henkan-help "Kanji conversion mode:
267 Bunsetsu motion commands
268   \\[henkan-first-bunsetu]\tFirst bunsetsu\t\\[henkan-last-bunsetu]\tLast bunsetsu
269   \\[henkan-backward-bunsetu]\tPrevious bunsetsu\t\\[henkan-forward-bunsetu]\tNext bunsetsu
270 Bunsetsu conversion commands
271   \\[henkan-next-kouho-dai]\tNext larger match\t\\[henkan-next-kouho-sho]\tNext smaller match
272   \\[henkan-previous-kouho]\tPrevious match\t\\[henkan-next-kouho]\tNext match
273   \\[henkan-bunsetu-nobasi-dai]\tExtend bunsetsu largest\t\\[henkan-bunsetu-chijime-dai]\tShrink bunsetsu smallest
274   \\[henkan-bunsetu-nobasi-sho]\tExtend bunsetsu\t\\[henkan-bunsetu-chijime-sho]\tShrink bunsetsu
275   \\[henkan-select-kouho-dai]\tMenu select largest match\t\\[henkan-select-kouho-sho]\tMenu select smallest match
276 Conversion commands
277   \\[henkan-kakutei]\tComplete conversion commit\t\\[henkan-kakutei-before-point]\tCommit before point
278   \\[henkan-quit]\tAbort conversion
279 ")
280       (hinsimei "Hinshi (product/noun) name:")
281       (jishotouroku-yomi "Dictionary entry for\e$B!X\e(B%s\e$B!Y\e(B reading:")
282       (touroku-jishomei "Name of dictionary:" )
283       (registerd "Dictonary entry\e$B!X\e(B%s\e$B!Y\e(B(%s: %s) registered in %s.")
284       (yomi "Reading\e$B!'\e(B")
285       (no-yomi "No dictionary entry for \e$B!X\e(B%s\e$B!Y\e(B.")
286       (jisho "Dictionary:")
287       (hindo "Frequency:")
288       (kanji "Kanji:")
289       (register-notify "Dictonary entry\e$B!X\e(B%s\e$B!Y\e(B(%s: %s) registered in %s.")
290       (cannot-remove "Cannot delete entry from system dictionary.")
291       (enter-hindo "Enter frequency:")
292       (remove-notify "Dictonary entry\e$B!X\e(B%s\e$B!Y\e(B(%s) removed from %s.")
293       (removed "Dictonary entry\e$B!X\e(B%s\e$B!Y\e(B(%s) removed from %s.")
294       (jishomei "Dictionary name:" )
295       (comment "Comment:")
296       (jisho-comment "Dictionary:%s: comment:%s")
297       (param ("\e$B#N\e(B ( \e$BBg\e(B ) \e$BJ8@a2r@O$N#N\e(B"
298               "\e$BBgJ8@aCf$N>.J8@a$N:GBg?t\e(B"
299               "\e$B448l$NIQEY$N%Q%i%a!<%?\e(B"
300               "\e$B>.J8@aD9$N%Q%i%a!<%?\e(B"
301               "\e$B448lD9$N%Q%i%a!<%?\e(B"
302               "\e$B:#;H$C$?$h%S%C%H$N%Q%i%a!<%?\e(B"
303               "\e$B<-=q$N%Q%i%a!<%?\e(B"
304               "\e$B>.J8@a$NI>2ACM$N%Q%i%a!<%?\e(B"
305               "\e$BBgJ8@aD9$N%Q%i%a!<%?\e(B"
306               "\e$B>.J8@a?t$N%Q%i%a!<%?\e(B"
307               "\e$B5?;wIJ;l\e(B \e$B?t;z$NIQEY\e(B"
308               "\e$B5?;wIJ;l\e(B \e$B%+%J$NIQEY\e(B"
309               "\e$B5?;wIJ;l\e(B \e$B1Q?t$NIQEY\e(B"
310               "\e$B5?;wIJ;l\e(B \e$B5-9f$NIQEY\e(B"
311               "\e$B5?;wIJ;l\e(B \e$BJD3g8L$NIQEY\e(B"
312               "\e$B5?;wIJ;l\e(B \e$BIUB08l$NIQEY\e(B"
313               "\e$B5?;wIJ;l\e(B \e$B3+3g8L$NIQEY\e(B"))
314       ))
315     (jserver
316      ((open-wnn "\e$B%[%9%H\e(B %s \e$B$N\e(B Wnn \e$B$r5/F0$7$^$7$?\e(B")
317       (no-rcfile "%s \e$B>e$K\e(B egg-startup-file \e$B$,$"$j$^$;$s!#\e(B")
318       (file-saved "Wnn\e$B$NIQEY>pJs!&<-=q>pJs$rB`Hr$7$^$7$?!#\e(B")
319       (henkan-mode-indicator "\e$B4A\e(B")
320       (begin-henkan "\e$BJQ493+;OJ8;zNs\e(B: ")
321       (end-henkan "\e$BJQ49=*N;J8;zNs\e(B: ")
322       (kugiri-dai "\e$BBgJ8@a6h@Z$jJ8;zNs\e(B: ")
323       (kugiri-sho "\e$B>.J8@a6h@Z$jJ8;zNs\e(B: ")
324       (face-henkan "\e$BJQ496h4VI=<(B0@-\e(B: ")
325       (face-dai "\e$BBgJ8@a6h4VI=<(B0@-\e(B: ")
326       (face-sho "\e$B>.J8@a6h4VI=<(B0@-\e(B: ")
327       (jikouho "\e$B<!8uJd\e(B:")
328       (off-msg "%s %s(%s:%s)\e$B$r\e(B off \e$B$7$^$7$?!#\e(B")
329       (henkan-help "\e$B4A;zJQ49%b!<%I\e(B:
330 \e$BJ8@a0\F0\e(B
331   \\[henkan-first-bunsetu]\t\e$B@hF,J8@a\e(B\t\\[henkan-last-bunsetu]\t\e$B8eHxJ8@a\e(B  
332   \\[henkan-backward-bunsetu]\t\e$BD>A0J8@a\e(B\t\\[henkan-forward-bunsetu]\t\e$BD>8eJ8@a\e(B
333 \e$BJQ49JQ99\e(B
334   \\[henkan-next-kouho-dai]\t\e$BBgJ8@a<!8uJd\e(B\t\\[henkan-next-kouho-sho]\t\e$B>.J8@a<!8uJd\e(B
335   \\[henkan-previous-kouho]\t\e$BA08uJd\e(B\t\\[henkan-next-kouho]\t\e$B<!8uJd\e(B    
336   \\[henkan-bunsetu-nobasi-dai]\t\e$BBgJ8@a?-$7\e(B\t\\[henkan-bunsetu-chijime-dai]\t\e$BBgJ8@a=L$a\e(B  
337   \\[henkan-bunsetu-nobasi-sho]\t\e$B>.J8@a?-$7\e(B\t\\[henkan-bunsetu-chijime-sho]\t\e$B>.J8@a=L$a\e(B  
338   \\[henkan-select-kouho-dai]\t\e$BBgJ8@aJQ498uJdA*Br\e(B\t\\[henkan-select-kouho-sho]\t\e$B>.J8@aJQ498uJdA*Br\e(B  
339 \e$BJQ493NDj\e(B
340   \\[henkan-kakutei]\t\e$BA4J8@a3NDj\e(B\t\\[henkan-kakutei-before-point]\t\e$BD>A0J8@a$^$G3NDj\e(B  
341   \\[henkan-quit]\t\e$BJQ49Cf;_\e(B    
342 ")
343       (hinsimei "\e$BIJ;lL>\e(B:")
344       (jishotouroku-yomi "\e$B<-=qEPO?!X\e(B%s\e$B!Y\e(B  \e$BFI$_\e(B :")
345       (touroku-jishomei "\e$BEPO?<-=qL>\e(B:" )
346       (registerd "\e$B<-=q9`L\!X\e(B%s\e$B!Y\e(B(%s: %s)\e$B$r\e(B%s\e$B$KEPO?$7$^$7$?!#\e(B" )
347       (yomi "\e$B$h$_!'\e(B")
348 ;      (no-yomi "\e$B!X\e(B%s\e$B!Y$N<-=q9`L\$O$"$j$^$;$s!#\e(B")
349       (no-yomi "\e$B<-=q9`L\!X\e(B%s\e$B!Y$O$"$j$^$;$s!#\e(B")
350       (jisho "\e$B<-=q!'\e(B")
351       (hindo " \e$BIQEY!'\e(B")
352       (kanji "\e$B4A;z!'\e(B")
353       (register-notify "\e$B<-=q9`L\!X\e(B%s\e$B!Y\e(B(%s: %s)\e$B$r\e(B%s\e$B$KEPO?$7$^$9!#\e(B")
354       (cannot-remove "\e$B%7%9%F%`<-=q9`L\$O:o=|$G$-$^$;$s!#\e(B")
355       (enter-hindo "\e$BIQEY$rF~$l$F2<$5$$\e(B: ")
356       (remove-notify "\e$B<-=q9`L\!X\e(B%s\e$B!Y\e(B(%s)\e$B$r\e(B%s\e$B$+$i:o=|$7$^$9!#\e(B")
357       (removed "\e$B<-=q9`L\!X\e(B%s\e$B!Y\e(B(%s)\e$B$r\e(B%s\e$B$+$i:o=|$7$^$7$?!#\e(B")
358       (jishomei "\e$B<-=qL>\e(B:" )
359       (comment "\e$B%3%a%s%H\e(B: ")
360       (jisho-comment "\e$B<-=q\e(B:%s: \e$B%3%a%s%H\e(B:%s")
361       (param ("\e$B#N\e(B ( \e$BBg\e(B ) \e$BJ8@a2r@O$N#N\e(B"
362               "\e$BBgJ8@aCf$N>.J8@a$N:GBg?t\e(B"
363               "\e$B448l$NIQEY$N%Q%i%a!<%?\e(B"
364               "\e$B>.J8@aD9$N%Q%i%a!<%?\e(B"
365               "\e$B448lD9$N%Q%i%a!<%?\e(B"
366               "\e$B:#;H$C$?$h%S%C%H$N%Q%i%a!<%?\e(B"
367               "\e$B<-=q$N%Q%i%a!<%?\e(B"
368               "\e$B>.J8@a$NI>2ACM$N%Q%i%a!<%?\e(B"
369               "\e$BBgJ8@aD9$N%Q%i%a!<%?\e(B"
370               "\e$B>.J8@a?t$N%Q%i%a!<%?\e(B"
371               "\e$B5?;wIJ;l\e(B \e$B?t;z$NIQEY\e(B"
372               "\e$B5?;wIJ;l\e(B \e$B%+%J$NIQEY\e(B"
373               "\e$B5?;wIJ;l\e(B \e$B1Q?t$NIQEY\e(B"
374               "\e$B5?;wIJ;l\e(B \e$B5-9f$NIQEY\e(B"
375               "\e$B5?;wIJ;l\e(B \e$BJD3g8L$NIQEY\e(B"
376               "\e$B5?;wIJ;l\e(B \e$BIUB08l$NIQEY\e(B"
377               "\e$B5?;wIJ;l\e(B \e$B3+3g8L$NIQEY\e(B"))
378       ))
379     (cserver
380      ((open-wnn "Host %s \e$AIO5D\e(B cWnn \e$ARQ>-Fp6/AK\e(B")
381       (no-rcfile "\e$ATZ\e(B%s \e$AIOC;SP\e(B egg-startup-file")
382       (file-saved "Wnn\e$A5DF56HND<~:M4G5dPEO"RQ>-MK3vAK\e(B")
383       (henkan-mode-indicator "\e$A::\e(B")
384       (begin-henkan "\e$A1d;;?*J<WV7{AP\e(B: ")
385       (end-henkan "\e$A1d;;=aJxWV7{AP\e(B: ")
386       (kugiri-dai "\e$A4JWi7V8nWV7{AP\e(B: ")
387       (kugiri-sho "\e$A5%4J7V8nWV7{AP\e(B: ")
388       (face-henkan "\e$A1d;;Gx<d1mJ>JtPT\e(B: ")
389       (face-dai "\e$A4JWiGx<d1mJ>JtPT\e(B: ")
390       (face-sho "\e$A5%4JGx<d1mJ>JtPT\e(B: ")
391       (jikouho "\e$A4N:nQ!\e(B:")
392       (off-msg "%s %s(%s:%s)\e$ARQ1;\e(B off \e$A5tAK\e(B")
393       (henkan-help "\e$A::WV1d;;D#J=\e(B:
394 \e$A4JWiRF6/\e(B
395   \\[henkan-first-bunsetu]\t\e$AOHM74JWi\e(B\t\\[henkan-last-bunsetu]\t\e$A=aN24JWi\e(B
396   \\[henkan-backward-bunsetu]\t\e$AG0R;8v4JWi\e(B\t\\[henkan-forward-bunsetu]\t\e$AOBR;8v4JWi\e(B
397 \e$A1d;;1d8|\e(B
398   \\[henkan-next-kouho-dai]\t\e$A4JWi4N:nQ!\e(B\t\\[henkan-next-kouho-sho]\t\e$A5%4J4N:nQ!\e(B
399   \\[henkan-previous-kouho]\t\e$AG0:nQ!\e(B\t\\[henkan-next-kouho]\t\e$A4N:nQ!\e(B
400   \\[henkan-bunsetu-nobasi-dai]\t\e$A4JWi@)U9\e(B\t\\[henkan-bunsetu-chijime-dai]\t\e$A4JWiJUKu\e(B
401   \\[henkan-bunsetu-nobasi-sho]\t\e$A5%4J@)U9\e(B\t\\[henkan-bunsetu-chijime-sho]\t\e$A5%4JJUKu\e(B
402   \\[henkan-select-kouho-dai]\t\e$A4JWi1d;;:r295DQ!Tq\e(B\t\\[henkan-select-kouho-sho]\t\e$A5%4J1d;;:r295DQ!Tq\e(B
403   \\[henkan-select-kouho-dai]\t\e$A1d;;:r295DQ!Tq\e(B
404 \e$A1d;;H76(\e(B
405   \\[henkan-kakutei]\t\e$AH+NDH76(\e(B\t\\[henkan-kakutei-before-point]\t\e$AIOR;4JWiN*V95DH76(\e(B
406   \\[henkan-quit]\t\e$AM#V91d;;\e(B
407 ")
408       (hinsimei "\e$A4JPTC{\e(B:")
409       (jishotouroku-yomi "\e$A4G5d5GB<!:\e(B%s\e$A!;F47(\e(B :")
410       (touroku-jishomei "\e$A5GB<4G5dC{\e(B:" )
411       (registerd "\e$A4G5dOnD?!:\e(B%s\e$A!;\e(B(%s: %s)\e$ARQ1;5GB<5=\e(B %s \e$AVPAK\e(B" )
412       (yomi "\e$AF47(\e$B!'\e(B")
413 ;      (no-yomi "\e$A!:\e(B%s\e$A!;5D4G5dOnD?2;4fTZ\e(B")
414       (no-yomi "\e$A4G5dOnD?!:\e(B%s\e$A!;2;4fTZ\e(B")
415       (jisho "\e$A4G5d\e(B:")
416       (hindo " \e$AF56H\e$B!'\e(B")
417       (kanji "\e$A::WV\e$B!'\e(B")
418       (register-notify "\e$A4G5dOnD?!:\e(B%s\e$A!;\e(B(%s: %s)\e$A=+R*1;5GB<5=\e(B %s \e$AVP\e(B")
419       (cannot-remove "\e$AO5M34G5dOn2;D\O{3}\e(B")
420       (enter-hindo "\e$AGkJdHkF56H\e(B: ")
421       (remove-notify "\e$A4G5dOnD?!:\e(B%s\e$A!;\e(B(%s)\e$A=+R*4S\e(B %s \e$AVPO{3}\e(B")
422       (removed "\e$A4G5dOnD?!:\e(B%s\e$A!;\e(B(%s)\e$ARQ>-4S\e(B%s\e$AVPO{3}AK\e(B")
423       (jishomei "\e$A4G5dC{\e(B:" )
424       (comment "\e$AW"JM\e(B: ")
425       (jisho-comment "\e$A4G5d\e(B:%s: \e$AW"JM\e(B:%s")
426       (param ("\e$A=bNv4JWi8vJ}\e(B"
427               "\e$A4JWiVP4J5DWn4s8vJ}\e(B"
428               "\e$AF56HH(V5\e(B"
429               "\e$A4J3$6HH(V5\e(B"
430               "\e$AKDIyU}H76HH(V5\e(B"
431               "\e$A8U2ESC9}H(V5\e(B"
432               "\e$AWV5dSEOH<6H(V5\e(B"
433               "\e$A4JF@<[>yV5H(V5\e(B"
434               "\e$A4JWi3$H(V5\e(B"
435               "\e$A4JWiVP4JJ}H(V5\e(B"
436               "\e$AJ}WV5DF56H\e(B"
437               "\e$AS"NDWVD85DF56H\e(B"
438               "\e$A<G:E5DF56H\e(B"
439               "\e$A?*@(;!5DF56H\e(B"
440               "\e$A1U@(;!5DF56H\e(B"
441               "\e$AWn4s:r298vJ}\e(B"
442               "\e$A18SC\e(B"
443               ))
444       ))
445     (kserver
446      ((open-wnn "\e$(CH#=:F.\e(B %s \e$(C@G\e(B kWnn \e$(C8&\e(B \e$(CQ&TQG_@>4O4Y\e(B.")
447       (no-rcfile "%s \e$(C?!\e(B egg-startup-file \e$(C@L\e(B \e$(C>x@>4O4Y\e(B.")
448       (file-saved "kWnn \e$(C@G\e(B \e$(C^:SxoW\C!$^vnpoW\C8&\e(B \e$(C?E0e@>4O4Y\e(B.")
449       (henkan-mode-indicator "\e$(CyS\e(B")
450       (begin-henkan "\e$(C\(|5\e(B \e$(CKRc7\e(B \e$(CY~m.fj\e(B: ")
451       (end-henkan "\e$(C\(|5\e(B \e$(Cp{Vu\e(B \e$(CY~m.fj\e(B: ")
452       (kugiri-dai "\e$(CS^Y~o=\e(B \e$(CO!\,\e(B \e$(CY~m.fj\e(B: ")
453       (kugiri-sho "\e$(Ca3Y~o=\e(B \e$(CO!\,\e(B \e$(CY~m.fj\e(B: ")
454       (face-henkan "\e$(C\(|5\e(B \e$(CO!J`\e(B \e$(CxvcF\e(B \e$(CaU`u\e(B: ")
455       (face-dai "\e$(CS^Y~o=\e(B \e$(CO!J`\e(B \e$(CxvcF\e(B \e$(CaU`u\e(B: ")
456       (face-sho "\e$(Ca3Y~o=\e(B \e$(CO!J`\e(B \e$(CxvcF\e(B \e$(CaU`u\e(B: ")
457       (jikouho "\e$(C4Y@=\e(B \e$(C}&\M\e(B:")
458       (off-msg "%s %s(%s:%s)\e$(C@;\e(B off \e$(CG_@>4O4Y\e(B.")
459       (henkan-help "\e$(CySm.\e(B \e$(C\(|5\e(B \e$(C8p5e\e(B:
460 \e$(CY~o=\e(B \e$(Cl9TQ\e(B
461   \\[henkan-first-bunsetu]\t\e$(C`;Ti\e(B \e$(CY~o=\e(B\t\\[henkan-last-bunsetu]\t\e$(C}-Z-\e(B \e$(CY~o=\e(B  
462   \\[henkan-backward-bunsetu]\t\e$(CrAnq\e(B \e$(CY~o=\e(B\t\\[henkan-forward-bunsetu]\t\e$(CrA}-\e(B \e$(CY~o=\e(B
463 \e$(C\(|5\e(B \e$(C\(LZ\e(B
464   \\[henkan-next-kouho-dai]\t\e$(CS^Y~o=\e(B \e$(C4Y@=\e(B \e$(C}&\M\e(B\t\\[henkan-next-kouho-sho]\t\e$(Ca3Y~o=\e(B \e$(C4Y@=\e(B \e$(C}&\M\e(B    
465   \\[henkan-previous-kouho]\t\e$(Cnq\e(B \e$(C}&\M\e(B\t\\[henkan-next-kouho]\t\e$(C4Y@=\e(B \e$(C}&\M\e(B
466   \\[henkan-bunsetu-nobasi-dai]\t\e$(CS^Y~o=\e(B \e$(C|*S^\e(B\t\\[henkan-bunsetu-chijime-dai]\t\e$(CS^Y~o=\e(B \e$(Cuja3\e(B
467   \\[henkan-bunsetu-nobasi-sho]\t\e$(Ca3Y~o=\e(B \e$(C|*S^\e(B\t\\[henkan-bunsetu-chijime-sho]\t\e$(Ca3Y~o=\e(B \e$(Cuja3\e(B
468   \\[henkan-select-kouho-dai]\t\e$(CS^Y~o=\e(B \e$(C\(|5\e(B \e$(C4Y@=\e(B \e$(C}&\M\e(B\t\\[henkan-select-kouho-sho]\t\e$(Ca3Y~o=\e(B \e$(C\(|5\e(B \e$(C4Y@=\e(B \e$(C}&\M\e(B
469 \e$(C\(|5\e(B \e$(C|,oR\e(B
470   \\[henkan-kakutei]\t\e$(CnoY~o=\e(B \e$(C|,oR\e(B\t\\[henkan-kakutei-before-point]\t\e$(CrAnq\e(B \e$(CY~o=1nAv\e(B \e$(C|,oR\e(B
471   \\[henkan-quit]\t\e$(C\(|5\e(B \e$(Cqir-\e(B
472 ")
473       (hinsimei "\e$(Cy!^rY#\e(B: ")
474       (jishotouroku-yomi "\e$(C^vnp\e(B \e$(CTtVb!:\e(B%s\e$(C!;\e(B \e$(CGQ1[\e(B: ")
475       (touroku-jishomei "\e$(CTtVb\e(B \e$(C^vnpY#\e(B: " )
476       (registerd "\e$(C^vnp\e(B \e$(Cz#YM!:\e(B%s\e$(C!;\e(B(%s: %s)\e$(C@;\e(B %s\e$(C?!\e(B \e$(CTtVbG_@>4O4Y\e(B." )
477       (yomi "\e$(CGQ1[\e(B: ")
478 ;      (no-yomi "\e$(C!:\e(B%s\e$(C!;@G\e(B \e$(C^vnp\e(B \e$(Cz#YM@L\e(B \e$(C>x@>4O4Y\e(B.")
479       (no-yomi "\e$(C^vnp\e(B \e$(Cz#YM\e(B \e$(C!:\e(B%s\e$(C!;@L\e(B \e$(C>x@>4O4Y\e(B.")
480       (jisho "\e$(C^vnp\e(B: ")
481       (hindo " \e$(C^:Sx\e(B: ")
482       (kanji "\e$(CySm.\e(B: ")
483       (register-notify "\e$(C^vnp\e(B \e$(Cz#YM\e(B \e$(C!:\e(B%s\e$(C!;\e(B(%s: %s)\e$(C@;\e(B %s\e$(C?!\e(B \e$(CTtVbGO0Z@>4O4Y\e(B.")
484       (cannot-remove "\e$(C=C=:E[\e(B \e$(C^vnpz#YM@:\e(B \e$(Ca<K[GR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B.")
485       (enter-hindo "\e$(C^:Sx8&\e(B \e$(Cl}UtGO=J=C?@\e(B: ")
486       (remove-notify "\e$(C^vnpz#YM!:\e(B%s\e$(C!;\e(B(%s)\e$(C@;\e(B %s\e$(C:NEM\e(B \e$(Ca<K[GO0Z@>4O4Y\e(B.")
487       (removed "\e$(C^vnp\e(B \e$(Cz#YM!:\e(B%s\e$(C!;\e(B(%s)\e$(C@;\e(B %s\e$(C:NEM\e(B \e$(Ca<K[G_@>4O4Y\e(B.")
488       (jishomei "\e$(C^vnpY#\e(B: " )
489       (comment "\e$(CqI`7\e(B: ")
490       (jisho-comment "\e$(C^vnp\e(B:%s: \e$(CqI`7\e(B:%s")
491       (param ("N (\e$(CS^\e(B)\e$(CY~o=\e(B \e$(Cz0`0@G\e(B N"
492               "\e$(CS^Y~o=\e(B \e$(C>H@G\e(B \e$(Ca3Y~o=\e(B \e$(C<v@G\e(B \e$(CuLS^b&\e(B"
493               "\e$(CJOe^@G\e(B \e$(C^:Sx\e(B \e$(CFP7/9LEM\e(B"
494               "\e$(Ca3Y~o=\e(B \e$(C1f@L\e(B \e$(CFP7/9LEM\e(B"
495               "\e$(CJOe^@G\e(B \e$(C1f@L\e(B \e$(CFP7/9LEM\e(B"
496               "\e$(Cq~PQ\e(B \e$(C^EiDG_@>4O4Y\e(B \e$(C:qF.\e(B \e$(CFP7/9LEM\e(B"
497               "\e$(C^vnp@G\e(B \e$(CFP7/9LEM\e(B"
498               "\e$(Ca3Y~o=@G\e(B \e$(CxDJ$v7\e(B \e$(CFP7/9LEM\e(B"
499               "\e$(CS^Y~o=\e(B \e$(C1f@L\e(B \e$(CFP7/9LEM\e(B"
500               "\e$(Ca3Y~o=\e(B \e$(Cb&\e(B \e$(CFP7/9LEM\e(B"
501               "\e$(CJ#_L\e(B \e$(Cy!^r\e(B: \e$(Cb&m.@G\e(B \e$(C^:Sx\e(B"
502               "\e$(CJ#_L\e(B \e$(Cy!^r\e(B: \e$(CGQ1[@G\e(B \e$(C^:Sx\e(B"
503               "\e$(CJ#_L\e(B \e$(Cy!^r\e(B: \e$(CgHb&m.@G\e(B \e$(C^:Sx\e(B"
504               "\e$(CJ#_L\e(B \e$(Cy!^r\e(B: \e$(CQ@{\@G\e(B \e$(C^:Sx\e(B"
505               "\e$(CJ#_L\e(B \e$(Cy!^r\e(B: \e$(CxMN@{A@G\e(B \e$(C^:Sx\e(B"
506               "\e$(CJ#_L\e(B \e$(Cy!^r\e(B: \e$(C]>aUe^@G\e(B \e$(C^:Sx\e(B"
507               "\e$(CJ#_L\e(B \e$(Cy!^r\e(B: \e$(CKRN@{A@G\e(B \e$(C^:Sx\e(B"))
508       ))
509     ))
510
511
512 ;;;
513 ;;; Entry functions for egg-startup-file
514 ;;;
515
516 ;(defvar wnn-lang-name nil)
517 ;(defvar default-wnn-lang-name "ja_JP") ; 92.8.19 by T.Matsuzawa
518
519 (defvar skip-wnn-setenv-if-env-exist nil
520   "skip wnn environment setting when the same name environment exists")
521
522 (defmacro push-end (val loc)
523   (list 'push-end-internal val (list 'quote loc)))
524
525 (defun push-end-internal (val loc)
526   (set loc
527        (if (eval loc)
528            (nconc (eval loc) (cons val nil))
529          (cons val nil))))
530
531 (defun is-wnn6-server ()
532   (= (wnn-server-version) 61697))
533
534 (defun add-wnn-dict (dfile hfile priority dmode hmode &optional dpaswd hpaswd)
535 ;  (open-wnn-if-disconnected)
536   (if (null (wnn-server-dict-add
537              (substitute-in-file-name dfile)
538              (substitute-in-file-name hfile)
539              priority dmode hmode dpaswd hpaswd))
540       (egg:error (wnn-server-get-msg))))
541
542 (defun set-wnn-fuzokugo (ffile)
543 ;  (open-wnn-if-disconnected)
544   (if (null (wnn-server-fuzokugo-set (substitute-in-file-name ffile)))
545       (egg:error (wnn-server-get-msg))))
546
547 ;; ###jhod Currently very broken. Needs to be rewritten for the new
548 ;;         wnn-server-set-param
549 (defun set-wnn-param (&rest param)
550 "Set parameters for the current wnn session.
551 Uses property list PARAM, or prompts if called interactively.
552
553 Currently very broken."
554   (interactive)
555 ;  (open-wnn-if-disconnected)
556   (let ((current-param (wnn-server-get-param))
557         (new-param)
558         (message (egg:msg-get 'param)))
559     (while current-param
560       (setq new-param
561             (cons
562              (if (or (null param) (null (car param)))
563                  (string-to-int
564                   (read-from-minibuffer (concat (car message) ": ")
565                                         (int-to-string (car current-param))))
566                (car param))
567              new-param))
568       (setq current-param (cdr current-param)
569             message (cdr message)
570             param (if param (cdr param) nil)))
571     (apply 'wnn-server-set-param (nreverse new-param))))
572
573 ;;
574 ;; for Wnn6
575 ;;
576 (defun add-wnn-fisys-dict (dfile hfile hmode &optional hpaswd)
577 ;  (open-wnn-if-disconnected)
578   (if (null (wnn-server-fisys-dict-add
579              (substitute-in-file-name dfile)
580              (substitute-in-file-name hfile)
581              hmode hpaswd))
582       (egg:error (wnn-server-get-msg))))
583
584 (defun add-wnn-fiusr-dict (dfile hfile dmode hmode &optional dpaswd hpaswd)
585 ;  (open-wnn-if-disconnected)
586   (if (null (wnn-server-fiusr-dict-add
587              (substitute-in-file-name dfile)
588              (substitute-in-file-name hfile)
589              dmode hmode dpaswd hpaswd))
590       (egg:error (wnn-server-get-msg))))
591
592 (defun add-wnn-notrans-dict (dfile priority dmode &optional dpaswd)
593 ;  (open-wnn-if-disconnected)
594   (if (null (wnn-server-notrans-dict-add
595              (substitute-in-file-name dfile)
596              priority dmode dpaswd))
597       (egg:error (wnn-server-get-msg))))
598
599 (defun add-wnn-bmodify-dict (dfile priority dmode &optional dpaswd)
600 ;  (open-wnn-if-disconnected)
601   (if (null (wnn-server-bmodify-dict-add
602              (substitute-in-file-name dfile)
603              priority dmode dpaswd))
604       (egg:error (wnn-server-get-msg))))
605
606 (defun set-last-is-first-mode (mode)
607 ;  (open-wnn-if-disconnected)
608   (if (null (wnn-server-set-last-is-first
609              mode))
610       (egg:error (wnn-server-get-msg))))
611
612 (defun set-complex-conv-mode (mode)
613 ;  (open-wnn-if-disconnected)
614   (if (null (wnn-server-set-complex-conv-mode
615              mode))
616       (egg:error (wnn-server-get-msg))))
617
618 (defun set-okuri-learn-mode (mode)
619 ;  (open-wnn-if-disconnected)
620   (if (null (wnn-server-set-okuri-learn-mode
621              mode))
622       (egg:error (wnn-server-get-msg))))
623
624 (defun set-okuri-flag (mode)
625 ;  (open-wnn-if-disconnected)
626   (if (null (wnn-server-set-okuri-flag
627              mode))
628       (egg:error (wnn-server-get-msg))))
629
630 (defun set-prefix-learn-mode (mode)
631 ;  (open-wnn-if-disconnected)
632   (if (null (wnn-server-set-prefix-learn-mode
633              mode))
634       (egg:error (wnn-server-get-msg))))
635
636 (defun set-prefix-flag (mode)
637 ;  (open-wnn-if-disconnected)
638   (if (null (wnn-server-set-prefix-flag
639              mode))
640       (egg:error (wnn-server-get-msg))))
641
642 (defun set-suffix-learn-mode (mode)
643 ;  (open-wnn-if-disconnected)
644   (if (null (wnn-server-set-suffix-learn-mode
645              mode))
646       (egg:error (wnn-server-get-msg))))
647
648 (defun set-common-learn-mode (mode)
649 ;  (open-wnn-if-disconnected)
650   (if (null (wnn-server-set-common-learn-mode
651              mode))
652       (egg:error (wnn-server-get-msg))))
653
654 (defun set-freq-func-mode (mode)
655 ;  (open-wnn-if-disconnected)
656   (if (null (wnn-server-set-freq-func-mode
657              mode))
658       (egg:error (wnn-server-get-msg))))
659
660 (defun set-numeric-mode (mode)
661 ;  (open-wnn-if-disconnected)
662   (if (null (wnn-server-set-numeric-mode
663              mode))
664       (egg:error (wnn-server-get-msg))))
665
666 (defun set-alphabet-mode (mode)
667 ;  (open-wnn-if-disconnected)
668   (if (null (wnn-server-set-alphabet-mode
669              mode))
670       (egg:error (wnn-server-get-msg))))
671
672 (defun set-symbol-mode (mode)
673 ;  (open-wnn-if-disconnected)
674   (if (null (wnn-server-set-symbol-mode
675              mode))
676       (egg:error (wnn-server-get-msg))))
677
678 (defun set-yuragi-mode (mode)
679 ;  (open-wnn-if-disconnected)
680   (if (null (wnn-server-set-yuragi-mode
681              mode))
682       (egg:error (wnn-server-get-msg))))
683
684 (defun wnn6-reset-prev-info ()
685 ;  (open-wnn-if-disconnected)
686   (if (null (wnn-reset-previous-info))
687       (egg:error (wnn-server-get-msg))))
688
689 ;;;
690 ;;; WNN interface
691 ;;;
692
693 (defun make-host-list (name list)
694   (cons name (delete name list)))
695
696 (defun set-wnn-host-name (name)
697 "Set egg/wnn to connect to jserver on host NAME, or prompt for it."
698   (interactive "sHost name: ")
699   (let ((wnn-server-type 'jserver)) (close-wnn))
700   (setq jserver-list
701         (make-host-list
702          name (or jserver-list (list (or wnn-host-name (getenv "JSERVER") "localhost"))))))
703
704 (fset 'set-jserver-host-name (symbol-function 'set-wnn-host-name))
705
706 (defun set-cwnn-host-name (name)
707 "Set egg/wnn to connect to cserver on host NAME, or prompt for it."
708   (interactive "sHost name: ")
709   (let ((wnn-server-type 'cserver)) (close-wnn))
710   (setq cserver-list
711         (make-host-list
712          name (or cserver-list (list (or cwnn-host-name (getenv "CSERVER") "localhost"))))))
713
714 (fset 'set-cserver-host-name (symbol-function 'set-cwnn-host-name))
715
716 (defun set-kwnn-host-name (name)
717 "Set egg/wnn to connect to kserver on host NAME, or prompt for it."
718   (interactive "sHost name: ")
719   (let ((wnn-server-type 'kserver)) (close-wnn))
720   (setq kserver-list
721         (make-host-list
722          name (or kserver-list (list (or kwnn-host-name (getenv "KSERVER") "localhost"))))))
723
724 (fset 'set-kserver-host-name (symbol-function 'set-kwnn-host-name))
725
726 (defun open-wnn-if-disconnected ()
727   (if (null (wnn-server-isconnect))
728       (let ((hostlist
729              (cond ((eq wnn-server-type 'jserver)
730                     (or jserver-list
731                         (list (or wnn-host-name (getenv "JSERVER") "localhost"))))
732                    ((eq wnn-server-type 'cserver)
733                     (or cserver-list
734                         (list (or cwnn-host-name (getenv "CSERVER") "localhost"))))
735                    ((eq wnn-server-type 'kserver)
736                     (or kserver-list
737                         (list (or kwnn-host-name (getenv "KSERVER") "localhost"))))))
738             (loginname (user-login-name)))
739         (catch 'succ
740           (while hostlist
741             (let ((hostname (car hostlist)))
742               (if (wnn-server-open hostname loginname)
743                   (progn
744                     (cond ((eq wnn-server-type 'jserver)
745                            (setq wnn-host-name hostname))
746                           ((eq wnn-server-type 'cserver)
747                            (setq cwnn-host-name hostname))
748                           ((eq wnn-server-type 'kserver)
749                            (setq kwnn-host-name hostname)))
750                     (throw 'succ hostname))))
751             (setq hostlist (cdr hostlist)))
752           (egg:error (wnn-server-get-msg))))))
753         
754 (defvar egg-default-startup-file "eggrc"
755   "*Egg startup file name (system default)")
756
757 (defvar egg-startup-file ".eggrc"
758   "*Egg startup file name.")
759
760 ;;;  92/6/30, by K.Handa
761 (defvar egg-startup-file-search-path '("~" ".")
762   "*List of directories to search for egg-startup-file
763 whose name defaults to .eggrc.")
764
765 (defun egg:search-file (filename searchpath)
766   (if (file-name-directory filename)
767       (let ((file (substitute-in-file-name (expand-file-name filename))))
768         (if (file-exists-p file) file nil))
769     (catch 'answer
770       (while searchpath
771         (let ((path (car searchpath)))
772           (if (stringp path)
773               (let ((file (substitute-in-file-name
774                            (expand-file-name filename path))))
775                 (if (file-exists-p file) (throw 'answer file)))))
776         (setq searchpath (cdr searchpath)))
777       nil)))
778
779 (defun EGG:open-wnn ()
780   (let ((host (open-wnn-if-disconnected)))
781     (notify (egg:msg-get 'open-wnn)
782             (or host "local"))
783     (let* ((path (append egg-startup-file-search-path load-path))
784            (eggrc (or (egg:search-file egg-startup-file path)
785                       (egg:search-file egg-default-startup-file load-path))))
786       (if (or (null skip-wnn-setenv-if-env-exist)
787               (null (wnn-server-dict-list)))
788           (if eggrc (load-file eggrc)
789             (let ((wnnenv-sticky nil)) (wnn-server-close))
790             (egg:error (egg:msg-get 'no-rcfile) path)))
791       (run-hooks 'egg:open-wnn-hook))))
792
793 (defun disconnect-wnn ()
794 "Dump connection to Wnn servers, discarding dictionary and frequency changes."
795   (interactive)
796   (if (wnn-server-isconnect) (wnn-server-close)))
797
798 (defun close-wnn ()
799 "Cleanly shutdown connection to Wnn servers, saving data and calling egg:close-wnn-hook"
800   (interactive)
801   (if (wnn-server-isconnect)
802       (progn
803         (wnn-server-set-rev nil)
804         (if (wnn-server-dict-save)
805             (message (egg:msg-get 'file-saved))
806           (message (wnn-server-get-msg)))
807         (sit-for 0)
808         (wnn-server-set-rev t)
809         (if (wnn-server-dict-save)
810             (message (egg:msg-get 'file-saved))
811           (message (wnn-server-get-msg)))
812         (sit-for 0)
813         (wnn-server-close)
814         (run-hooks 'egg:close-wnn-hook))))
815
816 (defun set-wnn-reverse (arg)
817 ;  (open-wnn-if-disconnected)
818   (wnn-server-set-rev arg))
819
820 ;;;
821 ;;; Kanji henkan
822 ;;;
823
824 (defvar egg:*kanji-kanabuff* nil)
825 (defvar egg:*dai* t)
826 (defvar *bunsetu-number* nil)
827 (defvar *zenkouho-suu* nil)
828 (defvar *zenkouho-offset* nil)
829
830 (defun bunsetu-length-sho (number)
831   (cdr (wnn-server-bunsetu-yomi number)))
832   
833 (defun bunsetu-length (number)
834   (let ((max (wnn-server-dai-end number))
835         (i (1+ number))
836         (l (bunsetu-length-sho number)))
837     (while (< i max)
838       (setq l (+ l (bunsetu-length-sho i)))
839       (setq i (1+ i)))
840     l))
841
842 (defun bunsetu-position (number)
843   (let ((pos egg:*region-start*) (i 0))
844     (while (< i number)
845       (setq pos (+ pos (length (bunsetu-kanji  i))
846                    (if (wnn-server-dai-top (1+ i))
847                        (length egg:*dai-bunsetu-kugiri*)
848                      (length egg:*sho-bunsetu-kugiri*))))
849       (setq i (1+ i)))
850     pos))
851   
852 (defun bunsetu-kanji (number) (car (wnn-server-bunsetu-kanji number)))
853   
854 (defun bunsetu-yomi  (number) (car (wnn-server-bunsetu-yomi number)))
855
856 (defun bunsetu-kouho-suu (bunsetu-number init)
857   (if (or init (/= (wnn-server-zenkouho-bun) bunsetu-number))
858       (setq *zenkouho-offset* (wnn-server-zenkouho bunsetu-number egg:*dai*)))
859   (setq *zenkouho-suu* (wnn-server-zenkouho-suu)))
860
861 (defun bunsetu-kouho-list (bunsetu-number init)
862   (if (or init (/= (wnn-server-zenkouho-bun) bunsetu-number))
863       (setq *zenkouho-offset* (wnn-server-zenkouho bunsetu-number egg:*dai*)))
864   (let ((i (1- (setq *zenkouho-suu* (wnn-server-zenkouho-suu))))
865         (val nil))
866     (while (<= 0 i)
867       (setq val (cons (wnn-server-get-zenkouho i) val))
868       (setq i (1- i)))
869     val))
870
871 (defun bunsetu-kouho-number (bunsetu-number init)
872   (if (or init (/= (wnn-server-zenkouho-bun) bunsetu-number))
873       (setq *zenkouho-offset* (wnn-server-zenkouho bunsetu-number egg:*dai*)))
874   *zenkouho-offset*)
875
876 ;;;;
877 ;;;; User entry : henkan-region, henkan-paragraph, henkan-sentence
878 ;;;;
879
880 (defun egg:henkan-face-on ()
881   ;; Make an extent if henkan extent does not exist.
882   ;; Move henkan extent to henkan region.
883   (if egg:*henkan-face*
884       (progn
885         (if (extentp egg:*henkan-extent*)
886             (set-extent-endpoints egg:*henkan-extent* egg:*region-start* egg:*region-end*)
887           (setq egg:*henkan-extent* (make-extent egg:*region-start* egg:*region-end*))
888           (set-extent-property egg:*henkan-extent* 'start-open nil)
889           (set-extent-property egg:*henkan-extent* 'end-open nil)
890           (set-extent-property egg:*henkan-extent* 'detachable nil))
891         (set-extent-face egg:*henkan-extent* egg:*henkan-face*))))
892
893 (defun egg:henkan-face-off ()
894   ;; detach henkan extent from the current buffer.
895   (and egg:*henkan-face*
896        (extentp egg:*henkan-extent*)
897        (detach-extent egg:*henkan-extent*) ))
898
899
900 (defun henkan-region (start end)
901   "Convert a text in the region between START and END from kana to kanji."
902   (interactive "r")
903   (if (interactive-p) (set-mark (point))) ;;; to be fixed
904   (henkan-region-internal start end))
905
906 (defun gyaku-henkan-region (start end)
907   "Convert a text in the region between START and END from kanji to kana."
908   (interactive "r")
909   (if (interactive-p) (set-mark (point))) ;;; to be fixed
910   (henkan-region-internal start end t))
911
912 ;(defvar henkan-mode-indicator "\e$B4A\e(B")
913
914 (defun henkan-region-internal (start end &optional rev)
915   ;; region \e$B$r$+$J4A;zJQ49$9$k\e(B
916   (if egg:henkan-mode-in-use nil
917     (let ((finished nil))
918       (unwind-protect
919           (progn
920             (setq egg:henkan-mode-in-use t)
921             (if (null (wnn-server-isconnect)) (EGG:open-wnn))
922             (setq egg:*kanji-kanabuff* (buffer-substring start end))
923             ;;; for Wnn6
924             (if (and (is-wnn6-server)
925                      (not (and 
926                            egg:*henkan-fence-mode*
927                            *in-cont-flag*)))
928                 (progn
929                   (wnn6-reset-prev-info)))
930
931             (setq *bunsetu-number* 0)
932             (setq egg:*dai* t)          ; 92.9.8 by T.shingu
933             (wnn-server-set-rev rev)
934             (let ((result (wnn-server-henkan-begin egg:*kanji-kanabuff*)))
935               (if (null result)
936                   (egg:error (wnn-server-get-msg))
937                 (if  (> result 0)
938                     (progn
939                       (mode-line-egg-mode-update (egg:msg-get 'henkan-mode-indicator))
940                       (goto-char start)
941                       (or (markerp egg:*region-start*)
942                           (setq egg:*region-start* (make-marker)))
943                       (or (markerp egg:*region-end*)
944                           (set-marker-insertion-type
945                            (setq egg:*region-end* (make-marker)) t))
946                       (if (null (marker-position egg:*region-start*))
947                           (progn
948                             ;;;(setq egg:*global-map-backup* (current-global-map))
949                             ;;(setq egg:*local-map-backup* (current-local-map))
950                             ;;(and (boundp 'disable-undo) (setq disable-undo t))
951                             (delete-region start end)
952                             (suspend-undo)
953                             (goto-char start)
954                             (insert egg:*henkan-open*)
955                             (set-marker egg:*region-start* (point))
956                             (insert egg:*henkan-close*)
957                             (set-marker egg:*region-end* egg:*region-start*)
958                             (goto-char egg:*region-start*)
959                             )
960                         (progn
961                           (egg:fence-face-off)
962                           (delete-region (- egg:*region-start* (length egg:*fence-open*)) 
963                                          egg:*region-start*)
964                           (delete-region egg:*region-end*
965                                          (+ egg:*region-end* (length egg:*fence-close*)))
966                           (goto-char egg:*region-start*)
967                           (insert egg:*henkan-open*)
968                           (set-marker egg:*region-start* (point))
969                           (goto-char egg:*region-end*)
970                           (let ((point (point)))
971                             (insert egg:*henkan-close*)
972                             (set-marker egg:*region-end* point))
973                           (goto-char start)
974                           (delete-region start end)
975                           ))
976                       (henkan-insert-kouho 0 result)
977                       (egg:henkan-face-on)
978                       (egg:bunsetu-face-on)
979                       (henkan-goto-bunsetu 0)
980                       ;;;(use-global-map henkan-mode-map)
981                       ;;;(use-local-map nil)
982                       ;;(use-local-map henkan-mode-map)
983                       (run-hooks 'egg:henkan-start-hook)))))
984             (setq finished t))
985         (or finished
986             ;;(setq disable-undo nil)
987             (setq egg:henkan-mode-in-use nil)
988             (resume-undo-list)))))
989   )
990
991 (defun henkan-paragraph ()
992   "Convert the current paragraph from kana to kanji."
993   (interactive)
994   (forward-paragraph)
995   (let ((end (point)))
996     (backward-paragraph)
997     (henkan-region-internal (point) end)))
998
999 (defun gyaku-henkan-paragraph ()
1000   "Convert the current paragraph from kanji to kana."
1001   (interactive)
1002   (forward-paragraph)
1003   (let ((end (point)))
1004     (backward-paragraph)
1005     (henkan-region-internal (point) end t)))
1006
1007 (defun henkan-sentence ()
1008   "Convert the current sentence from kana to kanji."
1009   (interactive)
1010   (forward-sentence)
1011   (let ((end (point)))
1012     (backward-sentence)
1013     (henkan-region-internal (point) end)))
1014
1015 (defun gyaku-henkan-sentence ()
1016   "Convert the current sentence from kanji to kana."
1017   (interactive)
1018   (forward-sentence)
1019   (let ((end (point)))
1020     (backward-sentence)
1021     (henkan-region-internal (point) end t)))
1022
1023 (defun henkan-word ()
1024   "Convert the current word from kana to kanji."
1025   (interactive)
1026   (re-search-backward "\\<" nil t)
1027   (let ((start (point)))
1028     (re-search-forward "\\>" nil t)
1029     (henkan-region-internal start (point))))
1030
1031 (defun gyaku-henkan-word ()
1032   "Convert the current word from kanji to kana."
1033   (interactive)
1034   (re-search-backward "\\<" nil t)
1035   (let ((start (point)))
1036     (re-search-forward "\\>" nil t)
1037     (henkan-region-internal start (point) t)))
1038
1039 ;;;
1040 ;;; Kana Kanji Henkan Henshuu mode
1041 ;;;
1042
1043 (defun set-egg-henkan-mode-format (open close kugiri-dai kugiri-sho
1044                                         &optional henkan-face dai-bunsetu-face sho-bunsetu-face)
1045    "\e$BJQ49\e(B mode \e$B$NI=<(J}K!$r@_Dj$9$k!#\e(BOPEN \e$B$OJQ49$N;OE@$r<($9J8;zNs$^$?$O\e(B nil\e$B!#\e(B
1046 CLOSE\e$B$OJQ49$N=*E@$r<($9J8;zNs$^$?$O\e(B nil\e$B!#\e(B
1047 KUGIRI-DAI\e$B$OBgJ8@a$N6h@Z$j$rI=<($9$kJ8;zNs$^$?$O\e(B nil\e$B!#\e(B
1048 KUGIRI-SHO\e$B$O>.J8@a$N6h@Z$j$rI=<($9$kJ8;zNs$^$?$O\e(B nil\e$B!#\e(B
1049 optional HENKAN-FACE \e$B$OJQ496h4V$rI=<($9$k\e(B face \e$B$^$?$O\e(B nil
1050 optional DAI-BUNSETU-FACE \e$B$OBgJ8@a6h4V$rI=<($9$k\e(B face \e$B$^$?$O\e(B nil
1051 optional SHO-BUNSETU-FACE \e$B$O>.J8@a6h4V$rI=<($9$k\e(B face \e$B$^$?$O\e(B nil"
1052
1053   (interactive (list (read-string (egg:msg-get 'begin-henkan))
1054                      (read-string (egg:msg-get 'end-henkan))
1055                      (read-string (egg:msg-get 'kugiri-dai))
1056                      (read-string (egg:msg-get 'kugiri-sho))
1057                      (cdr (assoc (completing-read (egg:msg-get 'face-henkan)
1058                                                   egg:*face-alist*)
1059                                  egg:*face-alist*))
1060                      (cdr (assoc (completing-read (egg:msg-get 'face-dai)
1061                                                   egg:*face-alist*)
1062                                  egg:*face-alist*))
1063                      (cdr (assoc (completing-read (egg:msg-get 'face-sho)
1064                                                   egg:*face-alist*)
1065                                  egg:*face-alist*))
1066                      ))
1067   (if (or (stringp open)  (null open))
1068       (setq egg:*henkan-open* open)
1069     (egg:error "Wrong type of arguments(open): %s" open))
1070
1071   (if (or (stringp close) (null close))
1072       (setq egg:*henkan-close* close)
1073     (egg:error "Wrong type of arguments(close): %s" close))
1074
1075   (if (or (stringp kugiri-dai) (null kugiri-dai))
1076       (setq egg:*dai-bunsetu-kugiri* (or kugiri-dai ""))
1077     (egg:error "Wrong type of arguments(kugiri-dai): %s" kugiri-dai))
1078
1079   (if (or (stringp kugiri-sho) (null kugiri-sho))
1080       (setq egg:*sho-bunsetu-kugiri* (or kugiri-sho ""))
1081     (egg:error "Wrong type of arguments(kugiri-sho): %s" kugiri-sho))
1082
1083   (if (or (null henkan-face) (memq henkan-face (face-list)))
1084       (progn
1085         (setq egg:*henkan-face* henkan-face)
1086         (if (extentp egg:*henkan-extent*)
1087             (set-extent-property egg:*henkan-extent* 'face egg:*henkan-face*)))
1088     (egg:error "Wrong type of arguments(henkan-face): %s" henkan-face))
1089
1090   (if (or (null dai-bunsetu-face) (memq dai-bunsetu-face (face-list)))
1091       (progn
1092         (setq egg:*dai-bunsetu-face* dai-bunsetu-face)
1093         (if (extentp egg:*dai-bunsetu-extent*)
1094             (set-extent-property egg:*dai-bunsetu-extent* 'face egg:*dai-bunsetu-face*)))
1095     (egg:error "Wrong type of arguments(dai-bunsetu-face): %s" dai-bunsetu-face))
1096
1097   (if (or (null sho-bunsetu-face) (memq sho-bunsetu-face (face-list)))
1098       (progn
1099         (setq egg:*sho-bunsetu-face* sho-bunsetu-face)
1100         (if (extentp egg:*sho-bunsetu-extent*)
1101             (set-extent-property egg:*sho-bunsetu-extent* 'face egg:*sho-bunsetu-face*)))
1102     (egg:error "Wrong type of arguments(sho-bunsetu-face): %s" sho-bunsetu-face))
1103   )
1104
1105 (defun henkan-insert-kouho (start number)
1106   (let ((i start))
1107     (while (< i number)
1108       (insert (car (wnn-server-bunsetu-kanji i))
1109               (if (= (1+ i) number)
1110                   ""
1111                 (if (wnn-server-dai-top (1+ i))
1112                     egg:*dai-bunsetu-kugiri*
1113                   egg:*sho-bunsetu-kugiri*)))
1114       (setq i (1+ i)))))
1115
1116 (defun henkan-kakutei ()
1117   "Accept the current henkan region"
1118   (interactive)
1119   (egg:bunsetu-face-off)
1120   (egg:henkan-face-off)
1121   (setq egg:henkan-mode-in-use nil)
1122   (setq egg:*in-fence-mode* nil)
1123   (delete-region (- egg:*region-start* (length egg:*henkan-open*))
1124                  egg:*region-start*)
1125   (delete-region egg:*region-start* egg:*region-end*)
1126   (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*henkan-close*)))
1127   (goto-char egg:*region-start*)
1128   (setq egg:*sai-henkan-start* (point))
1129   (resume-undo-list)
1130   (let ((i 0) (max (wnn-server-bunsetu-suu)))
1131     (setq egg:*old-bunsetu-suu* max)
1132     (while (< i max)
1133       (insert (car (wnn-server-bunsetu-kanji i )))
1134       (if (not overwrite-mode)
1135           (undo-boundary))
1136       (setq i (1+ i))
1137       ))
1138   (setq egg:*sai-henkan-end* (point))
1139   (wnn-server-hindo-update)
1140   (egg:quit-egg-mode)
1141   (run-hooks 'egg:henkan-end-hook)
1142   )
1143
1144 ;; 92.7.10 by K.Handa
1145 (defun henkan-kakutei-first-char ()
1146   "\e$B3NDjJ8;zNs$N:G=i$N0lJ8;z$@$1A^F~$9$k!#\e(B"
1147   (interactive)
1148   (egg:bunsetu-face-off)
1149   (egg:henkan-face-off)
1150   (setq egg:henkan-mode-in-use nil)
1151   (setq egg:*in-fence-mode* nil)
1152   (delete-region (- egg:*region-start* (length egg:*henkan-open*))
1153                  egg:*region-start*)
1154   (delete-region egg:*region-start* egg:*region-end*)
1155   (delete-region egg:*region-end* (+ egg:*region-end*
1156                                      ;; 92.8.5  by Y.Kasai
1157                                      (length egg:*henkan-close*)))
1158   (goto-char egg:*region-start*)
1159   (resume-undo-list)
1160   (insert (car (wnn-server-bunsetu-kanji 0)))
1161   (if (not overwrite-mode)
1162       (undo-boundary))
1163   (goto-char egg:*region-start*)
1164   (forward-char 1)
1165   (delete-region (point) egg:*region-end*)
1166   (wnn-server-hindo-update)
1167   (egg:quit-egg-mode)
1168   )
1169 ;; end of patch
1170
1171 (defun henkan-kakutei-before-point ()
1172 "Accept the henkan region before point, and put the rest back into a fence."
1173   (interactive)
1174   (egg:bunsetu-face-off)
1175   (egg:henkan-face-off)
1176   (delete-region egg:*region-start* egg:*region-end*)
1177   (goto-char egg:*region-start*)
1178   (let ((i 0) (max *bunsetu-number*))
1179     (while (< i max)
1180       (insert (car (wnn-server-bunsetu-kanji i )))
1181       (if (not overwrite-mode)
1182           (undo-boundary))
1183       (setq i (1+ i))
1184       ))
1185   (wnn-server-hindo-update *bunsetu-number*)
1186   (delete-region (- egg:*region-start* (length egg:*henkan-open*))
1187                  egg:*region-start*)
1188   (insert egg:*fence-open*)
1189   (set-marker egg:*region-start* (point))
1190   (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*henkan-close*)))
1191   (goto-char egg:*region-end*)
1192   (let ((point (point)))
1193     (insert egg:*fence-close*)
1194     (set-marker egg:*region-end* point))
1195   (goto-char egg:*region-start*)
1196   (egg:fence-face-on)
1197   (let ((point (point))
1198         (i *bunsetu-number*) (max (wnn-server-bunsetu-suu)))
1199     (while (< i max)
1200       (insert (car (wnn-server-bunsetu-yomi i)))
1201       (setq i (1+ i)))
1202     ;;;(insert "|")
1203     ;;;(insert egg:*fence-close*)
1204     ;;;(set-marker egg:*region-end* (point))
1205     (goto-char point))
1206   (setq egg:*mode-on* t)
1207   ;;;(use-global-map fence-mode-map)
1208   ;;;(use-local-map  nil)
1209   (setq egg:henkan-mode-in-use nil)
1210   ;;(use-local-map fence-mode-map)
1211   (egg:mode-line-display))
1212
1213 ;; ### Should probably put this on a key.
1214 (defun sai-henkan ()
1215 "Reconvert last henkan entry."
1216   (interactive)
1217   (if egg:henkan-mode-in-use nil
1218     (let ((finished nil))
1219       (unwind-protect
1220        (progn
1221          (setq egg:henkan-mode-in-use t)
1222          (mode-line-egg-mode-update (egg:msg-get 'henkan-mode-indicator))
1223          (goto-char egg:*sai-henkan-start*)
1224          ;;(setq egg:*local-map-backup* (current-local-map))
1225          ;;(and (boundp 'disable-undo) (setq disable-undo t))
1226          (delete-region egg:*sai-henkan-start* egg:*sai-henkan-end*)
1227          (suspend-undo)
1228          (goto-char egg:*sai-henkan-start*)
1229          (insert egg:*henkan-open*)
1230          (set-marker egg:*region-start* (point))
1231          (insert egg:*henkan-close*)
1232          (set-marker egg:*region-end* egg:*region-start*)
1233          (goto-char egg:*region-start*)
1234          (henkan-insert-kouho 0 egg:*old-bunsetu-suu*)
1235          (egg:henkan-face-on)
1236          (egg:bunsetu-face-on)
1237          (henkan-goto-bunsetu 0)
1238          ;;(use-local-map henkan-mode-map)
1239          (setq finished t))
1240        (or finished
1241            ;;(setq disable-undo nil)
1242            (setq egg:henkan-mode-in-use nil)
1243            (resume-undo-list)))))
1244   )
1245
1246 (defun egg:bunsetu-face-on ()
1247   ;; make dai-bunsetu extent and sho-bunsetu extent if they do not exist.
1248   ;; put their faces to extents and move them to each bunsetu.
1249   (let* ((bunsetu-begin *bunsetu-number*)
1250          (bunsetu-end))
1251 ;        (bunsetu-suu (wnn-server-bunsetu-suu)))
1252 ; dai bunsetu
1253     (if egg:*dai-bunsetu-face*
1254         (progn
1255           (if (extentp egg:*dai-bunsetu-extent*)
1256               nil
1257             (setq egg:*dai-bunsetu-extent* (make-extent 1 1))
1258             (set-extent-property egg:*dai-bunsetu-extent* 'face egg:*dai-bunsetu-face*))
1259           (setq bunsetu-end (wnn-server-dai-end *bunsetu-number*))
1260           (while (not (wnn-server-dai-top bunsetu-begin))
1261             (setq bunsetu-begin (1- bunsetu-begin)))
1262           (set-extent-endpoints egg:*dai-bunsetu-extent*
1263                         (bunsetu-position bunsetu-begin)
1264                         (+ (bunsetu-position (1- bunsetu-end))
1265                            (length (bunsetu-kanji (1- bunsetu-end)))))))
1266 ; sho bunsetu
1267     (if egg:*sho-bunsetu-face*
1268         (progn
1269           (if (extentp egg:*sho-bunsetu-extent*)
1270                nil
1271             (setq egg:*sho-bunsetu-extent* (make-extent 1 1))
1272             (set-extent-property egg:*sho-bunsetu-extent* 'face egg:*sho-bunsetu-face*))
1273           (setq bunsetu-end (1+ *bunsetu-number*))
1274           (set-extent-endpoints egg:*sho-bunsetu-extent*
1275                         (let ((point (bunsetu-position *bunsetu-number*)))
1276 ;; ###jhod Removed the char-boundary stuff, as I *THINK* we can only move by whole chars...
1277 ;;                        (if (eq egg:*sho-bunsetu-face* 'modeline)
1278 ;;                            (+ point (1+ (char-boundary-p point)))
1279 ;;                          point))
1280                           (if (eq egg:*sho-bunsetu-face* 'modeline)
1281                               (+ point 1)
1282                             point))
1283
1284                         (+ (bunsetu-position (1- bunsetu-end))
1285                            (length (bunsetu-kanji (1- bunsetu-end)))))))))
1286
1287 (defun egg:bunsetu-face-off ()
1288   (and egg:*dai-bunsetu-face*
1289        (extentp egg:*dai-bunsetu-extent*)
1290        (detach-extent egg:*dai-bunsetu-extent*))
1291   (and egg:*sho-bunsetu-face*
1292        (extentp egg:*sho-bunsetu-extent*)
1293        (detach-extent egg:*sho-bunsetu-extent*))
1294   )
1295
1296 (defun henkan-goto-bunsetu (number)
1297   (setq *bunsetu-number*
1298         (check-number-range number 0 (1- (wnn-server-bunsetu-suu))))
1299   (goto-char (bunsetu-position *bunsetu-number*))
1300 ;  (egg:move-bunsetu-extent)
1301   (egg:bunsetu-face-on)
1302   )
1303
1304 (defun henkan-forward-bunsetu ()
1305   (interactive)
1306   (henkan-goto-bunsetu (1+ *bunsetu-number*))
1307   )
1308
1309 (defun henkan-backward-bunsetu ()
1310   (interactive)
1311   (henkan-goto-bunsetu (1- *bunsetu-number*))
1312   )
1313
1314 (defun henkan-first-bunsetu ()
1315   (interactive)
1316   (henkan-goto-bunsetu 0))
1317
1318 (defun henkan-last-bunsetu ()
1319   (interactive)
1320   (henkan-goto-bunsetu (1- (wnn-server-bunsetu-suu)))
1321   )
1322  
1323 (defun check-number-range (i min max)
1324   (cond((< i min) max)
1325        ((< max i) min)
1326        (t i)))
1327
1328 (defun henkan-hiragana ()
1329   (interactive)
1330   (henkan-goto-kouho (- (bunsetu-kouho-suu *bunsetu-number* nil) 1)))
1331
1332 (defun henkan-katakana ()
1333   (interactive)
1334   (henkan-goto-kouho (- (bunsetu-kouho-suu *bunsetu-number* nil) 2)))
1335
1336 (defun henkan-next-kouho ()
1337   (interactive)
1338   (henkan-goto-kouho (1+ (bunsetu-kouho-number *bunsetu-number* nil))))
1339
1340 (defun henkan-next-kouho-dai ()
1341   (interactive)
1342   (let ((init (not egg:*dai*)))
1343     (setq egg:*dai* t)
1344     (henkan-goto-kouho (1+ (bunsetu-kouho-number *bunsetu-number* init)))))
1345
1346 (defun henkan-next-kouho-sho ()
1347   (interactive)
1348   (let ((init egg:*dai*))
1349     (setq egg:*dai* nil)
1350     (henkan-goto-kouho (1+ (bunsetu-kouho-number *bunsetu-number* init)))))
1351   
1352 (defun henkan-previous-kouho ()
1353   (interactive)
1354   (henkan-goto-kouho (1- (bunsetu-kouho-number *bunsetu-number* nil))))
1355
1356 (defun henkan-previous-kouho-dai ()
1357   (interactive)
1358   (let ((init (not egg:*dai*)))
1359     (setq egg:*dai* t)
1360     (henkan-goto-kouho (1- (bunsetu-kouho-number *bunsetu-number* init)))))
1361
1362 (defun henkan-previous-kouho-sho ()
1363   (interactive)
1364   (let ((init egg:*dai*))
1365     (setq egg:*dai* nil)
1366     (henkan-goto-kouho (1- (bunsetu-kouho-number *bunsetu-number* init)))))
1367
1368 (defun henkan-goto-kouho (kouho-number)
1369 ;  (egg:bunsetu-face-off)
1370   (let ((point (point))
1371 ;       (yomi  (bunsetu-yomi *bunsetu-number*))
1372         (max)
1373         (min))
1374     (setq kouho-number 
1375           (check-number-range kouho-number 
1376                               0
1377                               (1- (length (bunsetu-kouho-list
1378                                            *bunsetu-number* nil)))))
1379     (setq *zenkouho-offset* kouho-number)
1380     (wnn-server-henkan-kakutei kouho-number egg:*dai*)
1381     (setq max (wnn-server-bunsetu-suu))
1382     (setq min (max 0 (1- *bunsetu-number*)))
1383     (delete-region 
1384      (bunsetu-position min) egg:*region-end*)
1385     (goto-char (bunsetu-position min))
1386     (henkan-insert-kouho min max)
1387     (goto-char point))
1388 ;  (egg:move-bunsetu-extent)
1389   (egg:bunsetu-face-on)
1390   (egg:henkan-face-on)
1391   )
1392   
1393 (defun henkan-bunsetu-chijime-dai ()
1394   (interactive)
1395   (setq egg:*dai* t)
1396   (or (= (bunsetu-length *bunsetu-number*) 1)
1397       (bunsetu-length-henko (1-  (bunsetu-length *bunsetu-number*)))))
1398
1399 (defun henkan-bunsetu-chijime-sho ()
1400   (interactive)
1401   (setq egg:*dai* nil)
1402   (or (= (bunsetu-length-sho *bunsetu-number*) 1)
1403       (bunsetu-length-henko (1-  (bunsetu-length-sho *bunsetu-number*)))))
1404
1405 (defun henkan-bunsetu-nobasi-dai ()
1406   (interactive)
1407   (setq egg:*dai* t)
1408   (let ((i *bunsetu-number*)
1409         (max (wnn-server-bunsetu-suu))
1410         (len (bunsetu-length *bunsetu-number*))
1411         (maxlen 0))
1412     (while (< i max)
1413       (setq maxlen (+ maxlen (cdr (wnn-server-bunsetu-yomi i))))
1414       (setq i (1+ i)))
1415     (if (not (= len maxlen))
1416         (bunsetu-length-henko (1+ len)))))
1417
1418 (defun henkan-bunsetu-nobasi-sho ()
1419   (interactive)
1420   (setq egg:*dai* nil)
1421   (let ((i *bunsetu-number*)
1422         (max (wnn-server-bunsetu-suu))
1423         (len (bunsetu-length-sho *bunsetu-number*))
1424         (maxlen 0))
1425     (while (< i max)
1426       (setq maxlen (+ maxlen (cdr (wnn-server-bunsetu-yomi i))))
1427       (setq i (1+ i)))
1428     (if (not (= len maxlen))
1429         (bunsetu-length-henko (1+ len)))))
1430
1431 ;  (if (not (= (1+ *bunsetu-number*) (wnn-server-bunsetu-suu)))
1432 ;      (bunsetu-length-henko (1+ (bunsetu-length *bunsetu-number*)))))
1433
1434
1435 (defun henkan-saishou-bunsetu ()
1436   (interactive)
1437   (bunsetu-length-henko 1))
1438
1439 (defun henkan-saichou-bunsetu ()
1440   (interactive)
1441   (let ((max (wnn-server-bunsetu-suu)) (i *bunsetu-number*)
1442         (l 0))
1443     (while (< i max)
1444       (setq l (+ l (bunsetu-length-sho i)))
1445       (setq i (1+ i)))
1446     (bunsetu-length-henko l)))
1447
1448 (defun bunsetu-length-henko (length)
1449   (let ((r (wnn-server-bunsetu-henkou *bunsetu-number* length egg:*dai*))
1450         (start (max 0 (1- *bunsetu-number*))))
1451     (cond((null r)
1452           (egg:error (wnn-server-get-msg)))
1453          ((> r 0)
1454 ;         (egg:henkan-face-off)
1455 ;         (egg:bunsetu-face-off)
1456           (delete-region 
1457            (bunsetu-position start) egg:*region-end*)
1458           (goto-char (bunsetu-position start))
1459           (henkan-insert-kouho start r)
1460           (henkan-goto-bunsetu *bunsetu-number*)))))
1461
1462 (defun henkan-quit ()
1463   (interactive)
1464   (egg:bunsetu-face-off)
1465   (egg:henkan-face-off)
1466   (delete-region (- egg:*region-start* (length egg:*henkan-open*))
1467                  egg:*region-start*)
1468   (delete-region egg:*region-start* egg:*region-end*)
1469   (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*henkan-close*)))
1470   (goto-char egg:*region-start*)
1471   (insert egg:*fence-open*)
1472   (set-marker egg:*region-start* (point))
1473   (insert egg:*kanji-kanabuff*)
1474   (let ((point (point)))
1475     (insert egg:*fence-close*)
1476     (set-marker egg:*region-end* point)
1477     )
1478   (goto-char egg:*region-end*)
1479   (egg:fence-face-on)
1480   (wnn-server-henkan-quit)
1481   (setq egg:*mode-on* t)
1482   ;;;(use-global-map fence-mode-map)
1483   ;;;(use-local-map  nil)
1484   (setq egg:henkan-mode-in-use nil)
1485   ;;(use-local-map fence-mode-map)
1486   (setq egg:*in-fence-mode* t)
1487   (egg:mode-line-display)
1488   )
1489
1490 (defun henkan-select-kouho (init)
1491   (if (not (eq (selected-window) (minibuffer-window)))
1492       (let ((kouho-list (bunsetu-kouho-list *bunsetu-number* init))
1493             menu)
1494         (setq menu
1495               (list 'menu (egg:msg-get 'jikouho)
1496                     (let ((l kouho-list) (r nil) (i 0))
1497                       (while l
1498                         (setq r (cons (cons (car l) i) r))
1499                         (setq i (1+ i))
1500                         (setq l (cdr l)))
1501                       (reverse r))))
1502         (henkan-goto-kouho 
1503          (menu:select-from-menu menu 
1504                                 (bunsetu-kouho-number *bunsetu-number* nil))))
1505     (beep)))
1506
1507 (defun henkan-select-kouho-dai ()
1508   (interactive)
1509   (let ((init (not egg:*dai*)))
1510     (setq egg:*dai* t)
1511     (henkan-select-kouho init)))
1512
1513 (defun henkan-select-kouho-sho ()
1514   (interactive)
1515   (let ((init egg:*dai*))
1516     (setq egg:*dai* nil)
1517     (henkan-select-kouho init)))
1518
1519 (defun henkan-word-off ()
1520   (interactive)
1521   (let ((info (wnn-server-inspect *bunsetu-number*)))
1522     (if (null info)
1523         (notify (wnn-server-get-msg))
1524       (progn
1525         (let ((dic-list (wnn-server-dict-list)))
1526           (if (null dic-list)
1527               (notify (wnn-server-get-msg))
1528             (progn
1529               (let* ((kanji (nth 0 info))
1530                      (yomi (nth 1 info))
1531                      (serial   (nth 3 info))
1532                      (jisho-no (nth 2 info))
1533                      (jisho-name (nth 2 (assoc jisho-no dic-list))))
1534                 (if (wnn-server-word-use jisho-no serial)
1535                     (notify (egg:msg-get 'off-msg)
1536                             kanji yomi jisho-name serial)
1537                   (egg:error (wnn-server-get-msg)))))))))))
1538
1539 (defun henkan-kakutei-and-self-insert ()
1540   (interactive)
1541   (setq unread-command-events (list last-command-event))
1542   (henkan-kakutei))
1543
1544 (defvar henkan-mode-map (make-sparse-keymap))
1545 (set-keymap-default-binding henkan-mode-map 'undefined)
1546
1547 (let ((ch 32))
1548   (while (< ch 127)
1549     (define-key henkan-mode-map (char-to-string ch) 'henkan-kakutei-and-self-insert)
1550     (setq ch (1+ ch))))
1551
1552 (define-key henkan-mode-map "\ei" 'henkan-bunsetu-chijime-sho)
1553 (define-key henkan-mode-map "\eo" 'henkan-bunsetu-nobasi-sho)
1554 (define-key henkan-mode-map "\es" 'henkan-select-kouho-dai)
1555 (define-key henkan-mode-map "\eh" 'henkan-hiragana)
1556 (define-key henkan-mode-map "\ek" 'henkan-katakana)
1557 (define-key henkan-mode-map "\ez" 'henkan-select-kouho-sho)
1558 (define-key henkan-mode-map "\e<" 'henkan-saishou-bunsetu)
1559 (define-key henkan-mode-map "\e>" 'henkan-saichou-bunsetu)
1560
1561 ;(define-key henkan-mode-map " "    'henkan-next-kouho-dai)
1562                                         ; 92.9.8 by T.Shingu
1563 (define-key henkan-mode-map " "    'henkan-next-kouho)
1564                                         ; 92.7.10 by K.Handa
1565 (define-key henkan-mode-map "\C-@" 'henkan-kakutei-first-char)
1566 (define-key henkan-mode-map [?\C-\ ] 'henkan-kakutei-first-char)
1567 (define-key henkan-mode-map "\C-a" 'henkan-first-bunsetu)
1568 (define-key henkan-mode-map "\C-b" 'henkan-backward-bunsetu)
1569 (define-key henkan-mode-map "\C-c" 'henkan-quit)
1570 (define-key henkan-mode-map "\C-e" 'henkan-last-bunsetu)
1571 (define-key henkan-mode-map "\C-f" 'henkan-forward-bunsetu)
1572 (define-key henkan-mode-map "\C-g" 'henkan-quit)
1573 (define-key henkan-mode-map "\C-h" 'henkan-help-command)
1574 (define-key henkan-mode-map "\C-i" 'henkan-bunsetu-chijime-dai)
1575 (define-key henkan-mode-map "\C-k" 'henkan-kakutei-before-point)
1576 (define-key henkan-mode-map "\C-l" 'henkan-kakutei)
1577 (define-key henkan-mode-map "\C-m" 'henkan-kakutei)
1578 (define-key henkan-mode-map "\C-n" 'henkan-next-kouho)
1579 (define-key henkan-mode-map "\C-o" 'henkan-bunsetu-nobasi-dai)
1580 (define-key henkan-mode-map "\C-p" 'henkan-previous-kouho)
1581 (define-key henkan-mode-map "\C-t"  'toroku-henkan-mode)
1582 (define-key henkan-mode-map "\C-v" 'henkan-inspect-bunsetu)
1583 (define-key henkan-mode-map "\C-w" 'henkan-next-kouho-dai)
1584 (define-key henkan-mode-map "\C-z" 'henkan-next-kouho-sho)
1585 (define-key henkan-mode-map "\177" 'henkan-quit)
1586 (define-key henkan-mode-map [backspace] 'henkan-quit)
1587 (define-key henkan-mode-map [clear]     'henkan-quit)
1588 (define-key henkan-mode-map [delete]    'henkan-quit)
1589 (define-key henkan-mode-map [down]      'henkan-next-kouho)
1590 (define-key henkan-mode-map [help]      'henkan-help-command)
1591 (define-key henkan-mode-map [kp-enter]  'henkan-kakutei)
1592 (define-key henkan-mode-map [kp-down]   'henkan-next-kouho)
1593 (define-key henkan-mode-map [kp-left]   'henkan-backward-bunsetu)
1594 (define-key henkan-mode-map [kp-right]  'henkan-forward-bunsetu)
1595 (define-key henkan-mode-map [kp-up]     'henkan-previous-kouho)
1596 (define-key henkan-mode-map [left]      'henkan-backward-bunsetu)
1597 (define-key henkan-mode-map [next]      'henkan-next-kouho)
1598 (define-key henkan-mode-map [prior]     'henkan-previous-kouho)
1599 (define-key henkan-mode-map [return]    'henkan-kakutei)
1600 (define-key henkan-mode-map [right]     'henkan-forward-bunsetu)
1601 (define-key henkan-mode-map [up]        'henkan-previous-kouho)
1602
1603 (unless (assq 'egg:henkan-mode-in-use minor-mode-map-alist)
1604   (setq minor-mode-map-alist
1605         (cons (cons 'egg:henkan-mode-in-use henkan-mode-map)
1606               minor-mode-map-alist)))
1607
1608 (defun henkan-help-command ()
1609   "Display documentation for henkan-mode."
1610   (interactive)
1611   (let ((buf "*Help*"))
1612     (if (eq (get-buffer buf) (current-buffer))
1613         (henkan-quit)
1614       (with-output-to-temp-buffer buf
1615         ;;(princ (substitute-command-keys henkan-mode-document-string))
1616         (princ (substitute-command-keys (egg:msg-get 'henkan-help)))
1617         (print-help-return-message)))))
1618
1619 ;;;----------------------------------------------------------------------
1620 ;;;
1621 ;;; Dictionary management Facility
1622 ;;;
1623 ;;;----------------------------------------------------------------------
1624
1625 ;;;
1626 ;;; \e$B<-=qEPO?\e(B 
1627 ;;;
1628
1629 ;;;;
1630 ;;;; User entry: toroku-region
1631 ;;;;
1632
1633 (defun remove-regexp-in-string (regexp string)
1634   (cond((not(string-match regexp string))
1635         string)
1636        (t(let ((str nil)
1637              (ostart 0)
1638              (oend   (match-beginning 0))
1639              (nstart (match-end 0)))
1640          (setq str (concat str (substring string ostart oend)))
1641          (while (string-match regexp string nstart)
1642            (setq ostart nstart)
1643            (setq oend   (match-beginning 0))
1644            (setq nstart (match-end 0))
1645            (setq str (concat str (substring string ostart oend))))
1646          (concat str (substring string nstart))))))
1647
1648 (defun hinsi-from-menu (dict-number name)
1649   (let ((result (wnn-server-hinsi-list dict-number name))
1650 ;       (hinsi-pair)
1651         (menu))
1652     (if (null result)
1653         (egg:error (wnn-server-get-msg))
1654       (if (eq result 0)
1655           name
1656         (progn
1657 ;         (setq hinsi-pair (mapcar '(lambda (x) (cons x x)) result))
1658 ;         (if (null (string= name "/"))
1659 ;             (setq hinsi-pair (cons (cons "/" "/") hinsi-pair)))
1660 ;         (setq menu (list 'menu (egg:msg-get 'hinsimei) hinsi-pair))
1661           (setq menu (list 'menu (egg:msg-get 'hinsimei)
1662                            (if (string= name "/")
1663                                result
1664                              (cons "/" result))))
1665           (hinsi-from-menu dict-number 
1666                            (menu:select-from-menu menu)))))))
1667
1668 (defun wnn-dict-name (dict-number dict-list)
1669   (let* ((dict-info (assoc dict-number dict-list))
1670          (dict-comment (nth 2 dict-info)))
1671     (if (string= dict-comment "")
1672         (file-name-nondirectory (nth 1 dict-info))
1673       dict-comment)))
1674
1675 (defun egg:toroku-word (yomi kanji interactive)
1676   (let*((dic-list (wnn-server-dict-list))
1677         (writable-dic-list (wnn-server-hinsi-dicts -1))
1678         (dict-number
1679          (menu:select-from-menu
1680           (list 'menu (egg:msg-get 'touroku-jishomei)
1681                 (delq nil
1682                       (mapcar '(lambda (x)
1683                                  (let ((y (car (assoc x dic-list))))
1684                                    (if y
1685                                        (cons (wnn-dict-name y dic-list) y))))
1686                               writable-dic-list)))))
1687         (hinsi-name (hinsi-from-menu dict-number "/"))
1688         (hinsi-no (wnn-server-hinsi-number hinsi-name))
1689         (dict-name (wnn-dict-name dict-number dic-list)))
1690     (if (or (not interactive)
1691             (notify-yes-or-no-p (egg:msg-get 'register-notify)
1692                                 kanji yomi hinsi-name dict-name))
1693         (if (wnn-server-word-add dict-number kanji yomi "" hinsi-no)
1694             (notify (egg:msg-get 'registerd) kanji yomi hinsi-name dict-name)
1695           (egg:error (wnn-server-get-msg))))))
1696
1697 (defun toroku-region (start end)
1698   (interactive "r")
1699   (if (null (wnn-server-isconnect)) (EGG:open-wnn))
1700   (wnn-server-set-rev nil)
1701   (let*((kanji
1702          (remove-regexp-in-string "[\0-\37]" (buffer-substring start end)))
1703         (yomi (read-current-its-string
1704                (format (egg:msg-get 'jishotouroku-yomi) kanji))))
1705     (egg:toroku-word yomi kanji nil)))
1706
1707 (defun delete-space (string)
1708   (let ((len (length string)))
1709     (if (eq len 0) ""
1710       (if (or (char-equal (aref string 0) ? ) (char-equal (aref string 0) ?-)) 
1711           (delete-space (substring string 1))
1712         (concat (substring string 0 1) (delete-space (substring string 1)))))))
1713
1714
1715 (defun toroku-henkan-mode ()
1716   (interactive)
1717   (let*((kanji   
1718          (read-current-its-string (egg:msg-get 'kanji)
1719                                (delete-space 
1720                                 (buffer-substring (point) egg:*region-end* ))))
1721         (yomi (read-current-its-string
1722                (format (egg:msg-get 'jishotouroku-yomi) kanji)
1723                (let ((str "")
1724                      (i *bunsetu-number*) 
1725                      (max (wnn-server-bunsetu-suu)))
1726                  (while (< i max)
1727                    (setq str (concat str (car (wnn-server-bunsetu-yomi i)) ))
1728                    (setq i (1+ i)))
1729                  str))))
1730     (egg:toroku-word yomi kanji nil)))
1731
1732 ;;;
1733 ;;; \e$B<-=qJT=87O\e(B DicEd
1734 ;;;
1735
1736 (defvar *diced-window-configuration* nil)
1737
1738 (defvar *diced-dict-info* nil)
1739
1740 (defvar *diced-yomi* nil)
1741
1742 ;;;;;
1743 ;;;;; User entry : edit-dict-item
1744 ;;;;;
1745
1746 (defun edit-dict-item (yomi)
1747   (interactive (list (read-current-its-string (egg:msg-get 'yomi))))
1748   (if (null (wnn-server-isconnect)) (EGG:open-wnn))
1749   (wnn-server-set-rev nil)
1750   (let ((dict-info (wnn-server-word-search yomi))
1751         (current-wnn-server-type))
1752     (if (null dict-info)
1753         (message (egg:msg-get 'no-yomi) yomi)
1754       (progn
1755         (setq current-wnn-server-type wnn-server-type)
1756         (setq *diced-yomi* yomi)
1757         (setq *diced-window-configuration* (current-window-configuration))
1758         (pop-to-buffer "*Nihongo Dictionary Information*")
1759         (setq wnn-server-type current-wnn-server-type)
1760         (setq major-mode 'diced-mode)
1761         (setq mode-name "Diced")
1762         (setq mode-line-buffer-identification 
1763               (concat "DictEd: " yomi
1764                       (make-string  (max 0 (- 17 (string-width yomi))) ?  )))
1765         (sit-for 0) ;; will redislay.
1766         ;;;(use-global-map diced-mode-map)
1767         (use-local-map diced-mode-map)
1768         (diced-display dict-info)
1769         ))))
1770
1771 (defun diced-redisplay ()
1772   (wnn-server-set-rev nil)
1773   (let ((dict-info (wnn-server-word-search *diced-yomi*)))
1774     (if (null dict-info)
1775         (progn
1776           (message (egg:msg-get 'no-yomi) *diced-yomi*)
1777           (diced-quit))
1778       (diced-display dict-info))))
1779
1780 (defun diced-display (dict-info)
1781         ;;; (values (list (record kanji bunpo hindo dict-number serial-number)))
1782         ;;;                         0     1     2      3           4
1783   (setq dict-info
1784         (sort dict-info
1785               (function (lambda (x y)
1786                           (or (< (nth 1 x) (nth 1 y))
1787                               (if (= (nth 1 x) (nth 1 y))
1788                                   (or (> (nth 2 x) (nth 2 y))
1789                                       (if (= (nth 2 x) (nth 2 y))
1790                                           (< (nth 3 x) (nth 3 y))))))))))
1791   (setq *diced-dict-info* dict-info)
1792   (setq buffer-read-only nil)
1793   (erase-buffer)
1794   (let ((l-kanji 
1795          (apply 'max
1796                 (mapcar (function (lambda (l) (string-width (nth 0 l))))
1797                         dict-info)))
1798         (l-bunpo
1799          (apply 'max
1800                 (mapcar (function(lambda (l)
1801                                    (string-width (wnn-server-hinsi-name (nth 1 l)))))
1802                         dict-info)))
1803         (dict-list (wnn-server-dict-list))
1804         (writable-dict-list (wnn-server-hinsi-dicts -1)))
1805     (while dict-info
1806       (let*((kanji (nth 0 (car dict-info)))
1807             (bunpo (nth 1 (car dict-info)))
1808             (hinshi (wnn-server-hinsi-name bunpo))
1809             (hindo (nth 2 (car dict-info)))
1810             (dict-number (nth 3 (car dict-info)))
1811             (dict-name (wnn-dict-name dict-number dict-list))
1812             (sys-dict-p (null (memq dict-number writable-dict-list)))
1813             (serial-number (nth 4 (car dict-info))))
1814         (insert (if sys-dict-p " *" "  "))
1815         (insert kanji)
1816         (insert-char ?  
1817                      (- (+ l-kanji 10) (string-width kanji)))
1818         (insert hinshi)
1819         (insert-char ?  (- (+ l-bunpo 2) (string-width hinshi)))
1820         (insert (egg:msg-get 'jisho) (file-name-nondirectory dict-name)
1821                 "/" (int-to-string serial-number)
1822                 (egg:msg-get 'hindo) (int-to-string hindo) ?\n )
1823         (setq dict-info (cdr dict-info))))
1824     (goto-char (point-min)))
1825   (setq buffer-read-only t))
1826
1827 (defun diced-add ()
1828   (interactive)
1829   (diced-execute t)
1830   (let*((kanji  (read-from-minibuffer (egg:msg-get 'kanji))))
1831     (egg:toroku-word *diced-yomi* kanji t)
1832     (diced-redisplay)))
1833               
1834 (defun diced-delete ()
1835   (interactive)
1836   (beginning-of-line)
1837   (if (= (char-after (1+ (point))) ?* )
1838       (progn (message (egg:msg-get 'cannot-remove)) (beep))
1839     (if (= (following-char) ?  )
1840         (let ((buffer-read-only nil))
1841           (delete-char 1) (insert "D") (backward-char 1))
1842       )))
1843
1844     
1845 (defun diced-undelete ()
1846   (interactive)
1847   (beginning-of-line)
1848   (if (= (following-char) ?D)
1849       (let ((buffer-read-only nil))
1850         (delete-char 1) (insert " ") (backward-char 1))
1851     (beep)))
1852
1853 (defun diced-redisplay-hindo (dict-number serial-number)
1854   (let ((hindo))
1855     (setq buffer-read-only nil)
1856     (beginning-of-line)
1857     (re-search-forward "\\([0-9\-]+\\)\\(\n\\)")
1858     (delete-region (match-beginning 1) (match-end 1))
1859     (setq hindo (nth 3 (wnn-server-word-info dict-number serial-number)))
1860     (goto-char (match-beginning 1))
1861     (insert (int-to-string hindo))
1862     (beginning-of-line)
1863     (setq buffer-read-only t)))
1864
1865 (defun diced-use ()
1866   (interactive)
1867   (let* ((dict-item (nth 
1868                      (+ (count-lines (point-min) (point))
1869                         (if (= (current-column) 0) 1 0)
1870                         -1)
1871                     *diced-dict-info*))
1872 ;        (hindo (nth 2 dict-item))
1873          (dict-number (nth 3 dict-item))
1874          (serial-number (nth 4 dict-item))
1875          )
1876     (if (null (wnn-server-word-use dict-number serial-number))
1877         (egg:error (wnn-server-get-msg)))
1878     (diced-redisplay-hindo dict-number serial-number)))
1879
1880 (defun diced-hindo-set (&optional newhindo)
1881   (interactive)
1882   (if (null newhindo)
1883       (setq newhindo (read-expression (egg:msg-get 'enter-hindo))))
1884   (let* ((dict-item (nth 
1885                      (+ (count-lines (point-min) (point))
1886                         (if (= (current-column) 0) 1 0)
1887                         -1)
1888                     *diced-dict-info*))
1889 ;        (hindo (nth 2 dict-item))
1890          (dict-number (nth 3 dict-item))
1891          (serial-number (nth 4 dict-item))
1892          )
1893     (if (null (wnn-server-word-hindo-set dict-number serial-number newhindo))
1894         (egg:error (wnn-server-get-msg)))
1895     (diced-redisplay-hindo dict-number serial-number)))
1896
1897 (defun diced-quit ()
1898   (interactive)
1899   (setq buffer-read-only nil)
1900   (erase-buffer)
1901   (setq buffer-read-only t)
1902   (bury-buffer (get-buffer "*Nihongo Dictionary Information*"))
1903   (set-window-configuration *diced-window-configuration*)
1904   )
1905
1906 (defun diced-execute (&optional display)
1907   (interactive)
1908   (goto-char (point-min))
1909   (let ((no  0))
1910     (while (not (eobp))
1911       (if (= (following-char) ?D)
1912           (let* ((dict-item (nth no *diced-dict-info*))
1913                  (kanji (nth 0 dict-item))
1914                  (bunpo (nth 1 dict-item))
1915                  (hinshi (wnn-server-hinsi-name bunpo))
1916 ;                (hindo (nth 2 dict-item))
1917                  (dict-number (nth 3 dict-item))
1918                  (dict-name (wnn-dict-name dict-number (wnn-server-dict-list)))
1919 ;                (sys-dict-p (null (memq dict-number (wnn-server-hinsi-dicts -1))))
1920                  (serial-number (nth 4 dict-item))
1921                  )
1922             (if (notify-yes-or-no-p (egg:msg-get 'remove-notify)
1923                                 kanji hinshi dict-name)
1924                 (progn
1925                   (if (wnn-server-word-delete dict-number serial-number)
1926                       (notify (egg:msg-get 'removed)
1927                               kanji hinshi dict-name)
1928                     (egg:error (wnn-server-get-msg)))
1929                   ))))
1930       (setq no (1+ no))
1931       (forward-line 1)))
1932   (forward-line -1)
1933   (if (not display) (diced-redisplay)))
1934
1935 (defun diced-next-line ()
1936   (interactive)
1937   (beginning-of-line)
1938   (forward-line 1)
1939   (if (eobp) (progn (beep) (forward-line -1))))
1940
1941 (defun diced-end-of-buffer ()
1942   (interactive)
1943   (goto-char (point-max))
1944   (forward-line -1))
1945
1946 (defun diced-scroll-down ()
1947   (interactive)
1948   (scroll-down)
1949   (if (eobp) (forward-line -1)))
1950
1951 (defun diced-mode ()
1952   "Mode for \"editing\" Wnn dictionaries.
1953 In diced, you are \"editing\" a list of the entries in dictionaries.
1954 You can move using the usual cursor motion commands.
1955 Letters no longer insert themselves. Instead, 
1956
1957 Type  a to Add new entry.
1958 Type  d to flag an entry for Deletion.
1959 Type  n to move cursor to Next entry.
1960 Type  p to move cursor to Previous entry.
1961 Type  q to Quit from DicEd.
1962 Type  C-u to Toggle the word to use/unuse.
1963 Type  u to Unflag an entry (remove its D flag).
1964 Type  x to eXecute the deletions requested.
1965 "
1966   )
1967
1968 (defvar diced-mode-map (make-sparse-keymap))
1969 (set-keymap-default-binding diced-mode-map 'undefined)
1970
1971 (define-key diced-mode-map "a"    'diced-add)
1972 (define-key diced-mode-map "d"    'diced-delete)
1973 (define-key diced-mode-map "n"    'diced-next-line)
1974 (define-key diced-mode-map "p"    'previous-line)
1975 (define-key diced-mode-map "q"    'diced-quit)
1976 ;(define-key diced-mode-map "t"    'diced-use)
1977 (define-key diced-mode-map "u"    'diced-undelete)
1978 (define-key diced-mode-map "x"    'diced-execute)
1979
1980 (define-key diced-mode-map "\C-h" 'help-command)
1981 (define-key diced-mode-map "\C-n" 'diced-next-line)
1982 (define-key diced-mode-map "\C-p" 'previous-line)
1983 (define-key diced-mode-map "\C-u" 'diced-use)
1984 (define-key diced-mode-map "\C-v" 'scroll-up)
1985 (define-key diced-mode-map "\eh"  'diced-hindo-set)
1986 (define-key diced-mode-map "\e<"  'beginning-of-buffer)
1987 (define-key diced-mode-map "\e>"  'diced-end-of-buffer)
1988 (define-key diced-mode-map "\ev"  'diced-scroll-down)
1989
1990 (define-key diced-mode-map [up] 'previous-line)
1991 (define-key diced-mode-map [down] 'diced-next-line)
1992
1993
1994 ;;;
1995 ;;; set comment on dictionary
1996 ;;;
1997
1998 (defun set-dict-comment ()
1999   (interactive)
2000   (if (null (wnn-server-isconnect)) (EGG:open-wnn))
2001   (wnn-server-set-rev nil)
2002   (let*((dic-list (wnn-server-dict-list))
2003         (writable-dic-list (wnn-server-hinsi-dicts -1))
2004         (dict-number
2005          (menu:select-from-menu
2006           (list 'menu (egg:msg-get 'jishomei)
2007                 (delq nil
2008                       (mapcar '(lambda (x)
2009                                  (let ((y (assoc x dic-list)))
2010                                    (if y
2011                                        (cons (nth 1 y) (nth 0 y)))))
2012                               writable-dic-list)))))
2013         (comment (read-from-minibuffer (egg:msg-get 'comment)
2014                                        (wnn-dict-name dict-number dic-list))))
2015     (if (wnn-server-dict-comment dict-number comment)
2016         (notify (egg:msg-get 'jisho-comment)
2017                 (wnn-dict-name dict-number dic-list) comment)
2018       (egg:error (wnn-server-get-msg)))))
2019
2020
2021 ;;;
2022 ;;; Pure inspect facility
2023 ;;;
2024
2025 (defun henkan-inspect-bunsetu ()
2026   (interactive)
2027   (let ((info (wnn-server-inspect *bunsetu-number*)))
2028     (if (null info)
2029         (notify (wnn-server-get-msg))
2030       (progn
2031         (let ((dic-list (wnn-server-dict-list)))
2032           (if (null dic-list)
2033               (notify (wnn-server-get-msg))
2034             (progn
2035               (let ((hinsi (wnn-server-hinsi-name (nth 4 info)))
2036                     (kanji (nth 0 info))
2037                     (yomi (nth 1 info))
2038                     (serial   (nth 3 info))
2039                     (hindo    (nth 5 info))
2040                     (jisho (wnn-dict-name (nth 2 info) dic-list))
2041                     (ima (nth 6 info))
2042                     (hyoka (nth 7 info))
2043                     (daihyoka (nth 8 info))
2044                     (kangovect (nth 9 info)))
2045                 (notify-internal
2046                  (format "%s %s(%s %s:%s Freq:%s%s) S:%s D:%s V:%s "
2047                          kanji yomi hinsi jisho serial 
2048                          (if (= ima 1) "*" " ")
2049                          hindo hyoka daihyoka kangovect)
2050                  t)))))))))
2051
2052 (provide 'egg-wnn)
2053
2054 ;;; egg-wnn.el ends here