Remove non-free old and crusty clearcase pkg
[packages] / mule-packages / skk / skk.el
1 ;;; skk.el --- SKK (Simple Kana to Kanji conversion program)
2 ;; Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3 ;;               1998, 1999
4 ;; Masahiko Sato <masahiko@kuis.kyoto-u.ac.jp>
5
6 ;; Author: Masahiko Sato <masahiko@kuis.kyoto-u.ac.jp>
7 ;; Maintainer: Hideki Sakurada <sakurada@kuis.kyoto-u.ac.jp>
8 ;;             Murata Shuuichirou <mrt@astec.co.jp>
9 ;;             Mikio Nakajima <minakaji@osaka.email.ne.jp>
10 ;; Version: $Id: skk.el,v 1.6 2002-04-28 07:12:27 youngs Exp $
11 ;; Keywords: japanese
12 ;; Last Modified: $Date: 2002-04-28 07:12:27 $
13
14 ;; SKK is free software; you can redistribute it and/or modify it under
15 ;; the terms of the GNU General Public License as published by the Free
16 ;; Software Foundation; either versions 2, or (at your option) any later
17 ;; version.
18
19 ;; SKK is distributed in the hope that it will be useful but WITHOUT
20 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
21 ;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
22 ;; License for more details.
23
24 ;; You should have received a copy of the GNU General Public License
25 ;; along with SKK, see the file COPYING.  If not, write to the Free
26 ;; Software Foundation Inc., 59 Temple Place - Suite 330, Boston,
27 ;; MA 02111-1307, USA.
28
29 ;;; Commentary:
30 ;;
31 ;; SKK-MODE is a mode for inputting Japanese to a current buffer which is
32 ;; composed of four minor modes described below.
33 ;;
34 ;;      +----------------------+-------- skk-mode -----+----------------------+
35 ;;      |                      |                       |                      |
36 ;;      |                      |                       |                      |
37 ;;  skk-j-mode           skk-latin-mode      skk-jisx0208-latin-mode   skk-abbrev-mode
38 ;;                           ASCII               JISX0208 LATIN         ABBREVIATION
39 ;;                  (C-j wakes up skk-j-mode)   (ZEN'KAKU EIMOJI)
40 ;;
41 ;; skk-j-mode-map     skk-latin-mode-map  skk-jisx0208-latin-mode-map skk-abbrev-mode-map
42 ;; skk-katakana: nil
43 ;;   HIRAKANA
44 ;;
45 ;;  skk-j-mode-map
46 ;; skk-katakana: t
47 ;;   KATAKANA
48
49
50 ;;; Code:
51 (require 'skk-foreword)
52
53 (defconst skk-version "10.62a")
54 (defconst skk-major-version (string-to-int (substring skk-version 0 2)))
55 (defconst skk-minor-version (string-to-int (substring skk-version 3)))
56
57 ;;;###autoload
58 (defun skk-version ()
59   (interactive)
60   (if (not (interactive-p))
61       skk-version
62     (save-match-data
63       (let* ((raw-date "$Date: 2002-04-28 07:12:27 $")
64              (year (substring raw-date 7 11))
65              (month (substring raw-date 12 14))
66              (date (substring raw-date 15 17)))
67         (if (string-match "^0" month)
68             (setq month (substring month (match-end 0))))
69         (if (string-match "^0" date)
70             (setq date (substring date (match-end 0))))
71         (message "SKK version %s of %s, APEL inside"
72                  skk-version
73                  (concat (car (rassoc month skk-month-alist))
74                          " " date ", " year))))))
75
76 ;;;; variables declaration
77 ;;; user variables
78
79 (defvar skk-init-file (convert-standard-filename "~/.skk")
80   "*SKK \e$B$N=i4|@_Dj%U%!%$%kL>!#\e(B
81 skk.el 9.x \e$B$h$j\e(B ~/.emacs \e$B$G$N%+%9%?%^%$%:$b2DG=$H$J$C$?!#\e(B"
82 ;  "*Name of the SKK initialization file.
83 ;From skk.el 9.x on all customization may be done in ~/.emacs."
84 )
85
86 ;;;###autoload
87 (defgroup skk nil "SKK basic customization."
88   :prefix "skk-"
89   :group 'japanese
90   :group 'input-method)
91
92 (defgroup skk-faces nil
93   "Faces used by SKK."
94   :group 'skk
95   :group 'faces)
96
97 (defcustom skk-special-midashi-char-list '(?> ?< ??)
98   "*\e$B@\F,<-!"@\Hx<-$NF~NO$N$?$a$N%W%l%U%#%C%/%9%-!<!"%5%U%#%C%/%9%-!<$N%j%9%H!#\e(B"
99   ;;  "*List of prefix and suffix keys for entering `settoji' and `setsubiji'."
100   :type '(repeat character)
101   :group 'skk)
102
103 (defcustom skk-mode-hook nil
104   "*SKK \e$B$r5/F0$7$?$H$-$N%U%C%/!#\e(B
105 \e$BB>$K!"\e(Bskk-auto-fill-mode-hook\e$B!"\e(Bskk-load-hook, skk-init-file \e$B$G$b%+%9%?\e(B
106 \e$B%^%$%:$,2DG=!#\e(B"
107   ;; "*Hook run at SKK startup.  This hook is also run
108   ;;in skk-auto-fill-mode after skk-auto-fill-mode-hook.
109   ;;skk-auto-fill-mode-hook, skk-load-hook, skk-init-file may also be used
110   ;;for customization."
111   :type 'hook
112   :group 'skk)
113
114 (defcustom skk-auto-fill-mode-hook nil
115   "*skk-auto-fill-mode \e$B$r5/F0$7$?$H$-$N%U%C%/!#\e(B
116 \e$BB>$K!"\e(Bskk-mode-hook, skk-load-hook, skk-init-file \e$B$G$b%+%9%?%^%$%:$,2D\e(B
117 \e$BG=!#\e(B"
118   ;;  "*Hook run at startup of skk-auto-fill-mode.
119   ;;skk-mode-hook\e$B!"\e(Bskk-load-hook, skk-init-file may also be used for
120   ;;customization."
121   :type 'hook
122   :group 'skk)
123
124 (defcustom skk-load-hook nil
125   "*skk.el \e$B$r%m!<%I$7$?$H$-$N%U%C%/!#\e(B
126 \e$BB>$K!"\e(Bskk-mode-hook, skk-auto-fill-mode-hook, skk-init-file \e$B$G$b%+%9%?\e(B
127 \e$B%^%$%:$,2DG=!#\e(B"
128   ;;  "*Hook run when SKK is loaded.
129   ;;skk-auto-fill-mode-hook\e$B!"\e(Bskk-mode-hook, skk-init-file may also be used
130   ;;for customization."
131   :type 'hook
132   :group 'skk)
133
134 (defcustom skk-search-end-function nil
135   "*\e$BC18l8!:w=*N;;~$K%3!<%k$5$l$k4X?t!#\e(B
136 \e$B$3$N4X?t$rMxMQ$7$F8!:w$7$?C18l$NM%@h=g0L$rJQ99$9$k$J$I$N:n6H$,2DG=!#\e(B
137 HENKAN-BUFFER, MIDASI, OKURIGANA, ENTRY \e$B$N\e(B 4 \e$B0z?t$rH<$J$C$F%3!<%k$5$l$k!#\e(B
138 \e$B2C9)$7$?\e(B ENTRY \e$B$rJV$9$3$H!#\e(B
139 \e$B$3$N4X?t$O!"<-=q%P%C%U%!$G%3!<%k$5$l$k$N$G!"JQ49$r9T$J$C$?%P%C%U%!%m!<%+%k$J>pJs$r\e(B
140 \e$B<h$j=P$7$?$$$H$-$O!"\e(BHENKAN-BUFFER \e$B$rMxMQ$9$k!#\e(B"
141   :type '(choice function (const nil))
142   :group 'skk)
143
144 (defcustom skk-update-end-function nil
145   "*\e$B8D?M<-=q$N99?7=*N;;~$K%3!<%k$5$l$k4X?t!#\e(B
146 HENKAN-BUFFER, MIDASI, OKURIGANA, WORD, PURGE \e$B$N\e(B 5 \e$B0z?t$rH<$J$C$F%3!<%k$5$l$k!#\e(B
147 \e$B$3$N4X?t$O!"<-=q%P%C%U%!$G%3!<%k$5$l$k$N$G!"JQ49$r9T$J$C$?%P%C%U%!%m!<%+%k$J>pJs$r<h$j\e(B
148 \e$B=P$7$?$$$H$-$O!"\e(BHENKAN-BUFFER \e$B$rMxMQ$9$k!#\e(B
149 skk-kakutei-initialize \e$B$,%3!<%k$5$l$kA0$K$3$N4X?t$,%3!<%k$5$l$k$N$G!":G8e$N3NDj\e(B
150 \e$B$K4X$9$k%U%i%0N`$O!"$3$N4X?t$NCf$+$i;2>H$9$k$3$H$,$G$-$k!#\e(B"
151   :type '(choice function (const nil))
152   :group 'skk)
153
154 (defcustom skk-kakutei-end-function nil
155   "*\e$B3NDj;~$K%3!<%k$5$l$k4X?t!#\e(B
156 KAKUTEI-WORD \e$B0z?t$rH<$J$C$F!"JQ49$r9T$J$C$?%P%C%U%!$G%3!<%k$5$l$k!#\e(B
157 skk-kakutei-initialize \e$B$,%3!<%k$5$l$kA0$K$3$N4X?t$,%3!<%k$5$l$k$N$G!":G8e$N3NDj\e(B
158 \e$B$K4X$9$k%U%i%0N`$O!"$3$N4X?t$NCf$+$i;2>H$9$k$3$H$,$G$-$k!#\e(B"
159   :type '(choice function (const nil))
160   :group 'skk)
161
162 (defcustom skk-kakutei-jisyo nil
163   "*\e$B:G=i$K8!:w$9$k<-=q!#\e(B
164 Non-nil \e$B$G!"$+$D\e(B skk-search-prog-list \e$B$NMWAG$NCf$K$3$NJQ?t$,;HMQ$5$l$F$$$l$P!"\e(B
165 \e$B;XDj$5$l$?<-=q$r8!:w$N$?$a%P%C%U%!$KFI$_9~$_!"8!:w$r9T$J$&!#\e(B
166 \e$B8+=P$78l$O!"%=!<%H$5$l$F$$$J$1$l$P$J$i$J$$!#\e(B
167 \e$B3F8+=P$78l$N:G=i$N%(%s%H%j$7$+8!:w$7$J$$\e(B (\e$BJ#?t$N%(%s%H%j$,$"$C$F$b\e(B 2 \e$BHVL\0J9_$N\e(B
168 \e$B%(%s%H%j$OL5;k$5$l$k\e(B)\e$B!#\e(B
169 skk-search-prog-list \e$B$NCM$r@_Dj$9$k$3$H$K$h$j!"8!:wBP>]$N<-=q$NJQ99!"8!:w$N=g\e(B
170 \e$B=x$NJQ99$,2DG=!#\e(B"
171   ;;  "*The first dictionary to be searched.
172   ;;If non-nil, and this variable is used as a component of
173   ;;`skk-search-prog-list', the indicated dictionary is read into a
174   ;;buffer and searched.
175   ;;The keys must be sorted.
176   ;;Only the first entry in each key is checked; if several entries are
177   ;;present the second and following entries are ignored.
178   ;;By setting the value of `skk-search-prog-list' the dictionaries
179   ;;searched and the order of search can be changed."
180   :type '(choice file (const nil))
181   :group 'skk)
182
183 (defcustom skk-initial-search-jisyo nil
184   "*\e$B%f!<%6!<<-=q$N8!:w$NA0$K8!:w$9$k<-=q!#\e(B
185 \e$B8+=P$78l$O!"%=!<%H$5$l$F$$$J$1$l$P$J$i$J$$!#\e(B
186 Non-nil \e$B$G!"$+$D\e(B skk-search-prog-list \e$B$NMWAG$NCf$K$3$NJQ?t$,;HMQ$5$l$F$$$l$P!"\e(B
187 \e$B;XDj$5$l$?<-=q$r8!:w$N$?$a%P%C%U%!$KFI$_9~$_!"8!:w$r9T$J$&!#\e(B
188 skk-search-prog-list \e$B$NCM$r@_Dj$9$k$3$H$K$h$j!"8!:wBP>]$N<-=q$NJQ99!"8!:w$N=g\e(B
189 \e$B=x$NJQ99$,2DG=!#\e(B"
190   ;;  "*This dictionary is searched before the user's personal dictionary.
191   ;;The keys must be sorted.
192   ;;If non-nil, and this variable is used as a component of
193   ;;`skk-search-prog-list', the indicated dictionary is read into a
194   ;;buffer and searched.
195   ;;By setting the value of `skk-search-prog-list' the dictionaries
196   ;;searched and the order of search can be changed."
197   :type '(choice file (const nil))
198   :group 'skk)
199
200 (defcustom skk-large-jisyo nil
201   "*\e$B%f!<%6!<<-=q$N8!:w$N8e$K8!:w$9$k<-=q!#\e(B
202 \e$B8+=P$78l$O!"%=!<%H$5$l$F$$$J$1$l$P$J$i$J$$!#\e(B
203 Non-nil \e$B$G!"$+$D\e(B skk-search-prog-list \e$B$NMWAG$NCf$K$3$NJQ?t$,;HMQ$5$l$F$$$l$P!"\e(B
204 \e$B;XDj$5$l$?<-=q$r8!:w$N$?$a%P%C%U%!$KFI$_9~$_!"8!:w$r9T$J$&!#\e(B
205 skk-search-prog-list \e$B$NCM$r@_Dj$9$k$3$H$K$h$j!"8!:wBP>]$N<-=q$NJQ99!"8!:w$N=g\e(B
206 \e$B=x$NJQ99$,2DG=!#\e(B"
207   :type '(choice file (const nil))
208   :group 'skk)
209
210 (defcustom skk-aux-large-jisyo nil
211   "*SKK \e$B%5!<%P!<$G:G8e$K8!:w$9$k<-=q!#\e(B
212 \e$B8+=P$78l$O!"%=!<%H$5$l$F$$$J$1$l$P$J$i$J$$!#\e(B
213 Non-nil \e$B$G!"$+$D\e(B skk-search-prog-list \e$B$NMWAG$NCf$K$3$NJQ?t$,;HMQ$5$l$F$$$l$P!"\e(B
214 SKK \e$B%5!<%P!<$r;H$$8!:w$r9T$&!#\e(B
215 SKK \e$B%5!<%P!<$,\e(B active \e$B$G$J$1$l$P!";XDj$5$l$?<-=q$r%P%C%U%!$KFI$_9~$`!#\e(B
216 skk-search-prog-list \e$B$NCM$r@_Dj$9$k$3$H$K$h$j!"8!:wBP>]$N<-=q$NJQ99!"8!:w$N=g\e(B
217 \e$B=x$NJQ99$,2DG=!#\e(B
218 \e$B$3$NCM$r@_Dj$9$k$3$H$K$h$j!"\e(Bskk-server.el \e$B$,\e(B autoload \e$B$5$l$k!#\e(B"
219   :type '(choice file (const nil))
220   :group 'skk)
221
222 (defcustom skk-search-prog-list
223   '((skk-search-kakutei-jisyo-file skk-kakutei-jisyo 10000 t)
224     (skk-search-jisyo-file skk-initial-search-jisyo 10000 t)
225     (skk-search-jisyo-file skk-jisyo 0 t)
226     ;; skk-auto.el \e$B$r%m!<%I$9$k$H2<5-$NMWAG$,%W%i%9$5$l$k!#\e(B
227     ;;(skk-okuri-search)
228     (skk-search-jisyo-file skk-large-jisyo 10000)
229     ;; skk-server.el \e$B$r%m!<%I$9$k$H2<5-$NMWAG$,%W%i%9$5$l$k!#\e(B
230     ;;(skk-search-server skk-aux-large-jisyo 10000)
231     ;; skk-server-host \e$B$b$7$/$O\e(B skk-servers-list \e$B$r;XDj$9$k$H!"\e(Bskk-server.el
232     ;; \e$B$,\e(B autoload \e$B$5$l$k!#\e(B
233    )
234   "*\e$B8!:w4X?t!"8!:wBP>]$N<-=q$r7hDj$9$k$?$a$N%j%9%H!#\e(B
235 \e$BJQ49$7$?8uJd$rJV$9\e(B S \e$B<0$r%j%9%H$N7A$KI=5-$7$?$b$N!#\e(B
236 skk-search \e$B4X?t$,\e(B skk-search-prog-list \e$B$N\e(B car \e$B$+$i8eJ}8~$X=gHV$K\e(B S \e$B<0$NI>2A$r\e(B
237 \e$B9T$$JQ49$r9T$J$&!#\e(B"
238   :type '(repeat
239           (list (function :tag "Search function")
240                 (choice :tag "Dictionary" file (const nil))
241                 (choice :tag "Minimum region size to be binary-searched"
242                         integer (const nil))
243                 (choice :tag "Quietly reading dictionary to Emacs buffer"
244                         (const t) (const nil))))
245   :group 'skk)
246
247 (defcustom skk-jisyo (convert-standard-filename "~/.skk-jisyo")
248   "*SKK \e$B$N%f!<%6!<<-=q!#\e(B"
249   :type 'file
250   :group 'skk)
251
252 (defcustom skk-backup-jisyo (convert-standard-filename "~/.skk-jisyo.BAK")
253   "*SKK \e$B$N%f!<%6!<<-=q$N%P%C%/%"%C%W%U%!%$%k!#\e(B"
254   :type 'file
255   :group 'skk)
256
257 (defcustom skk-jisyo-code nil
258   "*Non-nil \e$B$G$"$l$P!"$=$NCM$G<-=q%P%C%U%!$N4A;z%3!<%I$r@_Dj$9$k!#\e(B
259 Mule \e$B$G$O!"\e(B*euc-japan*, *sjis*, *junet*\e$B!#\e(B
260 \e$B$^$?!"\e(B\"euc\", \"ujis\", \"sjis\", \"jis\" \e$B$J$I$NJ8;zNs$K$h$C$F$b;XDj$,2DG=!#\e(B"
261   :type '(choice symbol string)
262   :group 'skk)
263
264 (defcustom skk-keep-record t
265   "*Non-nil \e$B$G$"$l$P!"JQ49$K4X$9$k5-O?$r\e(B skk-record-file \e$B$K<h$k!#\e(B"
266   :type 'boolean
267   :group 'skk)
268
269 (defcustom skk-record-file (convert-standard-filename "~/.skk-record")
270   "*\e$B%f!<%6!<<-=q$NE}7W$r<h$k%U%!%$%k!#\e(B
271 \e$B<-=q%;!<%V$N;~9o!"C18l$NEPO??t!"3NDj$r9T$C$?2s?t!"3NDjN(!"A4BN$N8l?t$N\e(B
272 \e$B>pJs$r<}$a$k!#\e(B"
273   :type 'file
274   :group 'skk)
275
276 (defcustom skk-kakutei-key "\C-j"
277   "*\e$B4A;zJQ49$N3NDjF0:n$r9T$&%-!<!#\e(B"
278   :type 'string
279   :group 'skk)
280
281 (defcustom skk-previous-candidate-char ?x
282   "*skk-previous-candidate \e$B$r3dEv$F$?%-!<%-%c%i%/%?!#\e(B"
283   :type 'character
284   :group 'skk)
285
286 (defcustom skk-try-completion-char ?\011 ; TAB
287   "*\e$B8+=P$78l$NJd40F0:n$r9T$J$&%-!<%-%c%i%/%?!#\e(B"
288   :type 'character
289   :group 'skk)
290
291 (defcustom skk-next-completion-char ?.
292   "*\e$B8+=P$78l$NJd40F0:n$G!"<!$N8uJd$r=PNO$9$k%-!<%-%c%i%/%?!#\e(B"
293   :type 'character
294   :group 'skk)
295
296 (defcustom skk-previous-completion-char ?,
297   "*\e$B8+=P$78l$NJd40F0:n$G!"A0$N8uJd$r=PNO$9$k%-!<%-%c%i%/%?!#\e(B"
298   :type 'character
299   :group 'skk)
300
301 (defcustom skk-start-henkan-char ?\040  ; SPC
302   "*\e$B4A;zJQ49$r3+;O$9$k%-!<%-%c%i%/%?!#\e(B"
303   :type 'character
304   :group 'skk)
305
306 (defcustom skk-start-henkan-with-completion-char ?\240 ; M-SPC
307   "*\e$B8+=P$78l$rJd40$7$J$,$i"'%b!<%I$KF~$k%-!<%-%c%i%/%?!#\e(B"
308   :type 'character
309   :group 'skk)
310
311 (defcustom skk-backward-and-set-henkan-point-char ?\321 ; M-Q
312   "*\e$B%]%$%s%H$rLa$7$F"&%b!<%I$KF~$k%-!<%-%c%i%/%?!#\e(B"
313   :type 'character
314   :group 'skk)
315
316 (defcustom skk-use-viper nil
317   "*Non-nil \e$B$G$"$l$P!"\e(BVIPER \e$B$KBP1~$9$k!#\e(B"
318   :type 'boolean
319   :group 'skk)
320
321 (defcustom skk-henkan-okuri-strictly nil
322   "*Non-nil \e$B$G$"$l$P!"8+=P$78l$HAw$j2>L>$,0lCW$7$?$H$-$@$18uJd$H$7$F=PNO$9$k!#\e(B
323 \e$BNc$($P!"2<5-$N$h$&$J<-=q%(%s%H%j$,!"\e(Bskk-jisyo \(\e$B%W%i%$%Y!<%H<-=q\e(B\) \e$B$K$"$C$?>l9g$K\e(B
324
325   \"\e$B$*$*\e(Bk /\e$BBg\e(B/\e$BB?\e(B/[\e$B$/\e(B/\e$BB?\e(B/]/[\e$B$-\e(B/\e$BBg\e(B/]/\"
326
327 \"\e$B"&$*$*\e(B*\e$B$/\e(B\" \e$B$rJQ49$7$?$H$-!"\e(B\"\e$BB?$/\e(B\" \e$B$N$_$r=PNO$7!"\e(B\"\e$BBg$/\e(B\" \e$B$r=PNO$7$J$$!#\e(B
328
329 SKK-JISYO.[SML] \e$B$NAw$j2>L>%(%s%H%j$O>e5-$N7A<0$K$J$C$F$$$J$$$N$G!"\e(Bskk-jisyo \e$B$N\e(B
330 \e$BAw$j$"$j$N<-=q%(%s%H%j$,$3$N7A<0$N$b$N$r$"$^$j4^$s$G$$$J$$>l9g$O!"$3$N%*%W%7%g\e(B
331 \e$B%s$r\e(B on \e$B$K$9$k$3$H$G!"$9$0$KC18lEPO?$KF~$C$F$7$^$&$N$GCm0U$9$k$3$H!#\e(B
332
333 skk-process-okuri-early \e$B$NCM$,\e(B nil \e$B$J$i$P>e5-$N7A<0$G\e(B skk-jisyo \e$B$,:n$i$l$k!#\e(B
334
335 Emacs 19 \e$B%Y!<%9$N\e(B Mule \e$B$J$i$P!"2<5-$N%U%)!<%`$rI>2A$9$k$3$H$G!"C18lEPO?$KF~$C\e(B
336 \e$B$?$H$-$@$10l;~E*$K$3$N%*%W%7%g%s$r\e(B nil \e$B$K$9$k$3$H$,$G$-$k!#\e(B
337
338     \(add-hook 'minibuffer-setup-hook
339               \(function
340                \(lambda \(\)
341                  \(if \(and \(boundp 'skk-henkan-okuri-strictly\)
342                           skk-henkan-okuri-strictly
343                           \(not \(eq last-command 'skk-purge-from-jisyo\)\) \)
344                      \(progn
345                        \(setq skk-henkan-okuri-strictly nil\)
346                        \(put 'skk-henkan-okuri-strictly 'temporary-nil t\) \)\)\)\)\)
347
348     \(add-hook 'minibuffer-exit-hook
349               \(function
350                \(lambda \(\)
351                  \(if \(get 'skk-henkan-okuri-strictly 'temporary-nil\)
352                      \(progn
353                        \(put 'skk-henkan-okuri-strictly 'temporary-nil nil\)
354                        \(setq skk-henkan-okuri-strictly t\) \)\)\)\)\)
355
356 \e$B$3$N%*%W%7%g%sMxMQ;~$O!"\e(Bskk-process-okuri-early \e$B$NCM$O\e(B nil \e$B$G$J$1$l$P$J$i$J$$\e(B
357 \(\e$B%a%K%e!<%P!<$rMxMQ$7$F%+%9%?%^%$%:$7$?>l9g$O<+F0E*$KD4@0$5$l$k\e(B\)\e$B!#\e(B"
358   :type 'boolean
359   :group 'skk)
360
361 (defcustom skk-henkan-strict-okuri-precedence nil
362   "*Non-nil \e$B$G$"$l$P!"8+=P$78l$HAw$j2>L>$,0lCW$7$?8uJd$rM%@h$7$FI=<($9$k!#\e(B
363 \e$BNc$($P!"2<5-$N$h$&$J<-=q%(%s%H%j$,!"\e(Bskk-jisyo \(\e$B%W%i%$%Y!<%H<-=q\e(B\) \e$B$K$"$C$?>l9g$K\e(B
364
365   \"\e$B$*$*\e(Bk /\e$BBg\e(B/\e$BB?\e(B/[\e$B$/\e(B/\e$BB?\e(B/]/[\e$B$-\e(B/\e$BBg\e(B/]/\"
366
367 \"\e$B"&$*$*\e(B*\e$B$/\e(B\" \e$B$rJQ49$7$?$H$-!"$^$:\e(B\"\e$BB?$/\e(B\" \e$B$r=PNO$7!"\e(B
368 \e$B<!$K\e(B \"\e$BBg$/\e(B\" \e$B$r=PNO$9$k!#\e(B
369
370 \"\e$BBg$/\e(B\"\e$B$J$I$N8uJd$O$&$C$H$&$7$$$,!"$9$0$KC18lEPO?$K$O$$$C$F$7$^$&$N$b\e(B
371 \e$B7y$J$R$H$K$*$9$9$a!#\e(B
372
373 \e$B$3$N%*%W%7%g%sMxMQ;~$O!"\e(Bskk-process-okuri-early \e$B$NCM$O\e(B nil \e$B$G$J$1$l$P$J$i$J$$!#\e(B
374 \e$B$^$?\e(B skk-henkan-okuri-strictly \e$B$,\e(B non-nil \e$B$N$H$-$O!"$3$NJQ?t$OL5;k$5$l$k!#\e(B
375 \(\e$B%a%K%e!<%P!<$rMxMQ$7$F%+%9%?%^%$%:$7$?>l9g$O<+F0E*$KD4@0$5$l$k\e(B\)\e$B!#\e(B"
376   :type 'boolean
377   :group 'skk)
378
379 (defcustom skk-auto-okuri-process nil
380   "*Non-nil \e$B$G$"$l$P!"Aw$j2>L>ItJ,$r<+F0G'<1$7$FJQ49$r9T$&!#\e(B
381 \e$BNc$($P!"\e(B
382
383     \"Uresii (\"UreSii\" \e$B$G$O$J$/\e(B) -> \e$B4r$7$$\e(B\"
384
385 \e$B$N$h$&$KJQ49$5$l$k!#C"$7!"\e(Bskk-jisyo \e$B<-=q\e(B \(\e$B%W%i%$%Y!<%H<-=q\e(B\) \e$B$,!"\e(B
386
387     \"\e$B$&$l\e(Bs /\e$B4r\e(B/[\e$B$7\e(B/\e$B4r\e(B/]/\"
388
389 \e$B$N$h$&$J7A<0$K$J$C$F$$$k$3$H$,I,MW$G$"$k\e(B \(SKK-JISYO.[SML] \e$B$O$3$N7A<0$KBP1~$7\e(B
390 \e$B$F$$$J$$$N$G!"\e(Bskk-jisyo \e$B$K$3$N%(%s%H%j$,$J$1$l$P$J$i$J$$\e(B\)\e$B!#\e(B
391
392 \e$B$3$N%*%W%7%g%sMxMQ;~$O!"\e(Bskk-process-okuri-early \e$B$NCM$O\e(B nil \e$B$G$J$1$l$P$J$i$J$$\e(B
393 \(\e$B%a%K%e!<%P!<$rMxMQ$7$F%+%9%?%^%$%:$7$?>l9g$O<+F0E*$KD4@0$5$l$k\e(B\)\e$B!#\e(B"
394   :type 'boolean
395   :group 'skk)
396
397 (defcustom skk-process-okuri-early nil
398   "*Non-nil \e$B$G$"$l$P!"Aw$j2>L>$N%m!<%^;z%W%l%U%#%C%/%9$NF~NO;~E@$GJQ49$r3+;O$9$k!#\e(B
399 \e$BNc$($P!"\e(B
400
401     \"UgoK -> \e$B"'F0\e(Bk\"\e$B!#\e(B
402
403 \e$BAw$j2>L>$,J,$i$J$$$^$^JQ49$7$F$$$k$3$H$K$J$k$N$G!"\e(Bskk-jisyo \e$B$,Aw$j2>L>$KBP1~$7\e(B
404 \e$B$?7A$K@.D9$7$J$$!#$D$^$j\e(B
405
406     \"\e$B$&$4\e(Bk /\e$BF0\e(B/\"
407
408 \e$B$N$h$&$J7ABV$N$^$^$H$J$k!#$?$@$7!"4{$K\e(B
409
410     \"\e$B$&$4\e(Bk /\e$BF0\e(B/[\e$B$/\e(B/\e$BF0\e(B/]/[\e$B$+\e(B/\e$BF0\e(B/]/[\e$B$1\e(B/\e$BF0\e(B/]/[\e$B$-\e(B/\e$BF0\e(B/]/[\e$B$3\e(B/\e$BF0\e(B/]/\"
411
412 \e$B$N$h$&$J%(%s%H%j$,\e(B skk-jisyo \e$B$K$"$l$P!"$=$l$rGK2u$7$J$$!#\e(B
413
414 nil \e$B$G$"$l$P!"Aw$j2>L>$NF~NO$,40N;$7$?;~E@$GJQ49$,3+;O$9$k!#Nc$($P!"\e(B
415
416     \"UgoK -> \e$B"&$&$4\e(B*k\", \"UgoKu -> \e$B"'F0$/\e(B\"
417
418 \e$B$3$N%*%W%7%g%s$r\e(B on \e$B$K$7$F\e(B skk-mode \e$B$r5/F0$9$k$H!"N>N)$G$-$J$$%*%W%7%g%s$G$"$k\e(B
419 skk-kakutei-early, skk-auto-okuri-process, skk-henkan-okuri-strictly \e$B$O\e(B nil \e$B$K\e(B
420 \e$B%;%C%H$5$l$k!#\e(B"
421   :type 'boolean
422   :group 'skk)
423
424 (defcustom skk-egg-like-newline nil
425   "*Non-nil \e$B$G$"$l$P!""'%b!<%I$G2~9T$r%?%$%W$7$F$b3NDj$9$k$N$_$G2~9T$7$J$$!#\e(B"
426   :type 'boolean
427   :group 'skk)
428
429 (defcustom skk-kakutei-early t
430   "*Non-nil \e$B$G$"$l$P\e(B skk-insert \e$B$,8F$P$l$?$H$-$K8=:_$N8uJd$r3NDj$9$k!#\e(B
431 \e$BNc$($P!"\e(B
432
433     \"\e$B"&$+$/$F$$\e(B -> \e$B"'3NDj\e(B -> \e$B3NDj\e(Bs -> \e$B3NDj$9\e(B\"
434
435 \e$B$N$h$&$KJQ498e!"!V$9!W$N\e(B prefix \e$B$G$"$k\e(B \"s\" \e$B$rF~NO$7$?;~E@$G3NDj$9$k!#\e(B
436 nil \e$B$G$"$l$P!"Nc$($P\e(B
437
438     \"\e$B"&$+$/$F$$\e(B -> \e$B"'3NDj\e(B -> \e$B"'3NDj\e(Bs -> \e$B"'3NDj$9$k\e(B -> \e$B3NDj$9$k!#\e(B\"
439
440 \e$B$N$h$&$K\e(B skk-kakutei \e$B$rD>@\!"4V@\$K%3!<%k$9$k$^$G\e(B \(\e$B6gFIE@$rF~NO$7$?$j!"?7$?$J\e(B
441 \e$B"&%b!<%I$KF~$C$?$j$9$k$H4V@\E*$K\e(B skk-kakutei \e$B$r%3!<%k$9$k\e(B\) \e$B$O!"3NDj$7$J$$$N$G!"\e(B
442 \e$B$=$N4V$O!"JQ498uJd$rA*$S$J$*$9$3$H$J$I$,2DG=!#\e(B
443
444 \e$B$3$N%*%W%7%g%sMxMQ;~$O!"\e(Bskk-process-okuri-early \e$B$NCM$O\e(B nil \e$B$G$J$1$l$P$J$i$J$$\e(B
445 \(\e$B%a%K%e!<%P!<$rMxMQ$7$F%+%9%?%^%$%:$7$?>l9g$O<+F0E*$KD4@0$5$l$k\e(B\)\e$B!#\e(B"
446   :type 'boolean
447   :group 'skk)
448
449 (defcustom skk-delete-implies-kakutei t
450   "*Non-nil \e$B$G$"$l$P!""'%b!<%I$G\e(B BS \e$B$r2!$9$H!"A0$N0lJ8;z$r:o=|$73NDj$9$k!#\e(B
451 nil \e$B$G$"$l$P!"0l$DA0$N8uJd$rI=<($9$k!#\e(B"
452   :type 'boolean
453   :group 'skk)
454
455 (defcustom skk-allow-spaces-newlines-and-tabs t
456   "*Non-nil \e$B$G$"$l$P!"8+=P$78l$NCf$K%9%Z!<%9!"%?%V!"2~9T$,$"$C$F$b$=$l$r<h$j=|$$$FJQ49$9$k$3$H$,2DG=!#\e(B
457 \e$BNc$($P!"2<5-$N$h$&$K\e(B \e$BCf$K2~9T$,F~$C$F$$$F$bJQ49$,2DG=$G$"$k!#\e(B
458
459      \"\e$B"&$+\e(B
460   \e$B$J\e(B\"
461    -> \"\e$B2>L>\e(B\"
462
463 \e$B$3$NCM$,\e(B nil \e$B$G$"$l$P!":G=i$N%9%Z!<%9$G8+=P$78l$r@Z$j5M$a$F$7$^$$!"0J9_$N%9%Z!<\e(B
464 \e$B%9!"%?%V!"2~9T$OL5;k$5$l$k!#\e(B
465 \e$B$3$NCM$O!"\e(Bskk-start-henkan, skk-latin-henkan, skk-katakana-henkan,
466 skk-hiragana-henkan, skk-jisx0208-latin-henkan \e$B5Z$S\e(B
467 skk-backward-and-set-henkan-point \e$B$NF0:n$K1F6A$9$k!#\e(B"
468   :type 'boolean
469   :group 'skk)
470
471 (defcustom skk-convert-okurigana-into-katakana nil
472   "*Non-nil \e$B$G$"$l$P!"%+%?%+%J%b!<%I$GJQ49$7$?$H$-$KAw$j2>L>$b%+%?%+%J$KJQ49$9$k!#\e(B"
473   :type 'boolean
474   :group 'skk)
475
476 (defcustom skk-delete-okuri-when-quit nil
477   "*Non-nil \e$B$G$"$l$P!"Aw$j$"$j$NJQ49Cf$K\e(B \"C-g\" \e$B$r2!$9$HAw$j2>L>$r>C$7"&%b!<%I$KF~$k!#\e(B
478 \e$BNc$($P!"\e(B
479
480     \"\e$B"&$J\e(B*\e$B$/\e(B -> \e$B"'5c$/\e(B -> \"C-g\" ->\e$B"&$J\e(B\"
481
482 nil \e$B$G$"$l$P!"Aw$j2>L>$r4^$a$?8+=P$78l$r$=$N$^$^;D$7!""#%b!<%I$KF~$k!#Nc$($P!"\e(B
483
484     \"\e$B"&$J\e(B*\e$B$/\e(B -> \e$B"'5c$/\e(B -> \"C-g\" -> \e$B$J$/\e(B\""
485   :type 'boolean
486   :group 'skk)
487
488 (defcustom skk-henkan-show-candidates-keys '(?a ?s ?d ?f ?j ?k ?l)
489   "*\e$B%a%K%e!<7A<0$G8uJd$rA*Br$9$k$H$-$NA*Br%-!<$N%j%9%H!#\e(B
490 \"x\", \" \" \e$B5Z$S\e(B \"C-g\" \e$B0J30$N\e(B 7 \e$B$D$N%-!<\e(B (char type) \e$B$r4^$`I,MW$,$"\e(B
491 \e$B$k!#\e(B\"x\", \" \" \e$B5Z$S\e(B \"C-g\" \e$B$O8uJdA*Br;~$K$=$l$>$lFCJL$J;E;v$K3d$jEv\e(B
492 \e$B$F$i$l$F$$$k$N$G!"$3$N%j%9%H$NCf$K$O4^$a$J$$$3$H!#\e(B"
493   :type '(repeat character)
494   :group 'skk)
495
496 (defcustom skk-status-indicator 'minor-mode
497   "*SKK \e$B$N>uBV$r%b!<%I9T$N$I$3$KI=<($9$k$+$r7h$a$k!#\e(B
498 left \e$B$G$"$l$P:8C<$KI=<($9$k!#\e(B
499 \e$B$5$b$J$1$l$P%^%$%J!<%b!<%I$H$7$F$NI=<(K!$r<h$k!#\e(B"
500   :type '(choice (const minor-mode)
501                  (const left))
502   :group 'skk)
503
504 (defcustom skk-latin-mode-string " SKK"
505   "*SKK \e$B$,\e(B latin (ascii) \e$B%b!<%I$G$"$k$H$-$K%b!<%I%i%$%s$KI=<($5$l$kJ8;zNs!#\e(B"
506   :type 'string
507   :group 'skk)
508
509 (defcustom skk-hiragana-mode-string " \e$B$+$J\e(B"
510   "*\e$B$R$i$,$J%b!<%I$G$"$k$H$-$K%b!<%I%i%$%s$KI=<($5$l$kJ8;zNs!#\e(B"
511   :type 'string
512   :group 'skk)
513
514 (defcustom skk-katakana-mode-string " \e$B%+%J\e(B"
515   "*\e$B%+%?%+%J%b!<%I$G$"$k$H$-$K%b!<%I%i%$%s$KI=<($5$l$kJ8;zNs!#\e(B"
516   :type 'string
517   :group 'skk)
518
519 (defcustom skk-jisx0208-latin-mode-string " \e$BA41Q\e(B"
520   "*\e$BA41Q%b!<%I$G$"$k$H$-$K%b!<%I%i%$%s$KI=<($5$l$kJ8;zNs!#\e(B"
521   :type 'string
522   :group 'skk)
523
524 (defcustom skk-abbrev-mode-string " a\e$B$"\e(B"
525   "*SKK abbrev \e$B%b!<%I$G$"$k$H$-$K%b!<%I%i%$%s$KI=<($5$l$kJ8;zNs!#\e(B"
526   :type 'string
527   :group 'skk)
528
529 (defcustom skk-echo t
530   "*Non-nil \e$B$G$"$l$P!"2>L>J8;z$N%W%l%U%#%C%/%9$rI=<($9$k!#\e(B"
531   :type 'boolean
532   :group 'skk)
533
534 (defcustom skk-use-numeric-conversion t
535   "*Non-nil \e$B$G$"$l$P!"?tCMJQ49$r9T$&!#\e(B"
536   :type 'boolean
537   :group 'skk)
538
539 (defcustom skk-rom-kana-base-rule-list
540   '(("a" nil ("\e$B%"\e(B" . "\e$B$"\e(B"))
541     ("bb" "b" ("\e$B%C\e(B" . "\e$B$C\e(B"))
542     ("ba" nil ("\e$B%P\e(B" . "\e$B$P\e(B"))
543     ("be" nil ("\e$B%Y\e(B" . "\e$B$Y\e(B"))
544     ("bi" nil ("\e$B%S\e(B" . "\e$B$S\e(B"))
545     ("bo" nil ("\e$B%\\e(B" . "\e$B$\\e(B"))
546     ("bu" nil ("\e$B%V\e(B" . "\e$B$V\e(B"))
547     ("bya" nil ("\e$B%S%c\e(B" . "\e$B$S$c\e(B"))
548     ("bye" nil ("\e$B%S%'\e(B" . "\e$B$S$'\e(B"))
549     ("byi" nil ("\e$B%S%#\e(B" . "\e$B$S$#\e(B"))
550     ("byo" nil ("\e$B%S%g\e(B" . "\e$B$S$g\e(B"))
551     ("byu" nil ("\e$B%S%e\e(B" . "\e$B$S$e\e(B"))
552     ("cc" "c" ("\e$B%C\e(B" . "\e$B$C\e(B"))
553     ("cha" nil ("\e$B%A%c\e(B" . "\e$B$A$c\e(B"))
554     ("che" nil ("\e$B%A%'\e(B" . "\e$B$A$'\e(B"))
555     ("chi" nil ("\e$B%A\e(B" . "\e$B$A\e(B"))
556     ("cho" nil ("\e$B%A%g\e(B" . "\e$B$A$g\e(B"))
557     ("chu" nil ("\e$B%A%e\e(B" . "\e$B$A$e\e(B"))
558     ("cya" nil ("\e$B%A%c\e(B" . "\e$B$A$c\e(B"))
559     ("cye" nil ("\e$B%A%'\e(B" . "\e$B$A$'\e(B"))
560     ("cyi" nil ("\e$B%A%#\e(B" . "\e$B$A$#\e(B"))
561     ("cyo" nil ("\e$B%A%g\e(B" . "\e$B$A$g\e(B"))
562     ("cyu" nil ("\e$B%A%e\e(B" . "\e$B$A$e\e(B"))
563     ("dd" "d" ("\e$B%C\e(B" . "\e$B$C\e(B"))
564     ("da" nil ("\e$B%@\e(B" . "\e$B$@\e(B"))
565     ("de" nil ("\e$B%G\e(B" . "\e$B$G\e(B"))
566     ("dha" nil ("\e$B%G%c\e(B" . "\e$B$G$c\e(B"))
567     ("dhe" nil ("\e$B%G%'\e(B" . "\e$B$G$'\e(B"))
568     ("dhi" nil ("\e$B%G%#\e(B" . "\e$B$G$#\e(B"))
569     ("dho" nil ("\e$B%G%g\e(B" . "\e$B$G$g\e(B"))
570     ("dhu" nil ("\e$B%G%e\e(B" . "\e$B$G$e\e(B"))
571     ("di" nil ("\e$B%B\e(B" . "\e$B$B\e(B"))
572     ("do" nil ("\e$B%I\e(B" . "\e$B$I\e(B"))
573     ("du" nil ("\e$B%E\e(B" . "\e$B$E\e(B"))
574     ("dya" nil ("\e$B%B%c\e(B" . "\e$B$B$c\e(B"))
575     ("dye" nil ("\e$B%B%'\e(B" . "\e$B$B$'\e(B"))
576     ("dyi" nil ("\e$B%B%#\e(B" . "\e$B$B$#\e(B"))
577     ("dyo" nil ("\e$B%B%g\e(B" . "\e$B$B$g\e(B"))
578     ("dyu" nil ("\e$B%B%e\e(B" . "\e$B$B$e\e(B"))
579     ("e" nil ("\e$B%(\e(B" . "\e$B$(\e(B"))
580     ("ff" "f" ("\e$B%C\e(B" . "\e$B$C\e(B"))
581     ("fa" nil ("\e$B%U%!\e(B" . "\e$B$U$!\e(B"))
582     ("fe" nil ("\e$B%U%'\e(B" . "\e$B$U$'\e(B"))
583     ("fi" nil ("\e$B%U%#\e(B" . "\e$B$U$#\e(B"))
584     ("fo" nil ("\e$B%U%)\e(B" . "\e$B$U$)\e(B"))
585     ("fu" nil ("\e$B%U\e(B" . "\e$B$U\e(B"))
586     ("fya" nil ("\e$B%U%c\e(B" . "\e$B$U$c\e(B"))
587     ("fye" nil ("\e$B%U%'\e(B" . "\e$B$U$'\e(B"))
588     ("fyi" nil ("\e$B%U%#\e(B" . "\e$B$U$#\e(B"))
589     ("fyo" nil ("\e$B%U%g\e(B" . "\e$B$U$g\e(B"))
590     ("fyu" nil ("\e$B%U%e\e(B" . "\e$B$U$e\e(B"))
591     ("gg" "g" ("\e$B%C\e(B" . "\e$B$C\e(B"))
592     ("ga" nil ("\e$B%,\e(B" . "\e$B$,\e(B"))
593     ("ge" nil ("\e$B%2\e(B" . "\e$B$2\e(B"))
594     ("gi" nil ("\e$B%.\e(B" . "\e$B$.\e(B"))
595     ("go" nil ("\e$B%4\e(B" . "\e$B$4\e(B"))
596     ("gu" nil ("\e$B%0\e(B" . "\e$B$0\e(B"))
597     ("gya" nil ("\e$B%.%c\e(B" . "\e$B$.$c\e(B"))
598     ("gye" nil ("\e$B%.%'\e(B" . "\e$B$.$'\e(B"))
599     ("gyi" nil ("\e$B%.%#\e(B" . "\e$B$.$#\e(B"))
600     ("gyo" nil ("\e$B%.%g\e(B" . "\e$B$.$g\e(B"))
601     ("gyu" nil ("\e$B%.%e\e(B" . "\e$B$.$e\e(B"))
602     ;;("h" "" ("\e$B%*\e(B" . "\e$B$*\e(B"))
603     ("ha" nil ("\e$B%O\e(B" . "\e$B$O\e(B"))
604     ("he" nil ("\e$B%X\e(B" . "\e$B$X\e(B"))
605     ("hi" nil ("\e$B%R\e(B" . "\e$B$R\e(B"))
606     ("ho" nil ("\e$B%[\e(B" . "\e$B$[\e(B"))
607     ("hu" nil ("\e$B%U\e(B" . "\e$B$U\e(B"))
608     ("hya" nil ("\e$B%R%c\e(B" . "\e$B$R$c\e(B"))
609     ("hye" nil ("\e$B%R%'\e(B" . "\e$B$R$'\e(B"))
610     ("hyi" nil ("\e$B%R%#\e(B" . "\e$B$R$#\e(B"))
611     ("hyo" nil ("\e$B%R%g\e(B" . "\e$B$R$g\e(B"))
612     ("hyu" nil ("\e$B%R%e\e(B" . "\e$B$R$e\e(B"))
613     ("i" nil ("\e$B%$\e(B" . "\e$B$$\e(B"))
614     ("jj" "j" ("\e$B%C\e(B" . "\e$B$C\e(B"))
615     ("ja" nil ("\e$B%8%c\e(B" . "\e$B$8$c\e(B"))
616     ("je" nil ("\e$B%8%'\e(B" . "\e$B$8$'\e(B"))
617     ("ji" nil ("\e$B%8\e(B" . "\e$B$8\e(B"))
618     ("jo" nil ("\e$B%8%g\e(B" . "\e$B$8$g\e(B"))
619     ("ju" nil ("\e$B%8%e\e(B" . "\e$B$8$e\e(B"))
620     ("jya" nil ("\e$B%8%c\e(B" . "\e$B$8$c\e(B"))
621     ("jye" nil ("\e$B%8%'\e(B" . "\e$B$8$'\e(B"))
622     ("jyi" nil ("\e$B%8%#\e(B" . "\e$B$8$#\e(B"))
623     ("jyo" nil ("\e$B%8%g\e(B" . "\e$B$8$g\e(B"))
624     ("jyu" nil ("\e$B%8%e\e(B" . "\e$B$8$e\e(B"))
625     ("kk" "k" ("\e$B%C\e(B" . "\e$B$C\e(B"))
626     ("ka" nil ("\e$B%+\e(B" . "\e$B$+\e(B"))
627     ("ke" nil ("\e$B%1\e(B" . "\e$B$1\e(B"))
628     ("ki" nil ("\e$B%-\e(B" . "\e$B$-\e(B"))
629     ("ko" nil ("\e$B%3\e(B" . "\e$B$3\e(B"))
630     ("ku" nil ("\e$B%/\e(B" . "\e$B$/\e(B"))
631     ("kya" nil ("\e$B%-%c\e(B" . "\e$B$-$c\e(B"))
632     ("kye" nil ("\e$B%-%'\e(B" . "\e$B$-$'\e(B"))
633     ("kyi" nil ("\e$B%-%#\e(B" . "\e$B$-$#\e(B"))
634     ("kyo" nil ("\e$B%-%g\e(B" . "\e$B$-$g\e(B"))
635     ("kyu" nil ("\e$B%-%e\e(B" . "\e$B$-$e\e(B"))
636     ("ma" nil ("\e$B%^\e(B" . "\e$B$^\e(B"))
637     ("me" nil ("\e$B%a\e(B" . "\e$B$a\e(B"))
638     ("mi" nil ("\e$B%_\e(B" . "\e$B$_\e(B"))
639     ("mo" nil ("\e$B%b\e(B" . "\e$B$b\e(B"))
640     ("mu" nil ("\e$B%`\e(B" . "\e$B$`\e(B"))
641     ("mya" nil ("\e$B%_%c\e(B" . "\e$B$_$c\e(B"))
642     ("mye" nil ("\e$B%_%'\e(B" . "\e$B$_$'\e(B"))
643     ("myi" nil ("\e$B%_%#\e(B" . "\e$B$_$#\e(B"))
644     ("myo" nil ("\e$B%_%g\e(B" . "\e$B$_$g\e(B"))
645     ("myu" nil ("\e$B%_%e\e(B" . "\e$B$_$e\e(B"))
646     ("n" nil ("\e$B%s\e(B" . "\e$B$s\e(B"))
647     ("n'" nil ("\e$B%s\e(B" . "\e$B$s\e(B"))
648     ("na" nil ("\e$B%J\e(B" . "\e$B$J\e(B"))
649     ("ne" nil ("\e$B%M\e(B" . "\e$B$M\e(B"))
650     ("ni" nil ("\e$B%K\e(B" . "\e$B$K\e(B"))
651     ("nn" nil ("\e$B%s\e(B" . "\e$B$s\e(B"))
652     ("no" nil ("\e$B%N\e(B" . "\e$B$N\e(B"))
653     ("nu" nil ("\e$B%L\e(B" . "\e$B$L\e(B"))
654     ("nya" nil ("\e$B%K%c\e(B" . "\e$B$K$c\e(B"))
655     ("nye" nil ("\e$B%K%'\e(B" . "\e$B$K$'\e(B"))
656     ("nyi" nil ("\e$B%K%#\e(B" . "\e$B$K$#\e(B"))
657     ("nyo" nil ("\e$B%K%g\e(B" . "\e$B$K$g\e(B"))
658     ("nyu" nil ("\e$B%K%e\e(B" . "\e$B$K$e\e(B"))
659     ("o" nil ("\e$B%*\e(B" . "\e$B$*\e(B"))
660     ("pp" "p" ("\e$B%C\e(B" . "\e$B$C\e(B"))
661     ("pa" nil ("\e$B%Q\e(B" . "\e$B$Q\e(B"))
662     ("pe" nil ("\e$B%Z\e(B" . "\e$B$Z\e(B"))
663     ("pi" nil ("\e$B%T\e(B" . "\e$B$T\e(B"))
664     ("po" nil ("\e$B%]\e(B" . "\e$B$]\e(B"))
665     ("pu" nil ("\e$B%W\e(B" . "\e$B$W\e(B"))
666     ("pya" nil ("\e$B%T%c\e(B" . "\e$B$T$c\e(B"))
667     ("pye" nil ("\e$B%T%'\e(B" . "\e$B$T$'\e(B"))
668     ("pyi" nil ("\e$B%T%#\e(B" . "\e$B$T$#\e(B"))
669     ("pyo" nil ("\e$B%T%g\e(B" . "\e$B$T$g\e(B"))
670     ("pyu" nil ("\e$B%T%e\e(B" . "\e$B$T$e\e(B"))
671     ("rr" "r" ("\e$B%C\e(B" . "\e$B$C\e(B"))
672     ("ra" nil ("\e$B%i\e(B" . "\e$B$i\e(B"))
673     ("re" nil ("\e$B%l\e(B" . "\e$B$l\e(B"))
674     ("ri" nil ("\e$B%j\e(B" . "\e$B$j\e(B"))
675     ("ro" nil ("\e$B%m\e(B" . "\e$B$m\e(B"))
676     ("ru" nil ("\e$B%k\e(B" . "\e$B$k\e(B"))
677     ("rya" nil ("\e$B%j%c\e(B" . "\e$B$j$c\e(B"))
678     ("rye" nil ("\e$B%j%'\e(B" . "\e$B$j$'\e(B"))
679     ("ryi" nil ("\e$B%j%#\e(B" . "\e$B$j$#\e(B"))
680     ("ryo" nil ("\e$B%j%g\e(B" . "\e$B$j$g\e(B"))
681     ("ryu" nil ("\e$B%j%e\e(B" . "\e$B$j$e\e(B"))
682     ("ss" "s" ("\e$B%C\e(B" . "\e$B$C\e(B"))
683     ("sa" nil ("\e$B%5\e(B" . "\e$B$5\e(B"))
684     ("se" nil ("\e$B%;\e(B" . "\e$B$;\e(B"))
685     ("sha" nil ("\e$B%7%c\e(B" . "\e$B$7$c\e(B"))
686     ("she" nil ("\e$B%7%'\e(B" . "\e$B$7$'\e(B"))
687     ("shi" nil ("\e$B%7\e(B" . "\e$B$7\e(B"))
688     ("sho" nil ("\e$B%7%g\e(B" . "\e$B$7$g\e(B"))
689     ("shu" nil ("\e$B%7%e\e(B" . "\e$B$7$e\e(B"))
690     ("si" nil ("\e$B%7\e(B" . "\e$B$7\e(B"))
691     ("so" nil ("\e$B%=\e(B" . "\e$B$=\e(B"))
692     ("su" nil ("\e$B%9\e(B" . "\e$B$9\e(B"))
693     ("sya" nil ("\e$B%7%c\e(B" . "\e$B$7$c\e(B"))
694     ("sye" nil ("\e$B%7%'\e(B" . "\e$B$7$'\e(B"))
695     ("syi" nil ("\e$B%7%#\e(B" . "\e$B$7$#\e(B"))
696     ("syo" nil ("\e$B%7%g\e(B" . "\e$B$7$g\e(B"))
697     ("syu" nil ("\e$B%7%e\e(B" . "\e$B$7$e\e(B"))
698     ("tt" "t" ("\e$B%C\e(B" . "\e$B$C\e(B"))
699     ("ta" nil ("\e$B%?\e(B" . "\e$B$?\e(B"))
700     ("te" nil ("\e$B%F\e(B" . "\e$B$F\e(B"))
701     ("tha" nil ("\e$B%F%!\e(B" . "\e$B$F$!\e(B"))
702     ("the" nil ("\e$B%F%'\e(B" . "\e$B$F$'\e(B"))
703     ("thi" nil ("\e$B%F%#\e(B" . "\e$B$F$#\e(B"))
704     ("tho" nil ("\e$B%F%g\e(B" . "\e$B$F$g\e(B"))
705     ("thu" nil ("\e$B%F%e\e(B" . "\e$B$F$e\e(B"))
706     ("ti" nil ("\e$B%A\e(B" . "\e$B$A\e(B"))
707     ("to" nil ("\e$B%H\e(B" . "\e$B$H\e(B"))
708     ("tsu" nil ("\e$B%D\e(B" . "\e$B$D\e(B"))
709     ("tu" nil ("\e$B%D\e(B" . "\e$B$D\e(B"))
710     ("tya" nil ("\e$B%A%c\e(B" . "\e$B$A$c\e(B"))
711     ("tye" nil ("\e$B%A%'\e(B" . "\e$B$A$'\e(B"))
712     ("tyi" nil ("\e$B%A%#\e(B" . "\e$B$A$#\e(B"))
713     ("tyo" nil ("\e$B%A%g\e(B" . "\e$B$A$g\e(B"))
714     ("tyu" nil ("\e$B%A%e\e(B" . "\e$B$A$e\e(B"))
715     ("u" nil ("\e$B%&\e(B" . "\e$B$&\e(B"))
716     ("vv" "v" ("\e$B%C\e(B" . "\e$B$C\e(B"))
717     ("va" nil ("\e$B%t%!\e(B" . "\e$B$&!+$!\e(B"))
718     ("ve" nil ("\e$B%t%'\e(B" . "\e$B$&!+$'\e(B"))
719     ("vi" nil ("\e$B%t%#\e(B" . "\e$B$&!+$#\e(B"))
720     ("vo" nil ("\e$B%t%)\e(B" . "\e$B$&!+$)\e(B"))
721     ("vu" nil ("\e$B%t\e(B" . "\e$B$&!+\e(B"))
722     ("ww" "w" ("\e$B%C\e(B" . "\e$B$C\e(B"))
723     ("wa" nil ("\e$B%o\e(B" . "\e$B$o\e(B"))
724     ("we" nil ("\e$B%&%'\e(B" . "\e$B$&$'\e(B"))
725     ("wi" nil ("\e$B%&%#\e(B" . "\e$B$&$#\e(B"))
726     ("wo" nil ("\e$B%r\e(B" . "\e$B$r\e(B"))
727     ("wu" nil ("\e$B%&\e(B" . "\e$B$&\e(B"))
728     ("xx" "x" ("\e$B%C\e(B" . "\e$B$C\e(B"))
729     ("xa" nil ("\e$B%!\e(B" . "\e$B$!\e(B"))
730     ("xe" nil ("\e$B%'\e(B" . "\e$B$'\e(B"))
731     ("xi" nil ("\e$B%#\e(B" . "\e$B$#\e(B"))
732     ("xka" nil ("\e$B%u\e(B" . "\e$B$+\e(B"))
733     ("xke" nil ("\e$B%v\e(B" . "\e$B$1\e(B"))
734     ("xo" nil ("\e$B%)\e(B" . "\e$B$)\e(B"))
735     ("xtsu" nil ("\e$B%C\e(B" . "\e$B$C\e(B"))
736     ("xtu" nil ("\e$B%C\e(B" . "\e$B$C\e(B"))
737     ("xu" nil ("\e$B%%\e(B" . "\e$B$%\e(B"))
738     ("xwa" nil ("\e$B%n\e(B" . "\e$B$n\e(B"))
739     ("xwe" nil ("\e$B%q\e(B" . "\e$B$q\e(B"))
740     ("xwi" nil ("\e$B%p\e(B" . "\e$B$p\e(B"))
741     ("xya" nil ("\e$B%c\e(B" . "\e$B$c\e(B"))
742     ("xyo" nil ("\e$B%g\e(B" . "\e$B$g\e(B"))
743     ("xyu" nil ("\e$B%e\e(B" . "\e$B$e\e(B"))
744     ("yy" "y" ("\e$B%C\e(B" . "\e$B$C\e(B"))
745     ("ya" nil ("\e$B%d\e(B" . "\e$B$d\e(B"))
746     ("ye" nil ("\e$B%$%'\e(B" . "\e$B$$$'\e(B"))
747     ("yo" nil ("\e$B%h\e(B" . "\e$B$h\e(B"))
748     ("yu" nil ("\e$B%f\e(B" . "\e$B$f\e(B"))
749     ("zz" "z" ("\e$B%C\e(B" . "\e$B$C\e(B"))
750     ("z," nil "\e$B!E\e(B")
751     ("z-" nil "\e$B!A\e(B")
752     ("z." nil "\e$B!D\e(B")
753     ("z/" nil "\e$B!&\e(B")
754     ("z[" nil "\e$B!X\e(B")
755     ("z]" nil "\e$B!Y\e(B")
756     ("za" nil ("\e$B%6\e(B" . "\e$B$6\e(B"))
757     ("ze" nil ("\e$B%<\e(B" . "\e$B$<\e(B"))
758     ("zh" nil "\e$B"+\e(B")
759     ("zi" nil ("\e$B%8\e(B" . "\e$B$8\e(B"))
760     ("zj" nil "\e$B"-\e(B")
761     ("zk" nil "\e$B",\e(B")
762     ("zl" nil "\e$B"*\e(B")
763     ("zo" nil ("\e$B%>\e(B" . "\e$B$>\e(B"))
764     ("zu" nil ("\e$B%:\e(B" . "\e$B$:\e(B"))
765     ("zya" nil ("\e$B%8%c\e(B" . "\e$B$8$c\e(B"))
766     ("zye" nil ("\e$B%8%'\e(B" . "\e$B$8$'\e(B"))
767     ("zyi" nil ("\e$B%8%#\e(B" . "\e$B$8$#\e(B"))
768     ("zyo" nil ("\e$B%8%g\e(B" . "\e$B$8$g\e(B"))
769     ("zyu" nil ("\e$B%8%e\e(B" . "\e$B$8$e\e(B"))
770     ("." nil skk-current-kuten)
771     ("," nil skk-current-touten)
772     ("-" nil "\e$B!<\e(B")
773     (":" nil "\e$B!'\e(B")
774     (";" nil "\e$B!(\e(B")
775     ("?" nil "\e$B!)\e(B")
776     ("[" nil "\e$B!V\e(B")
777     ("]" nil "\e$B!W\e(B")
778     ("l" nil skk-latin-mode)
779     ("q" nil skk-toggle-kana)
780     ("L" nil skk-jisx0208-latin-mode)
781     ("Q" nil skk-set-henkan-point-subr)
782     ("X" nil skk-purge-from-jisyo)
783     ("/" nil skk-abbrev-mode)
784     ("$" nil skk-display-code-for-char-at-point)
785     ("@" nil skk-today)
786     ("\\" nil skk-input-by-code-or-menu)
787    )
788   ;; \e$B%3%s%9%?%s%H$K$7$F$7$^$o$J$$$N$O!"%m!<%^;zF~NO$H$OA4$/JL$N@_Dj$r\e(B
789   ;; \e$B$9$k?M$b$$$k$+$i$G$9!#\e(B
790   "*\e$B%-!<F~NO$KBP$9$kJQ49J8;z$r8=$o$9%*!<%H%^%H%s>uBVA+0\5,B'!#\e(B
791 \e$B%j%9%H$N3FMWAG$O!"2<5-$N%j%9%H7A<0$rK~$?$7$F$$$J$1$l$P$J$i$J$$!#\e(B
792
793 \(\e$B8=:_$N%-!<F~NO>uBV\e(B[@\e$B<!%-!<F~NO\e(B0][@\e$B<!%-!<F~NO\e(B1]...[@\e$B<!%-!<F~NO\e(Bn] \e$B:G=*$N%-!<F~NO>uBV\e(B \e$B=PNO\e(B\)
794
795 \(\e$BC"$7!"\e(B\"@\" \e$B$OO"@\\e(B\) \e$B$r0UL#$9$k!#\e(B
796
797 \e$B=PNO$K;XDj$G$-$k$b$N$O!"J8;zNs!"J8;zNs$r\e(B car, cdr \e$B$K;}$D\e(B dot pair\e$B!"\e(B
798 \e$B4X?tL>%7%s%\%k$N$$$:$l$+!#\e(Bdot pair \e$B$O!"%+%J%b!<%I$N$H$-$O\e(B car \e$B$NJ8\e(B
799 \e$B;zNs!"$+$J%b!<%I$N$H$-$O\e(B cdr \e$B$NJ8;zNs$,A^F~$5$l$k!#J8;zNs$N$_;XDj$5$l\e(B
800 \e$B$F$$$k>l9g$O!"F~NO%b!<%I$K$+$+$o$i$:$=$NJ8;z$,A^F~$5$l$k!#\e(B
801 \e$BJ8;zNs$rA^F~$9$k4X?t$K$D$$$F$O!"\e(Binsert \e$B$rL@<(E*$K8F$VI,MW$O$J$/!"J8;z\e(B
802 \e$BNs$rJV$;$PNI$$!#J8;zNs$rA^F~$7$J$$4X?t$K$D$$$F$b;XDj$O2D!#\e(B
803
804 \e$B$3$NJQ?t$NDj5A$r%Y!<%9$K\e(B skk-rom-kana-rule-list \e$B$,DI2C$5$l!"\e(Bskk-mode
805 \e$B5/F0;~$K\e(B skk-rule-tree \e$B$H$$$&LZ$N7A$K%3%s%Q%$%k$5$l$k!#\e(B
806\e$B$D$N%k!<%k%j%9%H$K=EJ#$9$k%-!<$N@_Dj$,$"$k>l9g$O!"\e(B
807 skk-rom-kana-rule-list \e$B$NDj5A$,M%@h$5$l$k!#\e(B"
808   :type '(repeat
809           (list string string
810                 (choice function string (cons string string))))
811   :group 'skk)
812
813 (defcustom skk-rom-kana-rule-list
814   '(
815     ;; \e$B%f!<%6!<$N9%$_$G@_Dj$,J,$l$=$&$JMWAG$O!"\e(B
816     ;; skk-rom-kana-base-rule-list \e$B$+$i$3$A$i$X0\$7$^$7$g$&\e(B...\e$B!#\e(B
817     ("hh" "h" ("\e$B%C\e(B" . "\e$B$C\e(B"))
818     ;; when you may want to insert \e$B!V$,$s$^!W\e(Bby "gamma"...
819     ("mm" "m" ("\e$B%s\e(B" . "\e$B$s\e(B"))
820    )
821   "*\e$B%-!<F~NO$KBP$9$kJQ49J8;z$r8=$o$9%*!<%H%^%H%s>uBVA+0\5,B'$G!"%f!<%6!<$NDI2C$N@_Dj$r9T$J$&$b$N!#\e(B
822 \e$B%Y!<%9$H$J$k\e(B skk-rom-kana-base-rule-list \e$B$K$3$NJQ?t$NDj5A$,DI2C$5$l!"\e(B
823 skk-mode \e$B5/F0;~$K\e(B skk-rule-tree \e$B$H$$$&LZ$N7A$K%3%s%Q%$%k$5$l$k!#\e(B
824\e$B$D$N%k!<%k%j%9%H$K=EJ#$9$k%-!<$N@_Dj$,$"$k>l9g$O!"$3$NJQ?t$NDj5A$,M%\e(B
825 \e$B@h$5$l$k!#\e(B
826
827 \e$B%j%9%H$N3FMWAG$O!"2<5-$N%j%9%H7A<0$rK~$?$7$F$$$J$1$l$P$J$i$J$$!#\e(B
828
829 \(\e$B8=:_$N%-!<F~NO>uBV\e(B[@\e$B<!%-!<F~NO\e(B0][@\e$B<!%-!<F~NO\e(B1]...[@\e$B<!%-!<F~NO\e(Bn] \e$B:G=*$N%-!<F~NO>uBV\e(B \e$B=PNO\e(B\)
830
831 \(\e$BC"$7!"\e(B\"@\" \e$B$OO"@\\e(B\) \e$B$r0UL#$9$k!#\e(B
832
833 \e$B=PNO$N<oN`$K$D$$$F$O!"\e(Bskk-rom-kana-base-rule-list \e$B$r;2>H$N$3$H!#\e(B
834 \e$B%f!<%6!<$,DI2C$7$?$$%k!<%k$r\e(B
835
836     \(setq skk-rom-kana-rule-list
837       '\(
838         \(\"hh\" \"h\" \(\"\e$B%C\e(B\" . \"\e$B$C\e(B\"\)\)
839         \(\"@\" nil \"\e$B!w\e(B\"\)
840         ...
841         \)
842
843 \e$B$N$h$&$K\e(B .emacs \e$B$d\e(B skk-init-file \e$B$KD>@\=q$/$N$,<j7Z!#\e(B
844
845 \e$B%G%#%U%)%k%H$G$O!"\e(B\(\"hh\" \"h\" \(\"\e$B%C\e(B\" . \"\e$B$C\e(B\"\)\) \e$B$H$$$&MWAG$,@_\e(B
846 \e$BDj$5$l$F$$$k$,!"\e(B\"ohhira\" -> \"\e$B$*$*$R$i\e(B\" \e$B$N$h$&$K\e(B \"hh\" \e$B$rB%2;=hM}\e(B
847 \e$B$7$?$/$J$1$l$P!"\e(Bskk-rom-kana-rule-list \e$B$+$i\e(B
848
849     \(\"hh\" \"h\" \(\"\e$B%C\e(B\" . \"\e$B$C\e(B\"\)\)
850
851 \e$B$H$$$&MWAG$r>C$9!#\e(B
852 \e$B$^$?!"\e(B`@' \e$B$G\e(B skk-today (\e$BEvF|$NF|IU$NF~NO\e(B) \e$B$r5/F0$9$kBe$j$K\e(B `\e$B!w\e(B' \e$B$rF~\e(B
853 \e$BNO$7$?$$>l9g$O!"\e(Bskk-rom-kana-rule-list \e$B$K\e(B
854
855     \(\"@\" nil \"\e$B!w\e(B\"\)
856
857 \e$B$H$$$&MWAG$r2C$($k!#\e(Bskk-mode \e$B$N5/F08e\e(B skk-rom-kana-rule-list \e$B$NJQ99$r\e(B
858 \e$B9T$J$C$?>l9g!"$=$N@_Dj$rH?1G$5$;$k$K$O\e(B M-x skk-restart \e$B$r<B9T$9$kI,MW\e(B
859 \e$B$,$"$k!#\e(B"
860   :type '(repeat
861           (list string string
862                 (choice function string (cons string string))))
863   :group 'skk)
864
865 (defcustom skk-kana-input-search-function
866   (function
867    (lambda ()
868      (save-match-data
869        (and (string-match "^h\\([bcdfghjklmnpqrstvwxz]\\)$" skk-prefix)
870             (member (char-to-string (preceding-char)) '("\e$B$*\e(B" "\e$B%*\e(B"))
871             (cons '("\e$B%*\e(B" . "\e$B$*\e(B") (match-string 1 skk-prefix))))))
872   "*\e$B%k!<%k%j%9%H$NCf$K5-$;$J$$JQ49%k!<%k$r=hM}$9$k4X?t!#\e(B
873 skk-rom-kana-base-rule-list \e$B$H\e(B skk-rom-kana-rule-list \e$B$NMWAG$rA4$F8!:w\e(B
874 \e$B$7$?8e$K%3!<%k$5$l$k!#0z?t$O$J$$!#\e(B
875
876 \(\e$B8=:_$NF~NO$KBP$9$k=PNO\e(B . \"\e$BB3$/\e(B unfixed prefix\"\)
877
878 \e$B$H$$$&%;%k$rJV$9!#=PNO$N<oN`$K$D$$$F$O!"\e(Bskk-rom-kana-base-rule-list \e$B$r\e(B
879 \e$B;2>H$N$3$H!#\e(B
880
881 \e$B%G%#%U%)%k%H$G$O!"\e(B\"\e$B$*\e(B\" \e$B$N8e$N\e(B \"h\" + \e$B;R2;$NF~NO$r\e(B \"\e$B$*$*\e(B\" + \e$BB3$/;R\e(B
882 \e$B2;=hM}MQ$N\e(B unfixed prefix \e$B$KJQ49$7$F$$$k!#\e(B"
883   :type 'function
884   :group 'skk)
885
886 (defcustom skk-okuri-char-alist nil
887   "*\e$B$"$kAw$j2>L>$rJL$NAw$j2>L>$KJQ49$9$k%k!<%k$r5-=R$9$k%(!<%j%9%H!#\e(B"
888   :type '(repeat (cons string string))
889   :group 'skk)
890
891 (defcustom skk-downcase-alist nil
892   "*\e$BJQ49%-!<\e(B (\e$BBgJ8;z%m!<%^;z\e(B) \e$B$N>.J8;z$X$NJQ495,B'$rI=$o$9%(!<%j%9%H!#\e(B
893 \e$BJQ49%-!<$NF~NO$r3+;O$9$k:]!"\e(BSKK \e$B$G$OBgJ8;z$GF~NO$r9T$J$&$N$G!"\e(B
894 skk-set-henkan-point \e$B$NCf$G$3$l$r>.J8;z$KJQ49$9$k:n6H$r9T$J$&!#$3$N%(!<\e(B
895 \e$B%j%9%H$KBgJ8;z\e(B -> \e$B>.J8;z$NJQ49%k!<%k$r=q$$$F$*$/$3$H$G!"%-!<F~NO$N%+%9\e(B
896 \e$B%?%^%$%:$r9T$J$&$3$H$,$G$-$k!#$3$N%(!<%j%9%H$,\e(B null \e$B$N>l9g$O!"C1$K\e(B
897 downcase \e$B$5$l$k!#\e(B"
898   :type '(repeat (cons character character))
899   :group 'skk)
900
901 (defcustom skk-jisx0208-latin-vector
902   [nil  nil  nil  nil  nil  nil  nil  nil
903    nil  nil  nil  nil  nil  nil  nil  nil
904    nil  nil  nil  nil  nil  nil  nil  nil
905    nil  nil  nil  nil  nil  nil  nil  nil
906    "\e$B!!\e(B"  "\e$B!*\e(B" "\e$B!I\e(B" "\e$B!t\e(B" "\e$B!p\e(B" "\e$B!s\e(B" "\e$B!u\e(B" "\e$B!G\e(B"
907    "\e$B!J\e(B" "\e$B!K\e(B" "\e$B!v\e(B" "\e$B!\\e(B" "\e$B!$\e(B" "\e$B!]\e(B" "\e$B!%\e(B" "\e$B!?\e(B"
908    "\e$B#0\e(B" "\e$B#1\e(B" "\e$B#2\e(B" "\e$B#3\e(B" "\e$B#4\e(B" "\e$B#5\e(B" "\e$B#6\e(B" "\e$B#7\e(B"
909    "\e$B#8\e(B" "\e$B#9\e(B" "\e$B!'\e(B" "\e$B!(\e(B" "\e$B!c\e(B" "\e$B!a\e(B" "\e$B!d\e(B" "\e$B!)\e(B"
910    "\e$B!w\e(B" "\e$B#A\e(B" "\e$B#B\e(B" "\e$B#C\e(B" "\e$B#D\e(B" "\e$B#E\e(B" "\e$B#F\e(B" "\e$B#G\e(B"
911    "\e$B#H\e(B" "\e$B#I\e(B" "\e$B#J\e(B" "\e$B#K\e(B" "\e$B#L\e(B" "\e$B#M\e(B" "\e$B#N\e(B" "\e$B#O\e(B"
912    "\e$B#P\e(B" "\e$B#Q\e(B" "\e$B#R\e(B" "\e$B#S\e(B" "\e$B#T\e(B" "\e$B#U\e(B" "\e$B#V\e(B" "\e$B#W\e(B"
913    "\e$B#X\e(B" "\e$B#Y\e(B" "\e$B#Z\e(B" "\e$B!N\e(B" "\e$B!@\e(B" "\e$B!O\e(B" "\e$B!0\e(B" "\e$B!2\e(B"
914    "\e$B!F\e(B" "\e$B#a\e(B" "\e$B#b\e(B" "\e$B#c\e(B" "\e$B#d\e(B" "\e$B#e\e(B" "\e$B#f\e(B" "\e$B#g\e(B"
915    "\e$B#h\e(B" "\e$B#i\e(B" "\e$B#j\e(B" "\e$B#k\e(B" "\e$B#l\e(B" "\e$B#m\e(B" "\e$B#n\e(B" "\e$B#o\e(B"
916    "\e$B#p\e(B" "\e$B#q\e(B" "\e$B#r\e(B" "\e$B#s\e(B" "\e$B#t\e(B" "\e$B#u\e(B" "\e$B#v\e(B" "\e$B#w\e(B"
917    "\e$B#x\e(B" "\e$B#y\e(B" "\e$B#z\e(B" "\e$B!P\e(B" "\e$B!C\e(B" "\e$B!Q\e(B" "\e$B!A\e(B" nil]
918   "*skk-jisx0208-latin-insert \e$B$G;2>H$5$l$kJ8;z%F!<%V%k!#\e(B
919 \e$B%-!<$KBP1~$9$k0LCV$KJ8;zNs$,$"$l$P!"A41Q%b!<%I$G3:Ev$N%-!<$r2!$9$3$H$G!"BP1~$9\e(B
920 \e$B$kJ8;z$,A^F~$5$l$k!#\e(B
921 \e$BNc$($P!"%9%Z!<%9%-!<$KBP1~$7$F!"H>3Q%9%Z!<%9$rA^F~$5$;$k$h$&$KJQ99$7$?$1$l$P!"\e(B
922 skk.el \e$B$N%m!<%I8e\e(B (\e$B$b$7$/$O\e(B skk-load-hook \e$B$rMxMQ$7$F\e(B)\e$B!"\e(B
923
924      \(aset skk-jisx0208-latin-vector 32 \" \"\)
925
926 \e$B$H$9$k$+!"$b$7$/$O!"\e(Bskk-jisx0208-latin-vector \e$B$N\e(B 32 \e$BHVL\\e(B (0 \e$BHV$+$i?t$($F\e(B) \e$B$NCM$r\e(B \" \"
927 \e$B$H$9$k$h$&$J\e(B skk-jisx0208-latin-vector \e$B$rD>@\=q$-!"\e(Bsetq \e$B$GBeF~$9$k!#\e(B32 \e$B$O!"\e(B? (\e$BH>3Q%9\e(B
928 \e$B%Z!<%9$N\e(B char type) \e$B$rI>2A$7$?$H$-$NCM!#\e(B"
929   :type 'vector
930   :group 'skk)
931
932 (defcustom skk-use-face (or window-system (skk-terminal-face-p))
933   "*Non-nil \e$B$G$"$l$P!"\e(BEmacs \e$B$N\e(B face \e$B$N5!G=$r;HMQ$7$FJQ498uJd$r%O%$%i%$%HI=<($9$k!#\e(B"
934   :type 'boolean
935   :group 'skk)
936
937 (defcustom skk-henkan-face 'highlight
938   "*\e$BJQ498uJd$N\e(B face \e$BB0@-!#\e(Bskk-use-face \e$B$,\e(B non-nil \e$B$N$H$-$N$_M-8z!#\e(B
939 Emacs \e$BI8=`%U%'%$%9$N\e(B default, modeline, region, secondary-selection,
940 highlight, underline, bold, italic, bold-italic \e$B$NB>!"?7$?$K\e(B face \e$B$r:n\e(B
941 \e$B$j;XDj$9$k$3$H$b2DG=!#\e(B
942 \e$B?7$?$J\e(B face \e$B$r:n$j;XDj$9$k$K$O\e(B skk-make-face \e$B$rMxMQ$7$F!"\e(B
943
944       \(skk-make-face 'DimGray/PeachPuff1\)
945       \(setq skk-henkan-face 'DimGray/PeachPuff1\)
946
947 \e$B$N$h$&$K$9$k$N$,<j7Z!#\e(Bforeground \e$B$H\e(B background \e$B$N?';XDj$@$1$G$J$$6E$C$?\e(B face
948 \e$B$r:n$k>l9g$O!"\e(Bskk-make-face \e$B$G$OBP1~$G$-$J$$$N$G!"\e(BEmacs \e$B$N\e(B hilit19.el \e$B$N\e(B
949 hilit-lookup-face-create \e$B$J$I$rMxMQ$9$k!#?'$rIU$1$k>l9g$NG[?'$O!"\e(Bcanna.el \e$B$N\e(B
950 canna:attribute-alist \e$B$,NI$$Nc$+$b$7$l$J$$!#\e(B"
951   :type 'face
952   :group 'skk)
953
954 (defcustom skk-use-color-cursor (and window-system (fboundp 'x-display-color-p)
955                                      (x-display-color-p))
956   "*Non-nil \e$B$G$"$l$P!"\e(BSKK \e$B%b!<%I$NF~NO%b!<%I$K1~$8$F%+!<%=%k$K?'$rIU$1$k!#\e(B"
957   :type 'boolean
958   :group 'skk)
959
960 (defcustom skk-default-cursor-color
961   (if (eq skk-emacs-type 'xemacs)
962       (frame-property (selected-frame) 'cursor-color)
963     (cdr (assq 'cursor-color (frame-parameters (selected-frame)))))
964   "*SKK \e$B$N%*%U$r<($9%+!<%=%k?'!#\e(B
965 skk-use-color-cursor \e$B$,\e(B non-nil \e$B$N$H$-$K;HMQ$5$l$k!#\e(B"
966   :group 'skk)
967
968 (defcustom skk-hiragana-cursor-color (if (eq skk-background-mode 'light)
969                                          "coral4"
970                                        "pink")
971   "*\e$B$+$J%b!<%I$r<($9%+!<%=%k?'!#\e(B
972 skk-use-color-cursor \e$B$,\e(B non-nil \e$B$N$H$-$K;HMQ$5$l$k!#\e(B"
973   :type 'string
974   :group 'skk)
975
976 (defcustom skk-katakana-cursor-color (if (eq skk-background-mode 'light)
977                                          "forestgreen"
978                                        "green")
979   "*\e$B%+%?%+%J%b!<%I$r<($9%+!<%=%k?'!#\e(B
980 skk-use-color-cursor \e$B$,\e(B non-nil \e$B$N$H$-$K;HMQ$5$l$k!#\e(B"
981   :type 'string
982   :group 'skk)
983
984 (defcustom skk-jisx0208-latin-cursor-color "gold"
985   "*\e$BA43Q1Q;z%b!<%I$r<($9%+!<%=%k?'!#\e(B
986 skk-use-color-cursor \e$B$,\e(B non-nil \e$B$N$H$-$K;HMQ$5$l$k!#\e(B"
987   :type 'string
988   :group 'skk)
989
990 (defcustom skk-latin-cursor-color (if (eq skk-background-mode 'light)
991                                       "ivory4"
992                                     "gray")
993   "*\e$B%"%9%-!<%b!<%I$r<($9%+!<%=%k?'!#\e(B
994 skk-use-color-cursor \e$B$,\e(B non-nil \e$B$N$H$-$K;HMQ$5$l$k!#\e(B"
995   :type 'string
996   :group 'skk)
997
998 (defcustom skk-abbrev-cursor-color "royalblue"
999   "*abbrev \e$B%b!<%I$r<($9%+!<%=%k?'!#\e(B
1000 skk-use-color-cursor \e$B$,\e(B non-nil \e$B$N$H$-$K;HMQ$5$l$k!#\e(B"
1001   :type 'string
1002   :group 'skk)
1003
1004 (defcustom skk-report-set-cursor-error t
1005   "*Non-nil \e$B$G$"$l$P!"%+%i!<%^%C%W@Z$l$,5/$-$?>l9g!"%(%i!<%a%C%;!<%8$rI=<($9$k!#\e(B
1006 nil \e$B$G$"$l$P!"I=<($7$J$$!#\e(B"
1007   :type 'boolean
1008   :group 'skk)
1009
1010 (defcustom skk-use-cursor-change t
1011   "*Non-nil \e$B$G$"$l$P!"\e(BOvwrt \e$B%^%$%J!<%b!<%I;~$K%+!<%=%k$NI}$r=L$a$k!#\e(B"
1012   :type 'boolean
1013   :group 'skk)
1014
1015 (defcustom skk-auto-insert-paren nil
1016   "*Non-nil \e$B$G$"$l$P!"\e(B2 \e$B$D$NJ8;zNs$r$^$H$a$FA^F~$7!"$=$NJ8;zNs$N4V$K%+!<%=%k$r0\F0$9$k!#\e(B
1017 \e$BNc$($P!"\e(B\"\e$B!V\e(B\" \e$B$rF~NO$7$?$H$-$K\e(B \"\e$B!W\e(B\" \e$B$r<+F0E*$KA^F~$7!"N>$+$.$+$C$3$N4V$K\e(B
1018 \e$B%+!<%=%k$r0\F0$9$k!#\e(B
1019 \e$BA^F~$9$kJ8;zNs$O!"\e(Bskk-auto-paren-string-alist \e$B$G;XDj$9$k!#\e(B"
1020   :type 'boolean
1021   :group 'skk)
1022
1023 (defcustom skk-auto-paren-string-alist
1024   '(("\e$B!V\e(B" . "\e$B!W\e(B") ("\e$B!X\e(B" . "\e$B!Y\e(B") ("(" . ")") ("\e$B!J\e(B" . "\e$B!K\e(B")
1025     ("{" . "}")("\e$B!P\e(B" . "\e$B!Q\e(B") ("\e$B!R\e(B" . "\e$B!S\e(B") ("\e$B!T\e(B" . "\e$B!U\e(B")
1026     ("[" . "]") ("\e$B!N\e(B" . "\e$B!O\e(B") ("\e$B!L\e(B" . "\e$B!M\e(B") ("\e$B!Z\e(B" . "\e$B![\e(B")
1027     ("\"" . "\"")("\e$B!H\e(B" . "\e$B!I\e(B") ("`" . "'")
1028     ;;("<" . ">") ;; skk-special-midashi-char-list \e$B$NCf$K$"$kJ8;z!#\e(B
1029    )
1030   "*\e$B<+F0E*$KBP$K$J$kJ8;zNs$rF~NO$9$k$?$a$NO"A[%j%9%H!#\e(B
1031  skk-auto-insert-paren \e$B$,\e(B non-nil \e$B$N>l9g!"\e(Bcar \e$B$NJ8;zNs$,A^F~$5$l$?$H$-\e(B
1032 \e$B$K\e(B cdr \e$B$NJ8;zNs$r<+F0E*$KA^F~$5$l!"%+!<%=%k$O$=$N\e(B 2 \e$B$D$NJ8;zNs$N4V$K0\\e(B
1033 \e$BF0$9$k!#\e(B
1034 skk-special-midashi-char-list \e$B$NMWAG$K$J$C$F$$$kJ8;z$O!"\e(B
1035 skk-auto-paren-string-alist \e$B$K4^$a$F$b:o=|$5$l$k!#\e(B "
1036   :type '(repeat (cons string string))
1037   :group 'skk)
1038
1039 (defcustom skk-japanese-message-and-error nil
1040   "*Non-nil \e$B$G$"$l$P!"\e(BSKK \e$B$N%a%C%;!<%8$H%(%i!<$rF|K\8l$GI=<($9$k!#\e(B
1041 nil \e$B$G$"$l$P!"1Q8l$GI=<($9$k!#\e(B"
1042   :type 'boolean
1043   :group 'skk)
1044
1045 (defcustom skk-set-henkan-point-key
1046   '(?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K ?M ?N ?O ?P ?R ?S ?T ?U ?V ?W ?Y ?Z)
1047   "*\e$BJQ49$N3+;OCOE@$r7h$a$k%-!<$N%j%9%H!#\e(B"
1048   :type '(repeat character)
1049   :group 'skk)
1050
1051 (defcustom skk-jisyo-save-count 50
1052   "*\e$B?tCM$G$"$l$P!"$=$N2s?t<-=q$,99?7$5$l$?$H$-$K<-=q$r<+F0E*$K%;!<%V$9$k!#\e(B
1053 nil \e$B$G$"$l$P!"<-=q$N%*!<%H%;!<%V$r9T$J$o$J$$!#\e(B"
1054   :type '(choice integer (const nil))
1055   :group 'skk)
1056
1057 (defcustom skk-byte-compile-init-file nil
1058   "*Non-nil \e$B$G$"$l$P!"\e(Bskk-mode \e$B5/F0;~$K\e(B skk-init-file \e$B$r%P%$%H%3%s%Q%$%k$9$k!#\e(B
1059 \e$B@53N$K8@$&$H!"\e(B
1060
1061   (1)skk-init-file \e$B$r%P%$%H%3%s%Q%$%k$7$?%U%!%$%k$,$J$$$+!"\e(B
1062   (2)skk-init-file \e$B$H$=$N%P%$%H%3%s%Q%$%k:Q%U%!%$%k$rHf3S$7$F!"A0<T$NJ}$,?7$7\e(B
1063      \e$B$$$H$-\e(B
1064
1065 \e$B$K\e(B skk-init-file \e$B$r%P%$%H%3%s%Q%$%k$9$k!#\e(B
1066 nil \e$B$G$"$l$P!"\e(Bskk-init-file \e$B$H$=$N%P%$%H%3%s%Q%$%k:Q$_%U%!%$%k$rHf3S$7$F\e(B
1067 skk-init-file \e$B$NJ}$,?7$7$$$H$-$O!"$=$N%P%$%H%3%s%Q%$%k:Q%U%!%$%k$r>C$9!#\e(B"
1068   :type 'boolean
1069   :group 'skk)
1070
1071 (defcustom skk-count-private-jisyo-candidates-exactly nil
1072   "*Non-nil \e$B$G$"$l$P!"\e(BEmacs \e$B$r=*N;$9$k$H$-$K@53N$K8D?M<-=q$N8uJd?t$r?t$($k!#\e(B
1073 nil \e$B$G$"$l$P!"\e(B1 \e$B9T$KJ#?t$N8uJd$,$"$C$F$b\e(B 1 \e$B8uJd$H$7$F?t$($k!#\e(B
1074 \e$B7W;;7k2L$O!"\e(Bskk-record-file \e$B$KJ]B8$5$l$k!#\e(B"
1075   :type 'boolean
1076   :group 'skk)
1077
1078 (defcustom skk-compare-jisyo-size-when-saving t
1079   "*Non-nil \e$B$G$"$l$P!"\e(Bskk-jisyo \e$B$N%;!<%V;~$K%U%!%$%k%5%$%:$N%A%'%C%/$r9T$J$&!#\e(B
1080 \e$BA02s%;!<%V$7$?\e(B skk-jisyo \e$B$H:#2s%;!<%V$7$h$&$H$9$k<-=q$H$N%5%$%:Hf3S$r9T$J$$!"\e(B
1081 \e$B8e<T$NJ}$,Bg$-$$$H$-$K%f!<%6!<$K%;!<%V$rB3$1$k$+$I$&$+$N3NG'$r5a$a$k!#\e(B"
1082   :type 'boolean
1083   :group 'skk)
1084
1085 (defcustom skk-auto-start-henkan t
1086   "*\e$BC18l$dJ8@a$N6h@Z$j$r<($9J8;z$NBG80$K$h$j<+F0E*$KJQ49$r3+;O$9$k!#\e(B
1087 skk-auto-start-henkan-keyword-list \e$B$K$h$jC18l$dJ8@a$N6h@Z$j$r<($9J8;z$r;XDj$9$k!#\e(B"
1088   :type 'boolean
1089   :group 'skk)
1090
1091 (defcustom skk-auto-start-henkan-keyword-list
1092   '("\e$B$r\e(B" "\e$B!"\e(B" "\e$B!#\e(B" "\e$B!%\e(B" "\e$B!$\e(B" "\e$B!)\e(B" "\e$B!W\e(B" "\e$B!*\e(B" "\e$B!(\e(B" "\e$B!'\e(B" ")" ";" ":"
1093     "\e$B!K\e(B" "\e$B!I\e(B" "\e$B![\e(B" "\e$B!Y\e(B" "\e$B!U\e(B" "\e$B!S\e(B" "\e$B!Q\e(B" "\e$B!O\e(B" "\e$B!M\e(B" "}" "]" "?" "."
1094     "," "!")
1095   ;; \e$B$"$^$j%-!<%o!<%I$,B?$/$J$k$H!"DL>o$NJQ49$r:$Fq$K$9$k!)\e(B
1096   "*\e$B<+F0JQ49$r3+;O$9$k%-!<%o!<%I!#\e(B
1097 skk-auto-start-henkan \e$B$,\e(B non-nil \e$B$N$H$-!"$3$N%j%9%H$NMWAG$NJ8;z$rA^F~\e(B
1098 \e$B$9$k$H!"\e(BSPC \e$B$r2!$9$3$H$J$/<+F0E*$KJQ49$r3+;O$9$k!#\e(B"
1099   :type '(repeat string)
1100   :group 'skk)
1101
1102 (defcustom skk-search-excluding-word-pattern-function nil
1103   "*\e$B8D?M<-=q$K<h$j9~$^$J$$J8;zNs$N%Q%?!<%s$r8!:w$9$k4X?t$r;XDj$9$k!#\e(B
1104 \e$B3NDj$7$?J8;zNs$r0z?t$KEO$7$F\e(B funcall \e$B$5$l$k!#\e(B
1105
1106 SKK \e$B$G$OJQ49!"3NDj$r9T$J$C$?J8;zNs$OA4$F8D?M<-=q$K<h$j9~$^$l$k$,!"$3$N\e(B
1107 \e$BJQ?t$G;XDj$5$l$?4X?t$,\e(B non-nil \e$B$rJV$9$H$=$NJ8;zNs$O8D?M<-=q$K<h$j9~$^\e(B
1108 \e$B$l$J$$!#\e(B
1109
1110 \e$BNc$($P!"$3$NJQ?t$K2<5-$N$h$&$J;XDj$9$k$H!"JQ49$K$h$j\e(B (SKK abbrev mode
1111 \e$B$G$NJQ49$r=|$/\e(B) \e$B%+%?%+%J$N$_$+$i$J$kJ8;zNs$rF@$F3NDj$7$F$b!"$=$l$r8D?M\e(B
1112 \e$B<-=q$K<h$j9~$^$J$$!#\e(B
1113
1114   \(setq skk-search-excluding-word-pattern-function
1115         \(function
1116          \(lambda \(kakutei-word\)
1117          ;; \e$B$3$N4X?t$,\e(B t \e$B$rJV$7$?$H$-$O!"$=$NJ8;zNs$O8D?M<-=q$K<h$j9~$^$l$J$$!#\e(B
1118            \(save-match-data
1119              \(and
1120             ;; \e$BAw$j$J$7JQ49$G!"\e(B
1121               \(not skk-okuri-char\)
1122             ;; \e$B3NDj8l$,%+%?%+%J$N$_$+$i9=@.$5$l$F$$$F!"\e(B
1123               \(string-match \"^[\e$B!<%!\e(B-\e$B%s\e(B]+$\" kakutei-word\)
1124             ;; SKK abbrev mode \e$B0J30$G$NJQ49$+!"\e(B
1125               \(or \(not skk-abbrev-mode\)
1126                 ;; \e$B8+=P$78l$,%+%?%+%J!"$R$i$,$J0J30$N$H$-!#\e(B
1127                 ;; \(\e$B8e$G"&%^!<%/$rIU$1$?$H$-$O!"8+=P$78l$,1QJ8;z$G$b!"\e(B
1128                 ;; skk-abbrev-mode\e$B$,\e(B t \e$B$K$J$C$F$$$J$$\e(B\)\e$B!#\e(B
1129                   \(not \(string-match \"^[^\e$B!<%!\e(B-\e$B%s$!\e(B-\e$B$s\e(B]+$\" skk-henkan-key\)\) \)\)\)\)\)\)
1130
1131 \e$B%+%?%+%J$rJQ49$K$h$j5a$a$?$$$,!"8D?M<-=q$K$O%+%?%+%J$N$_$N8uJd$r<h$j9~$_$?\e(B
1132 \e$B$/$J$$!"$J$I!"8D?M<-=q$,I,MW0J>e$KKD$l$k$N$rM^$($kL\E*$K;HMQ$G$-$k!#\e(B
1133
1134 \e$B$J$*!"8D?M<-=q$K<h$j9~$^$J$$8+=P$78l$K$D$$$F$OJd40$,8z$+$J$$$N$G!"Cm0U$9$k$3$H!#\e(B"
1135   :type 'function
1136   :group 'skk)
1137
1138 (defcustom skk-update-jisyo-function 'skk-update-jisyo-original
1139   "*skk-update-jisyo \e$B$G;HMQ$9$k4X?t!#\e(B"
1140   :type 'function
1141   :group 'skk)
1142
1143 (defcustom skk-save-jisyo-function 'skk-save-jisyo-original
1144   "*skk-save-jisyo \e$B$G;HMQ$9$k4X?t!#\e(B"
1145   :type 'function
1146   :group 'skk)
1147
1148 (defcustom skk-count-jisyo-candidates-function
1149   'skk-count-jisyo-candidates-original
1150   "*skk-count-jisyo-candidates \e$B$G;HMQ$9$k4X?t!#\e(B"
1151   :type 'function
1152   :group 'skk)
1153
1154 (defcustom skk-public-jisyo-to-be-searched-function
1155   'skk-public-jisyo-to-be-searched-original
1156   "*skk-public-jisyo-has-entry-p \e$B$G;HMQ$9$k4X?t!#\e(B"
1157   :type 'function
1158   :group 'skk)
1159
1160 (defcustom skk-use-look nil
1161   "*Non-nil \e$B$G$"$l$P!"\e(BUNIX look \e$B%3%^%s%I$rMxMQ$7$?Jd40!&JQ49$r9T$J$&!#\e(B
1162 SKK abbrev \e$B%b!<%I$GJd40$r9T$J$&$H!"8D?M<-=q$r8!:w$7?T$7$?8e$G!"\e(BUNIX look \e$B%3%^%s\e(B
1163 \e$B%I$K$h$k1QC18lJd40$r9T$J$&!#Nc$($P!"\e(B
1164
1165   \e$B"&\e(Bconfe \(TAB\)
1166   ---> \e$B"&\e(Bconference
1167
1168 SKK abbrev \e$B%b!<%I$G!"!V1QJ8;z\e(B + \e$B%"%9%?%j%9%/!W$K$FJQ49$r9T$J$&$H!"\e(Blook \e$B%3%^%s%I\e(B
1169 \e$B$K$h$k$"$$$^$$8!:w$r9T$J$&$3$H$,$G$-$k!#Nc$($P!"\e(B
1170
1171  \e$B"&\e(Bconfere* \(SPC\)
1172   ---> \e$B"'\e(Bconference
1173
1174 \e$B$3$N>uBV$G3NDj$9$k$H!"\e(B`confere*' \e$B$r8+=P$78l!"\e(B`conference' \e$B$r8uJd$H$9$k%(%s%H%j\e(B
1175 \e$B$,8D?M<-=q$KDI2C$5$l$k!#\e(B`skk-search-excluding-word-pattern-function' \e$B$K$h\e(B
1176 \e$B$j!"3NDj$7$F$b$3$N$h$&$J%(%s%H%j$rDI2C$7$J$$$h$&$K@_Dj$9$k$3$H$,$G$-$k!#\e(B"
1177   :type 'boolean
1178   :group 'skk)
1179
1180 (defcustom skk-kana-rom-vector
1181   ["x" "a" "x" "i" "x" "u" "x" "e" "x" "o" "k" "g" "k" "g" "k" "g"
1182    "k" "g" "k" "g" "s" "z" "s" "j" "s" "z" "s" "z" "s" "z" "t" "d"
1183    "t" "d" "x" "t" "d" "t" "d" "t" "d" "n" "n" "n" "n" "n" "h" "b"
1184    "p" "h" "b" "p" "h" "b" "p" "h" "b" "p" "h" "b" "p" "m" "m" "m"
1185    "m" "m" "x" "y" "x" "y" "x" "y" "r" "r" "r" "r" "r" "x" "w" "x"
1186    "x" "w" "n"]
1187   "*skk-remove-common \e$B$G;HMQ$9$k$+$JJ8;z$+$i%m!<%^;z$X$NJQ49%k!<%k!#\e(B
1188 \e$B2<5-$N3:Ev$9$k$+$JJ8;z$r$=$NJ8;z$N%m!<%^;z%W%l%U%#%C%/%9$G8=$o$7$?$b$N!#\e(B
1189     \e$B$!\e(B  \e$B$"\e(B  \e$B$#\e(B  \e$B$$\e(B  \e$B$%\e(B  \e$B$&\e(B  \e$B$'\e(B  \e$B$(\e(B  \e$B$)\e(B  \e$B$*\e(B  \e$B$+\e(B  \e$B$,\e(B  \e$B$-\e(B  \e$B$.\e(B  \e$B$/\e(B  \e$B$0\e(B
1190     \e$B$1\e(B  \e$B$2\e(B  \e$B$3\e(B  \e$B$4\e(B  \e$B$5\e(B  \e$B$6\e(B  \e$B$7\e(B  \e$B$8\e(B  \e$B$9\e(B  \e$B$:\e(B  \e$B$;\e(B  \e$B$<\e(B  \e$B$=\e(B  \e$B$>\e(B  \e$B$?\e(B  \e$B$@\e(B
1191     \e$B$A\e(B  \e$B$B\e(B  \e$B$C\e(B  \e$B$D\e(B  \e$B$E\e(B  \e$B$F\e(B  \e$B$G\e(B  \e$B$H\e(B  \e$B$I\e(B  \e$B$J\e(B  \e$B$K\e(B  \e$B$L\e(B  \e$B$M\e(B  \e$B$N\e(B  \e$B$O\e(B  \e$B$P\e(B
1192     \e$B$Q\e(B  \e$B$R\e(B  \e$B$S\e(B  \e$B$T\e(B  \e$B$U\e(B  \e$B$V\e(B  \e$B$W\e(B  \e$B$X\e(B  \e$B$Y\e(B  \e$B$Z\e(B  \e$B$[\e(B  \e$B$\\e(B  \e$B$]\e(B  \e$B$^\e(B  \e$B$_\e(B  \e$B$`\e(B
1193     \e$B$a\e(B  \e$B$b\e(B  \e$B$c\e(B  \e$B$d\e(B  \e$B$e\e(B  \e$B$f\e(B  \e$B$g\e(B  \e$B$h\e(B  \e$B$i\e(B  \e$B$j\e(B  \e$B$k\e(B  \e$B$l\e(B  \e$B$m\e(B  \e$B$n\e(B  \e$B$o\e(B  \e$B$p\e(B
1194     \e$B$q\e(B  \e$B$r\e(B  \e$B$s\e(B
1195 \e$B$=$l$>$l$N$+$JJ8;z$,Aw$j2>L>$G$"$k>l9g$K$I$N%m!<%^;z%W%l%U%#%C%/%9$rBP1~$5$;$k\e(B
1196 \e$B$N$+$r;XDj$9$k$3$H$,$G$-$k!#!V$8!W!"!V$A!W!"!V$U!W$NJ8;z$K$D$$$F!"BP1~$9$k%m!<\e(B
1197 \e$B%^;z%W%l%U%#%C%/%9$r\e(B \"z\", \"c\",\"f\" \e$B$KJQ99$r4uK>$9$k>l9g$b$"$k$G$"$m$&!#\e(B
1198 skk-auto-okuri-process \e$B$NCM$,\e(B non-nil \e$B$N$H$-!"$"$k$$$O%5JQJd=uJQ49$,9T$J$o$l$k\e(B
1199 \e$B$H$-;2>H$5$l$k!#\e(B"
1200   :type 'vector
1201   :group 'skk)
1202
1203 (defcustom skk-henkan-overlay-priority 600
1204   "*\e$BJQ49$7$?8uJd$K=E$M$k\e(B overlay \e$B$N\e(B priority\e$B!#\e(B
1205 \e$BNc$($P!"\e(BViper \e$B$G\e(B R \e$B%3%^%s%I$K$h$j\e(B replace \e$B$r9T$J$&$H$-$K!"\e(B
1206 viper-replace-overlay \e$B$H$$$&\e(B priority 400 \e$B$N\e(B overlay \e$B$r=E$M$i$l$k$,!"\e(B
1207 skk-henkan-overlay-priority \e$B$N%G%#%U%)%k%HCM$O$3$N\e(B overlay \e$B$h$j\e(B
1208 priority \e$B$,9b$$$N$G!"M%@h$7$FI=<($5$l$k!#\e(B"
1209   :type 'integer
1210   :group 'skk)
1211
1212 (defcustom skk-kuten-touten-alist '((jp . ("\e$B!#\e(B" . "\e$B!"\e(B")) (en . ("\e$B!%\e(B" . "\e$B!$\e(B")))
1213   "*\e$B6gE@$HFIE@$N%(!<%j%9%H!#\e(B
1214 \e$B3FMWAG$N7A<0$O!"\e(B
1215
1216    \(\e$B%7%s%\%k\e(B . \(\e$B6gE@$rI=$o$9J8;zNs\e(B . \e$BFIE@$rI=$o$9J8;zNs\e(B\)\)
1217
1218 \e$B$H$$$&\e(B cons cell\e$B!#%7%s%\%k$NItJ,$O!"\e(B`jp' \e$B$b$7$/$O\e(B `en' \e$B$H$7!"\e(B
1219 skk-toggle-kutouten \e$B$O$3$l$r%H%0%k$G@Z$j49$($k!#\e(B
1220 \e$B%G%#%U%)%k%H$N6gFIE@$N%?%$%W$O!"\e(B`skk-kutouten-type' \e$B$G;XDj$9$k!#\e(B"
1221   :type '(repeat (cons (choice (const jp) (const en))
1222                        (cons string string) ))
1223   :group 'skk)
1224
1225 (skk-deflocalvar skk-kutouten-type 'jp
1226   "*\e$B%G%#%U%)%k%H$N6gFIE@$N%?%$%W!#\e(B`jp' \e$B$b$7$/$O\e(B `en' \e$B$H$$$&%7%s%\%k!#\e(B")
1227
1228 (defcustom skk-read-from-minibuffer-function nil
1229   "*\e$BC18lEPO?%b!<%I$G\e(B read-from-minibuffer \e$B$N\e(B INITIAL-CONTENTS \e$B$rDs6!$9$k\e(B funcition\e$B!#\e(B
1230 \e$B$3$N\e(B function \e$B$OJ8;zNs$rJV$5$J$1$l$P$J$i$J$$!#\e(B
1231 \e$BNc$($P!"\e(Bskk-henkan-key \e$B$r$=$N$^$^\e(B initial-contents \e$B$H$7$FMxMQ$7$?$$$H$-\e(B
1232 \e$B$O!"\e(B
1233   \(setq skk-read-from-minibuffer-function
1234         \(function \(lambda \(\) skk-henkan-key\)\) \)
1235 \e$B$H;XDj$9$k!#\e(B"
1236   :type 'function
1237   :group 'skk)
1238
1239 (defvar skk-latin-mode-map nil "*ASCII \e$B%b!<%I$N%-!<%^%C%W!#\e(B")
1240 (or skk-latin-mode-map
1241     (let ((map (make-sparse-keymap)))
1242       ;; .skk \e$B$G\e(B skk-kakutei-key \e$B$NJQ99$,2DG=$K$J$k$h$&$K!#\e(B
1243       ;;(define-key map skk-kakutei-key 'skk-kakutei)
1244       (skk-define-menu-bar-map map)
1245       (setq skk-latin-mode-map map)))
1246
1247 (defvar skk-j-mode-map nil "*\e$B$+$J%b!<%I$N%-!<%^%C%W!#\e(B")
1248 (or skk-j-mode-map
1249     (let ((map (make-sparse-keymap)))
1250       (substitute-key-definition 'self-insert-command 'skk-insert map
1251                                  global-map)
1252       ;; for Mule-2.x
1253       (substitute-key-definition 'egg-self-insert-command 'skk-insert map
1254                                  global-map)
1255       (substitute-key-definition 'canna-self-insert-command 'skk-insert map
1256                                  global-map)
1257       (substitute-key-definition 'canna-henkan-region-or-self-insert
1258                                  'skk-insert map global-map)
1259       (substitute-key-definition 'can-n-egg-self-insert-command 'skk-insert map
1260                                  global-map)
1261       ;; .skk \e$B$G\e(B skk-kakutei-key \e$B$NJQ99$,2DG=$K$J$k$h$&$K!#\e(B
1262       ;;(define-key map skk-kakutei-key 'skk-kakutei)
1263       (skk-define-menu-bar-map map)
1264       (setq skk-j-mode-map map)))
1265
1266 (defvar skk-jisx0208-latin-mode-map nil "*\e$BA43Q%b!<%I$N%-!<%^%C%W!#\e(B")
1267 (or skk-jisx0208-latin-mode-map
1268     (let ((map (make-sparse-keymap))
1269           (i 0))
1270       (while (< i 128)
1271         (and (aref skk-jisx0208-latin-vector i)
1272              (define-key map (char-to-string i) 'skk-jisx0208-latin-insert))
1273         (setq i (1+ i)))
1274       (define-key map "\C-q" 'skk-latin-henkan)
1275       (skk-define-menu-bar-map map)
1276       (setq skk-jisx0208-latin-mode-map map)))
1277
1278 (defvar skk-abbrev-mode-map nil "*SKK abbrev \e$B%b!<%I$N%-!<%^%C%W!#\e(B")
1279 (or skk-abbrev-mode-map
1280     (let ((map (make-sparse-keymap)))
1281       (define-key map "," 'skk-abbrev-comma)
1282       (define-key map "." 'skk-abbrev-period)
1283       (define-key map "\C-q" 'skk-jisx0208-latin-henkan)
1284       ;; .skk \e$B$G\e(B skk-kakutei-key \e$B$NJQ99$,2DG=$K$J$k$h$&$K!#\e(B
1285       ;;(define-key map skk-kakutei-key 'skk-kakutei)
1286       (skk-define-menu-bar-map map)
1287       (setq skk-abbrev-mode-map map)))
1288
1289 ;;; -- internal constants and variables
1290 ;; ---- global ones.
1291 ;;(defvar skk-henkan-face 'skk-henkan-face)
1292 (defconst skk-month-alist
1293   '(("Jan" . "1") ("Feb" . "2") ("Mar" . "3") ("Apr" . "4") ("May" . "5")
1294     ("Jun" . "6") ("Jul" . "7") ("Aug" . "8") ("Sep" . "9") ("Oct" . "10")
1295     ("Nov" . "11") ("Dec" . "12"))
1296   "\e$B1Q8l$N7nL>$H;;MQ?t;z$NO"A[%j%9%H!#\e(B
1297
1298 \e$B;;MQ?t;z$+$i1Q8l$N7nL>$N$_$r=PNO$9$k$N$G$"$l$P!"%Y%/%?!<$r;H$C$?J}$,9bB.$@$,!"\e(B
1299 \e$B1Q8l$N7nL>$+$i;;MQ?t;z$r=PNO$9$k$N$G$"$l$PO"A[%j%9%H$G$J$1$l$PL5M}$J$N$G!"B?\e(B
1300 \e$BL\E*$K;HMQ$G$-$k$h$&O"A[%j%9%H$N7ABV$r<h$k!#\e(B"
1301   ;;  "Alist of English month abbreviations and numerical values.
1302   ;;
1303   ;;Although it is faster to use a vector if we only want to output
1304   ;;month abbreviations given the ordinal, without the alist it's
1305   ;;unreasonable [sic] to output the ordinal given the abbreviation,
1306   ;;so for multi-purpose utility we use the alist form."
1307  )
1308
1309 (defconst skk-coding-system-alist
1310   (if (memq skk-emacs-type '(xemacs mule4 mule3))
1311       '(("euc" . euc-japan)
1312         ("ujis" . euc-japan)
1313         ("sjis". shift_jis)
1314         ("jis" . junet))
1315     '(("euc" . *euc-japan*)
1316       ("ujis" . *euc-japan*)
1317       ("sjis". *sjis*)
1318       ("jis" . *junet*)))
1319   "coding-system \e$B$NJ8;zNsI=8=$H!"%7%s%\%kI=8=$NO"A[%j%9%H!#\e(B")
1320
1321 (defconst skk-default-jisx0208-latin-vector
1322   ;; note that skk-jisx0208-latin-vector is a user variable.
1323   ;; skk.el \e$B%m!<%IA0$K\e(B .emacs \e$B$J$I$G!"\e(Bskk-jisx0208-latin-vector \e$B$NJL$NCM$r%f!<\e(B
1324   ;; \e$B%6!<$,D>@\=q$$$?$j!"\e(Bskk.el \e$B%m!<%I8e$K$3$NCM$r\e(B aset \e$B$GD>@\$$$8$C$?$j$7$J\e(B
1325   ;; \e$B$1$l$P\e(B default-value \e$B$G\e(B skk-jisx0208-latin-vector \e$B$K%"%/%;%9$9$k$3$H$G\e(B
1326   ;; skk-default-jisx0208-latin-vector \e$B$NCM$rJ];}$9$k$3$H$b$G$-$h$&$,!"$=$l$O\e(B
1327   ;; \e$BK>$a$J$$\e(B...\e$B!#\e(B
1328   [nil  nil  nil  nil  nil  nil  nil  nil
1329    nil  nil  nil  nil  nil  nil  nil  nil
1330    nil  nil  nil  nil  nil  nil  nil  nil
1331    nil  nil  nil  nil  nil  nil  nil  nil
1332    "\e$B!!\e(B"  "\e$B!*\e(B" "\e$B!I\e(B" "\e$B!t\e(B" "\e$B!p\e(B" "\e$B!s\e(B" "\e$B!u\e(B" "\e$B!G\e(B"
1333    "\e$B!J\e(B" "\e$B!K\e(B" "\e$B!v\e(B" "\e$B!\\e(B" "\e$B!$\e(B" "\e$B!]\e(B" "\e$B!%\e(B" "\e$B!?\e(B"
1334    "\e$B#0\e(B" "\e$B#1\e(B" "\e$B#2\e(B" "\e$B#3\e(B" "\e$B#4\e(B" "\e$B#5\e(B" "\e$B#6\e(B" "\e$B#7\e(B"
1335    "\e$B#8\e(B" "\e$B#9\e(B" "\e$B!'\e(B" "\e$B!(\e(B" "\e$B!c\e(B" "\e$B!a\e(B" "\e$B!d\e(B" "\e$B!)\e(B"
1336    "\e$B!w\e(B" "\e$B#A\e(B" "\e$B#B\e(B" "\e$B#C\e(B" "\e$B#D\e(B" "\e$B#E\e(B" "\e$B#F\e(B" "\e$B#G\e(B"
1337    "\e$B#H\e(B" "\e$B#I\e(B" "\e$B#J\e(B" "\e$B#K\e(B" "\e$B#L\e(B" "\e$B#M\e(B" "\e$B#N\e(B" "\e$B#O\e(B"
1338    "\e$B#P\e(B" "\e$B#Q\e(B" "\e$B#R\e(B" "\e$B#S\e(B" "\e$B#T\e(B" "\e$B#U\e(B" "\e$B#V\e(B" "\e$B#W\e(B"
1339    "\e$B#X\e(B" "\e$B#Y\e(B" "\e$B#Z\e(B" "\e$B!N\e(B" "\e$B!@\e(B" "\e$B!O\e(B" "\e$B!0\e(B" "\e$B!2\e(B"
1340    "\e$B!F\e(B" "\e$B#a\e(B" "\e$B#b\e(B" "\e$B#c\e(B" "\e$B#d\e(B" "\e$B#e\e(B" "\e$B#f\e(B" "\e$B#g\e(B"
1341    "\e$B#h\e(B" "\e$B#i\e(B" "\e$B#j\e(B" "\e$B#k\e(B" "\e$B#l\e(B" "\e$B#m\e(B" "\e$B#n\e(B" "\e$B#o\e(B"
1342    "\e$B#p\e(B" "\e$B#q\e(B" "\e$B#r\e(B" "\e$B#s\e(B" "\e$B#t\e(B" "\e$B#u\e(B" "\e$B#v\e(B" "\e$B#w\e(B"
1343    "\e$B#x\e(B" "\e$B#y\e(B" "\e$B#z\e(B" "\e$B!P\e(B" "\e$B!C\e(B" "\e$B!Q\e(B" "\e$B!A\e(B" nil]
1344   "skk-jisx0208-latin-region \e$B$G;2>H$9$kJ8;z%F!<%V%k!#\e(B
1345 \"ascii\" -> \"\e$B#a#s#c#i#i\e(B\" \e$B$N$h$&$JA43QJ8;z$X$NJQ49$r9T$&:]$KMxMQ$9$k!#\e(B")
1346
1347 (defconst skk-kanji-len (length "\e$B$"\e(B")
1348   "\e$B4A;z0lJ8;z$ND9$5!#\e(BMule[1-3] \e$B$G$O\e(B 3 \e$B$K$J$k!#\e(BMule4, XEmacs \e$B$G$O\e(B 1\e$B!#\e(B")
1349
1350 (defconst skk-hankaku-alist
1351   (if (eq skk-emacs-type 'mule2)
1352       '((161 . 32)      ; ?\
1353         (170 . 33)      ;?\!
1354         (201 . 34)      ;?\"
1355         (244 . 35)      ;?\#
1356         (240 . 36)      ;?\$
1357         (243 . 37)      ;?\%
1358         (245 . 38)      ;?\&
1359         (199 . 39)      ;?\'
1360         (202 . 40)      ;?\(
1361         (203 . 41)      ;?\)
1362         (246 . 42)      ;?\*
1363         (220 . 43)      ;?\+
1364         (164 . 44)      ;?\,
1365         (221 . 45)      ;?\-
1366         (165 . 46)      ;?\.
1367         (191 . 47)      ;?\/
1368         (167 . 58)      ;?\:
1369         (168 . 59)      ;?\;
1370         (227 . 60)      ;?\<
1371         (225 . 61)      ;?\=
1372         (228 . 62)      ;?\>
1373         (169 . 63)      ;?\?
1374         (247 . 64)      ;?\@
1375         (206 . 91)      ;?\[
1376         (239 . 92)      ;?\\
1377         (207 . 93)      ;?\]
1378         (176 . 94)      ;?^
1379         (178 . 95)      ;?\_
1380         (208 . 123)     ;?\{
1381         (195 . 124)     ;?\|
1382         (209 . 125)     ;?\}
1383         (177 . 126)     ;?\~
1384         (198 . 96)))    ;?`
1385   "\e$BJ8;z%3!<%I$N\e(B 2 \e$BHVL\$N%P%$%H$H$=$NJ8;z$KBP1~$9$k\e(B ascii \e$BJ8;z\e(B \(char\) \e$B$H$NO"A[%j%9%H!#\e(B
1386 Mule l \e$B$b$7$/$O\e(B  Mule 2 \e$B$r;HMQ$9$k>l9g$K\e(B skk-latin-region \e$B$G;2>H$9$k!#\e(B
1387 Mule-2.3 \e$BE:IU$N\e(B egg.el \e$B$h$j%3%T!<$7$?!#\e(B")
1388
1389 (defconst skk-kana-cleanup-command-list
1390   '(skk-delete-backward-char skk-insert skk-previous-candidate))
1391
1392 (defvar skk-rule-tree nil
1393   "\e$B%m!<%^;z\e(B -> \e$B$+$JJQ49$N>uBVA+0\5,B'$rI=$9%D%j!<$N=i4|>uBV!#\e(B
1394 skk-mode \e$B$N5/F0;~$KKh2s\e(B skk-rom-kana-base-rule-list \e$B$H\e(B
1395 skk-rom-kana-rule-list \e$B$+$iLZ$N7A$K%3%s%Q%$%k$5$l$k!#\e(B")
1396
1397 (defvar skk-insert-new-word-function nil
1398   "\e$B8uJd$rA^F~$7$?$H$-$K\e(B funcall \e$B$5$l$k4X?t$rJ]B8$9$kJQ?t!#\e(B")
1399
1400 (skk-deflocalvar skk-input-mode-string skk-hiragana-mode-string
1401   "SKK \e$B$NF~NO%b!<%I$r<($9J8;zNs!#\e(Bskk-mode \e$B5/F0;~$O!"\e(Bskk-hiragana-mode-string\e$B!#\e(B")
1402
1403 (defvar skk-isearch-message nil
1404   "skk-isearch \e$B4X?t$r%3!<%k$9$k$?$a$N%U%i%0!#\e(B
1405 Non-nil \e$B$G$"$l$P!"\e(Bskk-isearch-message \e$B4X?t$r%3!<%k$9$k!#\e(B")
1406
1407 (defvar skk-mode-invoked nil
1408   "Non-nil \e$B$G$"$l$P!"\e(BEmacs \e$B$r5/F08e4{$K\e(B skk-mode \e$B$r5/F0$7$?$3$H$r<($9!#\e(B")
1409
1410 (defvar skk-kakutei-count 0
1411   "\e$BJQ498uJd$r3NDj$7$?%+%&%s%H$rJ];}$9$kJQ?t!#\e(B
1412 skk-record-file \e$B$N\e(B \"\e$B3NDj\e(B:\" \e$B9`L\$N%+%&%s%?!<!#\e(B")
1413
1414 (defvar skk-touroku-count 0
1415   "\e$B<-=qEPO?$7$?%+%&%s%H$rJ];}$9$kJQ?t!#\e(B
1416 skk-record-file \e$B$N\e(B \"\e$BEPO?\e(B:\" \e$B9`L\$N%+%&%s%?!<!#\e(B")
1417
1418 (defvar skk-update-jisyo-count 0
1419   "\e$B<-=q$r99?7$7$?2s?t!#\e(B
1420 \e$B$3$N%+%&%s%?!<$N?t;z$,\e(B skk-jisyo-save-count \e$B0J>e$H$J$C$?$H$-$K%f!<%6!<<-=q$N%*!<\e(B
1421 \e$B%H%;!<%V$,9T$J$o$l$k!#\e(B
1422 \e$B<-=q$N%;!<%V$,9T$J$o$l$k$H%$%K%7%c%i%$%:$5$l$k!#\e(B")
1423
1424 (defvar skk-minibuffer-origin-mode nil
1425   "\e$BF~NO%b!<%I$rI=$o$9%7%s%\%k!#\e(B
1426 \e$BM-8z$JCM$O!"\e(B`hiragana', `katakana', `abbrev', `latin', `jisx0208-latin' \e$B$b$7$/$O\e(B
1427 nil \e$B$N$$$:$l$+!#\e(B")
1428
1429 ;; ---- buffer local variables
1430 ;; <\e$B%U%i%0N`\e(B>
1431 ;;(skk-deflocalvar skk-current-henkan-data
1432 ;;  '(
1433 ;;    ;; global variables
1434 ;;    ;; \e$B%P%C%U%!%m!<%+%kJQ?t$N%G%#%U%)%k%HCM$r@_Dj$9$k$H!"$3$l$rD>@\=q49$($7$?$H\e(B
1435 ;;    ;; \e$B$-$KB>$N%P%C%U%!$+$i8+$($kCM$bJQ$o$C$F$7$^$&!#\e(Bglobal \e$B$J%U%i%0$O$3$l$rMx\e(B
1436 ;;    ;; \e$BMQ$7$F%G%#%U%)%k%HCMM?$($F$*$/!#\e(B
1437 ;;    (invoked . nil) ; Emacs \e$B$r5/F08e4{$K\e(B skk-mode \e$B$r5/F0$7$?$3$H$r<($9\e(B
1438 ;;    (isearch-message . nil) ; skk-isearch \e$B4X?t$r%3!<%k$9$k$?$a$N%U%i%0\e(B
1439 ;;    (kakutei-count . 0) ; \e$BJQ498uJd$r3NDj$7$?%+%&%s%H$rJ];}$9$kJQ?t\e(B
1440 ;;    (minibuffer-origin-mode . nil) ;\e$BF~NO%b!<%I$rI=$o$9%7%s%\%k\e(B
1441 ;;    (touroku-count . 0) ; \e$B<-=qEPO?$7$?%+%&%s%H$rJ];}$9$kJQ?t\e(B
1442 ;;    (update-jisyo-count . 0) ; \e$B<-=q$r99?7$7$?2s?t\e(B
1443 ;;    ;; buffer-local variables.
1444 ;;    ;;(current-search-prog-list . nil) ;skk-search-prog-list \e$B$N8=:_$NCM$rJ]B8$9$k%j%9%H\e(B
1445 ;;    ;;(exit-show-candidates . nil) ;\e$B%_%K%P%C%U%!$G8uJd$r<!!9$KI=<($7$F!"8uJd$,?T$-$?$3$H$r<($9\e(B
1446 ;;    ;;(henkan-active . nil) ; \e$B"'%b!<%I\e(B (\e$BJQ49Cf\e(B) \e$B$G$"$k$3$H$r<($9\e(B
1447 ;;    ;;(henkan-count . -1) ;skk-henkan-list \e$B$N%j%9%H$N%$%s%G%/%9$G8=:_$N8uJd$r:9$9$b$N\e(B
1448 ;;    ;;(henkan-end-point . nil) ; \e$BJQ49=*N;%]%$%s%H$r<($9%^!<%+!<\e(B
1449 ;;    ;;(henkan-in-minibuff-flag . nil) ;\e$B%_%K%P%C%U%!$G<-=qEPO?$r9T$C$?$H$-$K$3$N%U%i%0$,N)$D\e(B
1450 ;;    ;;(henkan-key . nil) ;\e$BJQ49$9$Y$-8+=P$78l\e(B
1451 ;;    ;;(henkan-list . nil) ; \e$BJQ497k2L$N8uJd$N%j%9%H\e(B
1452 ;;    ;;(henkan-okurigana . nil) ;\e$B8=:_$NJQ49$NAw$j2>L>ItJ,\e(B
1453 ;;    ;;(henkan-on . nil) ; \e$B"&%b!<%I\e(B (\e$BJQ49BP>]$NJ8;zNs7hDj$N$?$a$N%b!<%I\e(B) \e$B$G$"$k$3$H$r<($9\e(B
1454 ;;    ;;(henkan-start-point . nil) ; \e$BJQ493+;O%]%$%s%H$r<($9%^!<%+!<\e(B
1455 ;;    ;;(kakutei-flag . nil) ; \e$B3NDj$7$FNI$$8uJd$r8+$D$1$?>uBV$G$"$k$3$H$r;X$9\e(B
1456 ;;    ;;(kana-start-point . nil) ;\e$B$+$JJ8;z$N3+;O%]%$%s%H$r<($9%^!<%+!<\e(B
1457 ;;    ;;(katakana . nil) ; \e$BF~NO%b!<%I$,%+%J%b!<%I$G$"$k$3$H$r<($9\e(B
1458 ;;    ;;(okuri-ari-max . nil) ; \e$B<-=q$NAw$jM-$j%(%s%H%j$N=*N;E@$r<($9%P%C%U%!%]%$%s%H\e(B
1459 ;;    ;;(okuri-ari-min . nil) ; \e$B<-=q$NAw$jM-$j%(%s%H%j$N3+;OE@$r<($9%P%C%U%!%]%$%s%H\e(B
1460 ;;    ;;(okuri-char . nil) ;\e$BJQ49$9$Y$-8l$NAw$j2>L>$NItJ,$N%W%l%U%#%C%/%9\e(B
1461 ;;    ;;(okuri-index-max . -1) ;skk-henkan-list \e$B$N%$%s%G%/%9$G<+F0Aw$j=hM}!"$b$7$/$O%5JQ8!:w$G8!:w$7$?:G8e$N8uJd$r;X$9$b$N\e(B
1462 ;;    ;;(okuri-index-min . -1) ;skk-henkan-list \e$B$N%$%s%G%/%9$G<+F0Aw$j=hM}!"$b$7$/$O%5JQ8!:w$G8!:w$7$?:G=i$N8uJd$r;X$9$b$N\e(B
1463 ;;    ;;(okuri-nasi-min . nil) ; \e$B<-=q$NAw$j$J$7%(%s%H%j$N3+;OE@$r<($9%P%C%U%!%]%$%s%H\e(B
1464 ;;    ;;(okurigana . nil) ; \e$BAw$j2>L>ItJ,$,F~NOCf$G$"$k$3$H$r<($9\e(B
1465 ;;    ;;(okurigana-start-point . nil) ; \e$BAw$j2>L>$N3+;O%]%$%s%H$r<($9%^!<%+!<\e(B
1466 ;;    ;;(prefix . "") ; \e$BF~NO$9$k$+$J$r7hDj$9$k$?$a$N%W%l%U%#%C%/%9\e(B
1467 ;;    ;;(previous-point . nil) ;\e$B$3$NJQ?t$KJ];}$5$l$k%]%$%s%H$,8=:_$N%]%$%s%H$H0[$J$k>l9g!"\e(Bskk-with-point-move \e$B$,;H$o$l$F$$$J$$%3%^%s%I$rF0:n$5$;$k$H!"\e(Bskk-after-point-move \e$B$,:nF0$9$k\e(B
1468 ;;    ;;(self-insert-non-undo-count . 1) ;skk-insert \e$B$b$7$/$O\e(B skk-jisx0208-latin-insert \e$B$GO"B3F~NO$7$?J8;z?t$rI=$o$9%+%&%s%?!<\e(B
1469 ;;   ))
1470
1471 (skk-deflocalvar skk-mode nil
1472   "Non-nil \e$B$G$"$l$P!"%+%l%s%H%P%C%U%!$G8=:_\e(B skk-mode \e$B$r5/F0$7$F$$$k$3$H$r<($9!#\e(B")
1473
1474 (skk-deflocalvar skk-latin-mode nil
1475   "Non-nil \e$B$G$"$l$P!"F~NO%b!<%I$,\e(B ASCII \e$B%b!<%I$G$"$k$3$H$r<($9!#\e(B")
1476
1477 (skk-deflocalvar skk-j-mode nil
1478   "Non-nil \e$B$G$"$l$P!"F~NO%b!<%I$,$+$J!&%+%J%b!<%I$G$"$k$3$H$r<($9!#\e(B")
1479
1480 (skk-deflocalvar skk-katakana nil
1481   "Non-nil \e$B$G$"$l$P!"F~NO%b!<%I$,%+%J%b!<%I$G$"$k$3$H$r<($9!#\e(B
1482 \"(and (not skk-katakana) skk-j-mode))\" \e$B$,\e(B t \e$B$G$"$l$P!"$+$J%b!<%I$G$"$k$3$H$r\e(B
1483 \e$B<($9!#\e(B")
1484
1485 (skk-deflocalvar skk-jisx0208-latin-mode nil
1486   "Non-nil \e$B$G$"$l$P!"F~NO%b!<%I$,A41Q%b!<%I$G$"$k$3$H$r<($9!#\e(B")
1487
1488 (skk-deflocalvar skk-abbrev-mode nil
1489   "Non-nil \e$B$G$"$l$P!"F~NO%b!<%I$,\e(B SKK abbrev \e$B%b!<%I$G$"$k$3$H$r<($9!#\e(B")
1490
1491 (skk-deflocalvar skk-okurigana nil
1492   "Non-nil \e$B$G$"$l$P!"Aw$j2>L>ItJ,$,F~NOCf$G$"$k$3$H$r<($9!#\e(B")
1493
1494 (skk-deflocalvar skk-henkan-on nil
1495   "Non-nil \e$B$G$"$l$P!""&%b!<%I\e(B \(\e$BJQ49BP>]$NJ8;zNs7hDj$N$?$a$N%b!<%I\e(B\) \e$B$G$"$k$3$H$r<($9!#\e(B")
1496
1497 (skk-deflocalvar skk-henkan-active nil
1498   "Non-nil \e$B$G$"$l$P!""'%b!<%I\e(B \(\e$BJQ49Cf\e(B\) \e$B$G$"$k$3$H$r<($9!#\e(B")
1499
1500 (skk-deflocalvar skk-kakutei-flag nil
1501   "Non-nil \e$B$J$i3NDj$7$FNI$$8uJd$r8+$D$1$?>uBV$G$"$k$3$H$r;X$9!#\e(B
1502 skk-henkan, skk-search-kakutei-jisyo-file, skk-henkan-show-candidates,
1503 skk-henkan-in-minibuff \e$B$H\e(B skk-kakutei-save-and-init-variables \e$B$GJQ99!";2>H$5$l\e(B
1504 \e$B$k!#\e(B")
1505
1506 (skk-deflocalvar skk-exit-show-candidates nil
1507   "\e$B%_%K%P%C%U%!$G8uJd$r<!!9$KI=<($7$F!"8uJd$,?T$-$?$H$-$K\e(B non-nil \e$B$H$J$k!#\e(B
1508 \e$B$=$NCM$O%j%9%H$G!"\e(Bcar \e$B$K\e(B skk-henkan-show-candidate \e$B4X?t$G\e(B while \e$B%k!<%W$r2s$C\e(B
1509 \e$B$?2s?t$r<($90l;~JQ?t\e(B loop \e$B$NCM$r!"\e(Bcdr \e$BIt$K:G8e$K%_%K%P%C%U%!$KI=<($7$?\e(B 1 \e$B$DA0\e(B
1510 \e$B$N8uJd72$N:G8e$NMWAG$r;X$9%$%s%G%/%9$,BeF~$5$l$k!#\e(B
1511 skk-henkan-show-candidates, skk-henkan-in-minibuff \e$B$H\e(B
1512 skk-kakutei-save-and-init-variables \e$B$GJQ99!";2>H$5$l$k!#\e(B")
1513
1514 ;; <\e$B%-!<%^%C%W4XO"\e(B>
1515 (skk-deflocalvar skk-current-rule-tree nil
1516   "\e$B%m!<%^;z\e(B -> \e$B$+$JJQ49$N>uBVA+0\5,B'$rI=$o$9%D%j!<$N8=;~E@$N>uBV!#\e(B
1517 \e$B%m!<%^;zF~NO$N=i4|$G$O\e(B skk-rule-tree \e$B$HF10l$N>uBV$G!"J8;zF~NO$,?J$`$K\e(B
1518 \e$B$D$l!"LZ$r$?$I$C$F$f$/>uBV$NA+0\$rI=$9!#\e(B")
1519
1520 ;; <\e$B<-=q4XO"$NJQ?t\e(B>
1521 (skk-deflocalvar skk-okuri-ari-min nil
1522   "SKK \e$B<-=q$NAw$jM-$j%(%s%H%j$N3+;OE@$r<($9%P%C%U%!%]%$%s%H!#\e(B")
1523
1524 (skk-deflocalvar skk-okuri-ari-max nil
1525   "SKK \e$B<-=q$NAw$jM-$j%(%s%H%j$N=*N;E@$r<($9%P%C%U%!%]%$%s%H!#\e(B
1526 skk-jisyo \e$B$N%P%C%U%!$G$O<-=q$N99?7$NI,MW$,$"$k$?$a$K%^!<%+!<$,BeF~$5$l$k!#\e(B")
1527
1528 (skk-deflocalvar skk-okuri-nasi-min nil
1529   "SKK \e$B<-=q$NAw$j$J$7%(%s%H%j$N3+;OE@$r<($9%P%C%U%!%]%$%s%H!#\e(B
1530 skk-jisyo \e$B$N%P%C%U%!$G$O<-=q$N99?7$NI,MW$,$"$k$?$a$K%^!<%+!<$,BeF~$5$l$k!#\e(B")
1531
1532 ;; <\e$B$=$NB>\e(B>
1533 (skk-deflocalvar skk-mode-line nil
1534   "SKK \e$B$N%b!<%I$r<($9%b!<%I%i%$%s$NJ8;zNs!#\e(B
1535 skk-mode-string, skk-hiragana-mode-string, skk-katakana-mode-string
1536 and skk-jisx0208-latin-mode-string \e$B$N$$$:$l$+$,BeF~$5$l$k!#\e(B")
1537
1538 (skk-deflocalvar skk-previous-point nil
1539   "skk-with-point-move \e$B4XO"JQ?t!#\e(B
1540 \e$B$3$NJQ?t$KJ];}$5$l$k%]%$%s%H$,8=:_$N%]%$%s%H$H0[$J$k>l9g!"\e(Bskk-with-point-move \e$B$,\e(B
1541 \e$B;H$o$l$F$$$J$$%3%^%s%I$rF0:n$5$;$k$H!"\e(Bskk-after-point-move \e$B$,:nF0$9$k!#\e(B")
1542
1543 ;; "" \e$B$KBP1~$7$?%(%s%H%j$,\e(B skk-roma-kana-[aiue] \e$B$K$"$k$?$a!"\e(B"" \e$B$r\e(B nil \e$B$GBeMQ\e(B
1544 ;; \e$B$G$-$J$$!#\e(B
1545 (skk-deflocalvar skk-prefix ""
1546   "\e$BF~NO$9$k$+$J$r7hDj$9$k$?$a$N%W%l%U%#%C%/%9!#\e(B")
1547
1548 (skk-deflocalvar skk-henkan-start-point nil
1549   "\e$BJQ493+;O%]%$%s%H$r<($9%^!<%+!<!#\e(B")
1550
1551 (skk-deflocalvar skk-henkan-end-point nil
1552   "\e$BJQ49=*N;%]%$%s%H$r<($9%^!<%+!<!#\e(B")
1553
1554 (skk-deflocalvar skk-kana-start-point nil
1555   "\e$B$+$JJ8;z$N3+;O%]%$%s%H$r<($9%^!<%+!<!#\e(B")
1556
1557 (skk-deflocalvar skk-okurigana-start-point nil
1558   "\e$BAw$j2>L>$N3+;O%]%$%s%H$r<($9%^!<%+!<!#\e(B")
1559
1560 (skk-deflocalvar skk-henkan-key nil
1561   "\e$BJQ49$9$Y$-8+=P$78l!#\e(B
1562 \e$BNc$($P!"\e(B\"\e$B"&$+$J\e(B\" \e$B$rJQ49$9$l$P!"\e(Bskk-henkan-key \e$B$K$O\e(B \"\e$B$+$J\e(B\" \e$B$,BeF~$5$l$k!#\e(B
1563 \"\e$B"&$o$i\e(B*\e$B$&\e(B\" \e$B$N$h$&$JAw$j$"$j$NJQ49$N>l9g$K$O!"\e(B\"\e$B$o$i\e(Bu\" \e$B$N$h$&$K!"4A;zItJ,$N\e(B
1564 \e$BFI$_$,$J\e(B + \e$BAw$j2>L>$N:G=i$NJ8;z$N%m!<%^;z$N%W%l%U%#%C%/%9$,BeF~$5$l$k!#\e(B")
1565
1566 (skk-deflocalvar skk-okuri-char nil
1567   "\e$BJQ49$9$Y$-8l$NAw$j2>L>$NItJ,$N%W%l%U%#%C%/%9!#\e(B
1568 \e$BNc$($P!"\e(B\"\e$B$*$/\e(B*\e$B$j\e(B\" \e$B$rJQ49$9$k$H$-$O!"\e(Bskk-okuri-char \e$B$O\e(B \"r\"\e$B!#\e(B
1569 skk-okuri-char \e$B$,\e(B non-nil \e$B$G$"$l$P!"Aw$j$"$j$NJQ49$G$"$k$3$H$r<($9!#\e(B")
1570
1571 (skk-deflocalvar skk-henkan-okurigana nil
1572   "\e$B8=:_$NJQ49$NAw$j2>L>ItJ,!#\e(B
1573 \e$BNc$($P!"\e(B\"\e$B"&$&$^$l\e(B*\e$B$k\e(B\" \e$B$rJQ49$9$l$P!"\e(Bskk-henkan-okurigana \e$B$K$O\e(B \"\e$B$k\e(B\" \e$B$,BeF~\e(B
1574 \e$B$5$l$k!#\e(B")
1575
1576 (skk-deflocalvar skk-last-kakutei-henkan-key nil
1577   "\e$B3NDj<-=q$K$h$j:G8e$K3NDj$7$?$H$-$N8+=P$78l!#\e(B
1578 \e$B3NDj<-=q$K$h$k3NDj$ND>8e$K\e(B x \e$B%-!<$r2!$9$H3NDj$,%"%s%I%%$5$l$F!"3NDjA0$N>uBV$G\e(B
1579 \e$B$3$N8+=P$78l$,%+%l%s%H%P%C%U%!$KA^F~$5$l$k!#\e(B")
1580
1581 (skk-deflocalvar skk-henkan-list nil
1582   "\e$BJQ497k2L$N8uJd$N%j%9%H!#\e(B
1583 \e$BNc$($P!"\e(B\"\e$B"&$J\e(B*\e$B$/\e(B\" \e$B$H$$$&JQ49$9$l$P!"\e(Bskk-henkan-list \e$B$O\e(B
1584 (\"\e$BLD\e(B\" \"\e$B5c\e(B\" \"\e$BL5\e(B\" \"\e$BK4\e(B\") \e$B$N$h$&$K$J$k!#\e(B")
1585
1586 (skk-deflocalvar skk-henkan-count -1
1587   "skk-henkan-list \e$B$N%j%9%H$N%$%s%G%/%9$G8=:_$N8uJd$r:9$9$b$N!#\e(B")
1588
1589 (skk-deflocalvar skk-self-insert-non-undo-count 1
1590   "skk-insert \e$B$b$7$/$O\e(B skk-jisx0208-latin-insert \e$B$GO"B3F~NO$7$?J8;z?t$rI=$o$9%+%&%s%?!<!#\e(B
1591 Emacs \e$B$N%*%j%8%J%k$NF0:n$G$O!"\e(Bself-insert-command \e$B$K%P%$%s%I$5$l$?%-!<F~NO$O!"\e(B
1592 \e$BO"B3\e(B 20 \e$B2s$^$G$,\e(B 1 \e$B$D$N%"%s%I%%$NBP>]$H$J$k!#$3$NF0:n$r%(%_%e%l!<%H$9$k$?$a$N\e(B
1593 \e$B%+%&%s%?!<!#$3$N%+%&%s%?!<$,!"\e(B20 \e$B0J2<$G$"$k$H$-$O!"F~NO$N$?$S$K\e(B
1594 cancel-undo-boundary \e$B$,%3!<%k$5$l$k!#\e(B")
1595
1596 (skk-deflocalvar skk-current-search-prog-list nil
1597   "skk-search-prog-list \e$B$N8=:_$NCM$rJ]B8$9$k%j%9%H!#\e(B
1598 \e$B:G=i$NJQ49;~$O\e(B skk-search-prog-list \e$B$NA4$F$NCM$rJ];}$7!"JQ49$r7+$jJV$9$?$S$K\e(B 1
1599 \e$B$D$E$DC;$/$J$C$F$f$/!#\e(B")
1600
1601 ;; for skk-undo-kakutei
1602 (skk-deflocalvar skk-last-henkan-data nil
1603   "\e$B:G8e$K9T$J$C$?JQ49$K4X$9$k%G!<%?$N%(!<%j%9%H!#\e(B
1604 \e$B%G%#%U%)%k%H$N%-!<$O!"\e(Bhenkan-key, henkan-okurigana,
1605 okuri-char, henkan-list \e$B$N3F%7%s%\%k!#\e(B
1606 \(skk-num \e$B$r\e(B require \e$B$7$F$$$k$H$-$O!"\e(Bnum-list \e$B$,DI2C$5$l$k\e(B\)\e$B!#\e(B")
1607
1608 (skk-deflocalvar skk-henkan-overlay nil
1609   "\e$B8uJd$rI=<($9$k$H$-$K;HMQ$9$k\e(B Overlay\e$B!#\e(B")
1610
1611 (skk-deflocalvar skk-henkan-in-minibuff-flag nil
1612   "\e$B%_%K%P%C%U%!$G<-=qEPO?$r9T$C$?$H$-$K$3$N%U%i%0$,N)$D!#\e(B
1613 skk-remove-common \e$B$G;2>H$5$l$k!#\e(B")
1614
1615 (skk-deflocalvar skk-okuri-index-min -1
1616   "skk-henkan-list \e$B$N%$%s%G%/%9$G<+F0Aw$j=hM}!"$b$7$/$O%5JQ8!:w$G8!:w$7$?:G=i$N8uJd$r;X$9$b$N!#\e(B")
1617
1618 (skk-deflocalvar skk-okuri-index-max -1
1619   "skk-henkan-list \e$B$N%$%s%G%/%9$G<+F0Aw$j=hM}!"$b$7$/$O%5JQ8!:w$G8!:w$7$?:G8e$N8uJd$r;X$9$b$N!#\e(B")
1620
1621 (set-modified-alist
1622  'minor-mode-map-alist
1623  (list (cons 'skk-latin-mode skk-latin-mode-map)
1624        (cons 'skk-abbrev-mode skk-abbrev-mode-map)
1625        (cons 'skk-j-mode skk-j-mode-map)
1626        (cons 'skk-jisx0208-latin-mode skk-jisx0208-latin-mode-map)))
1627
1628 ;;;; defadvices.
1629 ;; defadvice \e$B$GDj5A$9$k$H!"8e$G%f!<%6!<$,?75,$N5!G=$rIU$1$F99$K\e(B defadvice \e$B$7$F\e(B
1630 ;; \e$B$b$A$c$s$HF0$/!#\e(B
1631
1632 ;; cover to original functions.
1633
1634 (defadvice keyboard-quit (around skk-ad activate)
1635   "\e$B"'%b!<%I$G$"$l$P!"8uJd$NI=<($r$d$a$F"&%b!<%I$KLa$9\e(B (\e$B8+=P$78l$O;D$9\e(B)\e$B!#\e(B
1636 \e$B"&%b!<%I$G$"$l$P!"8+=P$78l$r:o=|$9$k!#\e(B
1637 \e$B>e5-$N$I$A$i$N%b!<%I$G$b$J$1$l$P\e(B keyboard-quit \e$B$HF1$8F0:n$r$9$k!#\e(B"
1638   (cond
1639    ;; SKK is not invoked in the current buffer.
1640    ((not skk-mode) ad-do-it)
1641    ;; \e$B"#\e(B mode (Kakutei input mode).
1642    ((not skk-henkan-on)
1643     (cond ((skk-get-prefix skk-current-rule-tree)
1644            (skk-erase-prefix 'clean))
1645           (t ad-do-it)))
1646    ;; \e$B"'\e(B mode (Conversion mode).
1647    (skk-henkan-active
1648     (setq skk-henkan-count 0)
1649     (if (and skk-delete-okuri-when-quit skk-henkan-okurigana)
1650         (let ((count (/ (length skk-henkan-okurigana) skk-kanji-len)))
1651           (skk-previous-candidate)
1652           ;; \e$B$3$3$G$O\e(B delete-backward-char \e$B$KBhFs0z?t$rEO$5$J$$J}$,%Y%?!<!)\e(B
1653           (delete-backward-char count))
1654       (skk-previous-candidate)))
1655    ;; \e$B"&\e(B mode (Midashi input mode).
1656    (t (skk-erase-prefix 'clean)
1657       (and (> (point) skk-henkan-start-point)
1658            (delete-region (point) skk-henkan-start-point))
1659       (skk-kakutei))))
1660
1661 (defadvice abort-recursive-edit (around skk-ad activate)
1662   "\e$B"'%b!<%I$G$"$l$P!"8uJd$NI=<($r$d$a$F"&%b!<%I$KLa$9\e(B (\e$B8+=P$78l$O;D$9\e(B)\e$B!#\e(B
1663 \e$B"&%b!<%I$G$"$l$P!"8+=P$78l$r:o=|$9$k!#\e(B
1664 \e$B>e5-$N$I$A$i$N%b!<%I$G$b$J$1$l$P\e(B abort-recursive-edit \e$B$HF1$8F0:n$r$9$k!#\e(B"
1665   (skk-remove-minibuffer-setup-hook
1666    'skk-j-mode-on 'skk-setup-minibuffer
1667    (function (lambda () (add-hook 'pre-command-hook 'skk-pre-command nil 'local))))
1668   (cond ((not skk-mode) ad-do-it)
1669         ((not skk-henkan-on)
1670          (cond ((skk-get-prefix skk-current-rule-tree)
1671                 (skk-erase-prefix 'clean))
1672                (t ad-do-it)))
1673         (skk-henkan-active
1674          (setq skk-henkan-count 0)
1675          (if (and skk-delete-okuri-when-quit skk-henkan-okurigana)
1676              (let ((count (/ (length skk-henkan-okurigana) skk-kanji-len)))
1677                (skk-previous-candidate)
1678                ;; \e$B$3$3$G$O\e(B delete-backward-char \e$B$KBhFs0z?t$rEO$5$J$$J}$,%Y%?!<!)\e(B
1679                (delete-backward-char count))
1680            (skk-previous-candidate)))
1681         (t (skk-erase-prefix 'clean)
1682            (and (> (point) skk-henkan-start-point)
1683                 (delete-region (point) skk-henkan-start-point))
1684            (skk-kakutei))))
1685         
1686 (defadvice newline (around skk-ad activate)
1687   "skk-egg-like-newline \e$B$,\e(B non-nil \e$B$@$C$?$i!"JQ49Cf$N\e(B newline \e$B$G3NDj$N$_9T$$!"2~9T$7$J$$!#\e(B"
1688   (if (not (or skk-j-mode skk-abbrev-mode))
1689       ad-do-it
1690     (let (
1691           ;;(arg (ad-get-arg 0))
1692           ;; skk-kakutei \e$B$r<B9T$9$k$H\e(B skk-henkan-on \e$B$NCM$,L5>r7o$K\e(B nil \e$B$K$J$k\e(B
1693           ;; \e$B$N$G!"J]B8$7$F$*$/I,MW$,$"$k!#\e(B
1694           (no-newline (and skk-egg-like-newline skk-henkan-on))
1695           (auto-fill-function (and (interactive-p) auto-fill-function)))
1696       ;; fill \e$B$5$l$F$b\e(B nil \e$B$,5"$C$F$/$k\e(B :-<
1697       ;;(if (skk-kakutei)
1698       ;;    (setq arg (1- arg)))
1699       ;;(if skk-mode
1700       ;;    (let ((opos (point)))
1701       ;;      ;; skk-kakutei (skk-do-auto-fill) \e$B$K$h$C$F9T$,@^$jJV$5$l$?$i\e(B arg \e$B$r\e(B 1 \e$B$D8:$i$9!#\e(B
1702       ;;      (skk-kakutei)
1703       ;;      (if (and (not (= opos (point))) (integerp arg))
1704       ;;          (ad-set-arg 0 (1- arg)))))
1705       (and skk-mode (skk-kakutei))
1706       (if (not no-newline)
1707           ad-do-it))))
1708
1709 (defadvice newline-and-indent (around skk-ad activate)
1710   "skk-egg-like-newline \e$B$,\e(B non-nil \e$B$@$C$?$i!"JQ49Cf$N\e(B newline-and-indent \e$B$G3NDj$N$_9T$$!"2~9T$7$J$$!#\e(B"
1711   (if (not (or skk-j-mode skk-abbrev-mode))
1712       ad-do-it
1713     (let ((no-newline (and skk-egg-like-newline skk-henkan-on))
1714           (auto-fill-function (and (interactive-p) auto-fill-function)))
1715       (and skk-mode (skk-kakutei))
1716       (or no-newline ad-do-it))))
1717
1718 (defadvice exit-minibuffer (around skk-ad activate)
1719   "skk-egg-like-newline \e$B$,\e(B non-nil \e$B$@$C$?$i!"JQ49Cf$N\e(B exit-minibuffer \e$B$G3NDj$N$_9T$&!#\e(B"
1720   (skk-remove-minibuffer-setup-hook
1721    'skk-j-mode-on 'skk-setup-minibuffer
1722    (function (lambda ()
1723                (add-hook 'pre-command-hook 'skk-pre-command nil 'local))))
1724   (if (not (or skk-j-mode skk-abbrev-mode))
1725       ad-do-it
1726     (let ((no-newline (and skk-egg-like-newline skk-henkan-on)))
1727       (and skk-mode (skk-kakutei))
1728       (or no-newline ad-do-it))))
1729
1730 (defadvice picture-mode-exit (before skk-ad activate)
1731   "SKK \e$B$N%P%C%U%!%m!<%+%kJQ?t$rL58z$K$7!"\e(Bpicture-mode-exit \e$B$r%3!<%k$9$k!#\e(B
1732 picture-mode \e$B$+$i=P$?$H$-$K$=$N%P%C%U%!$G\e(B SKK \e$B$r@5>o$KF0$+$9$?$a$N=hM}!#\e(B"
1733   (and skk-mode (skk-kill-local-variables)))
1734
1735 (defadvice undo (before skk-ad activate)
1736   "SKK \e$B%b!<%I$,\e(B on \e$B$J$i\e(B skk-self-insert-non-undo-count \e$B$r=i4|2=$9$k!#\e(B"
1737   (and skk-mode (setq skk-self-insert-non-undo-count 0)))
1738
1739 ;;; XXX interactive subr with args.
1740 (defadvice kill-buffer (before skk-ad activate)
1741   "SKK \e$B$N"'%b!<%I$@$C$?$i!"3NDj$7$F$+$i%P%C%U%!$r%-%k$9$k!#\e(B
1742   \e$B%P%C%U%!$N%-%k8e!"\e(BSKK \e$B$N%b!<%I$K=>$$%+!<%=%k$N?'$rJQ$($k!#\e(B"
1743   (interactive "bKill buffer: ")
1744   (and skk-mode skk-henkan-on (interactive-p) (skk-kakutei)))
1745
1746 (defadvice save-buffers-kill-emacs (before skk-ad activate)
1747   (run-hooks 'skk-before-kill-emacs-hook))
1748
1749 (if (eq skk-emacs-type 'xemacs)
1750     ;; XEmacs has minibuffer-keyboard-quit that has nothing to do with delsel.
1751     (defadvice minibuffer-keyboard-quit (around skk-ad activate)
1752       (skk-remove-minibuffer-setup-hook
1753        'skk-j-mode-on 'skk-setup-minibuffer
1754        (function (lambda ()
1755                    (add-hook 'pre-command-hook 'skk-pre-command nil 'local))))
1756       (cond ((not skk-mode) ad-do-it)
1757             ((not skk-henkan-on)
1758              (cond ((skk-get-prefix skk-current-rule-tree)
1759                     (skk-erase-prefix 'clean))
1760                     (t ad-do-it)))
1761             (skk-henkan-active
1762              (setq skk-henkan-count 0)
1763              (if (and skk-delete-okuri-when-quit skk-henkan-okurigana)
1764                  (let ((count (/ (length skk-henkan-okurigana) skk-kanji-len)))
1765                    (skk-previous-candidate)
1766                    ;; \e$B$3$3$G$O\e(B delete-backward-char \e$B$KBhFs0z?t$rEO$5$J$$J}$,%Y%?!<!)\e(B
1767                    (delete-backward-char count))
1768                (skk-previous-candidate)))
1769             (t (skk-erase-prefix 'clean)
1770                (and (> (point) skk-henkan-start-point)
1771                     (delete-region (point) skk-henkan-start-point))
1772                (skk-kakutei))))
1773   (defadvice minibuffer-keyboard-quit (around skk-ad activate)
1774     ;; for delsel.el
1775     (if (and skk-mode
1776              (not (and delete-selection-mode transient-mark-mode mark-active)))
1777         (keyboard-quit)
1778       ad-do-it)))
1779
1780 ;;;; mode setup
1781
1782 ;;;###autoload
1783 (defun skk-mode (&optional arg)
1784   "\e$BF|K\8lF~NO%b!<%I!#\e(B
1785 \e$B%^%$%J!<%b!<%I$N0l<o$G!"%*%j%8%J%k$N%b!<%I$K$O1F6A$rM?$($J$$!#\e(B
1786 \e$BIi$N0z?t$rM?$($k$H\e(B SKK \e$B%b!<%I$+$iH4$1$k!#\e(B
1787
1788 An input mode for Japanese, converting romanized phonetic strings to kanji.
1789
1790 A minor mode, it should not affect the use of any major mode or
1791 orthogonal minor modes.
1792
1793 In the initial SKK mode, hiragana submode, the mode line indicator is
1794 \"\e$B$+$J\e(B\".  Lowercase romaji entry is automatically converted to
1795 hiragana where possible.  The lowercase characters `q' and `l' change
1796 submodes of SKK, and `x' is used as a prefix indicating a small kana.
1797
1798 `q' is used to toggle between hiragana and katakana \(mode line
1799 indicator \"\e$B%+%J\e(B\"\) entry submodes.
1800
1801 `l' is used to enter ASCII submode \(mode line indicator \"SKK\"\).
1802 Uppercase `L' enters JISX0208 latin \(wide ASCII\) submode \(mode line
1803 indicator \"\e$BA41Q\e(B\"\).  `\C-j' returns to hiragana submode from either
1804 ASCII submode.
1805
1806 Kanji conversion is complex, but the basic principle is that the user
1807 signals the appropriate stem to be matched against dictionary keys by
1808 the use of uppercase letters.  Because SKK does not use grammatical
1809 information, both the beginning and the end of the stem must be marked.
1810
1811 For non-inflected words \(eg, nouns\) consisting entirely of kanji, the
1812 simplest way to invoke conversion is to enter the reading of the kanji,
1813 the first character only in uppercase.  A leading \"\e$B"&\e(B\" indicates that
1814 kanji conversion is in progress.  After entering the reading, press
1815 space.  This invokes dictionary lookup, and the hiragana reading will be
1816 redisplayed in kanji as the first candidate.  Pressing space again gives
1817 the next candidate.  Further presses of space produce further candidates,
1818 as well as a list of the next few candidates in the minibuffer.  Eg,
1819 \"Benri\" => \"\e$B"&$Y$s$j\e(B\", and pressing space produces \"\e$B"'JXMx\e(B\" \(the solid
1820 triangle indicates that conversion is in progress\).  Backspace steps
1821 through the candidate list in reverse.
1822
1823 A candidate can be accepted by pressing `\C-j', or by entering a
1824 self-inserting character.  \(Unlike other common Japanese input methods,
1825 RET not only accepts the current candidate, but also inserts a line
1826 break.\)
1827
1828 Inflected words \(verbs and adjectives\), like non-inflected words, begin
1829 entry with a capital letter.  However, for these words the end of the
1830 kanji string is signaled by capitalizing the next mora.  Eg, \"TuyoI\"
1831 => \"\e$B"'6/$$\e(B\".  If no candidate is available at that point, the inflection
1832 point will be indicated with an asterisk \"*\", and trailing characters
1833 will be displayed until a candidate is recognized.  It will be
1834 immediately displayed \(pressing space is not necessary\).  Space and
1835 backspace are used to step forward and backward through the list of
1836 candidates.
1837
1838 For more information, see the `skk' topic in Info.  \(Japanese only.\)
1839
1840 A tutorial is available in Japanese or English via \"M-x skk-tutorial\".
1841 Use a prefix argument to choose the language.  The default is system-
1842 dependent."
1843   (interactive "P")
1844   (setq skk-mode (cond ((null arg) (not skk-mode))
1845                        ;; - \e$B$O\e(B -1 \e$B$KJQ49$5$l$k!#\e(B
1846                        ((> (prefix-numeric-value arg) 0) t)))
1847   (if (not skk-mode)
1848       ;; exit skk-mode
1849       (progn
1850         (let ((skk-mode t)) (skk-kakutei))
1851         (skk-mode-off)
1852         (and (eq skk-status-indicator 'left)
1853              (setq skk-input-mode-string ""))
1854         (and (eq skk-emacs-type 'xemacs) (easy-menu-remove skk-menu)))
1855     ;; enter skk-mode
1856     (if (not skk-mode-invoked)
1857         ;; enter skk-mode for the first time in this session
1858         (progn
1859           (and (eq skk-emacs-type 'xemacs)
1860                (boundp 'preloaded-file-list)
1861                (member "skk-leim" preloaded-file-list)
1862                ;; require dummy file.
1863                (require 'skk-vars))
1864           (skk-setup-init-file)
1865           (load skk-init-file t)
1866           (skk-setup-modeline)
1867           (require 'skk-autoloads)
1868           (if (or (memq skk-emacs-type '(mule3 mule4))
1869                   (and (eq skk-emacs-type 'xemacs)
1870                        (or
1871                         ;; XEmacs 21 or later.
1872                         (> emacs-major-version 20)
1873                         ;; XEmacs 20.4 or later.
1874                         (> emacs-minor-version 2))))
1875               (require 'skk-leim))
1876           (if skk-use-numeric-conversion (require 'skk-num))
1877           (if skk-keep-record
1878               (skk-create-file skk-record-file
1879                                "SKK \e$B$N5-O?MQ%U%!%$%k$r:n$j$^$7$?\e(B"
1880                                "I have created an SKK record file for you"))
1881           (skk-create-file skk-jisyo
1882                            "SKK \e$B$N6u<-=q$r:n$j$^$7$?\e(B"
1883                            "I have created an empty SKK Jisyo file for you")
1884           (skk-regularize)
1885           (setq skk-mode-invoked t)))
1886     ;; \e$B0J2<$O\e(B skk-mode \e$B$KF~$k$?$S$KKhEY%3!<%k$5$l$k%3!<%I!#\e(B
1887     (and skk-use-viper (require 'skk-viper))
1888     (and (or skk-use-color-cursor skk-use-cursor-change)
1889          (require 'skk-cursor))
1890     ;; .skk \e$B$G\e(B skk-kakutei-key \e$B$NJQ99$,2DG=$K$J$k$h$&$K!#\e(B
1891     (define-key skk-abbrev-mode-map skk-kakutei-key 'skk-kakutei)
1892     (define-key skk-abbrev-mode-map (char-to-string skk-start-henkan-char)
1893       'skk-start-henkan)
1894     (define-key skk-abbrev-mode-map (char-to-string skk-try-completion-char)
1895       'skk-try-completion)
1896     (define-key skk-latin-mode-map skk-kakutei-key 'skk-kakutei)
1897     (define-key skk-j-mode-map skk-kakutei-key 'skk-kakutei)
1898     (define-key skk-j-mode-map (char-to-string skk-try-completion-char)
1899       'skk-insert)
1900     (define-key skk-j-mode-map (char-to-string skk-previous-candidate-char)
1901       'skk-previous-candidate)
1902     (define-key skk-jisx0208-latin-mode-map skk-kakutei-key 'skk-kakutei)
1903     (define-key minibuffer-local-map skk-kakutei-key 'skk-kakutei)
1904     (define-key minibuffer-local-completion-map skk-kakutei-key 'skk-kakutei)
1905     (if skk-use-viper
1906         ()
1907       (define-key skk-j-mode-map
1908         (char-to-string skk-start-henkan-with-completion-char)
1909         'skk-start-henkan-with-completion)
1910       (define-key skk-abbrev-mode-map
1911         (char-to-string skk-start-henkan-with-completion-char)
1912         'skk-start-henkan-with-completion)
1913       (define-key skk-j-mode-map
1914         (char-to-string skk-backward-and-set-henkan-point-char)
1915         'skk-backward-and-set-henkan-point)
1916       (define-key skk-jisx0208-latin-mode-map
1917         (char-to-string skk-backward-and-set-henkan-point-char)
1918         'skk-backward-and-set-henkan-point)
1919      )
1920     (skk-setup-delete-backward-char)
1921     ;; XEmacs doesn't have minibuffer-local-ns-map
1922     (and (boundp 'minibuffer-local-ns-map)
1923          (define-key minibuffer-local-ns-map skk-kakutei-key 'skk-kakutei))
1924     ;; To terminate kana input.
1925     (make-local-hook 'pre-command-hook)
1926     (add-hook 'pre-command-hook 'skk-pre-command nil 'local)
1927     (make-local-hook 'post-command-hook)
1928     (add-hook 'post-command-hook 'skk-after-point-move nil 'local)
1929     (and (eq skk-status-indicator 'left)
1930          (setq skk-input-mode-string skk-hiragana-mode-string))
1931     (skk-j-mode-on)
1932     (and (eq skk-emacs-type 'xemacs) (easy-menu-add skk-menu))
1933     (run-hooks 'skk-mode-hook)))
1934
1935 ;;;###autoload
1936 (defun skk-auto-fill-mode (&optional arg)
1937   "\e$BF|K\8lF~NO%b!<%I!#<+F0@^$jJV$75!G=IU$-!#\e(B
1938 \e$B%^%$%J!<%b!<%I$N0l<o$G!"%*%j%8%J%k$N%b!<%I$K$O1F6A$rM?$($J$$!#\e(B
1939 \e$B@5$N0z?t$rM?$($k$H!"6/@)E*$K\e(B auto-fill-mode \e$B5Z$S\e(B SKK \e$B%b!<%I$KF~$k!#\e(B
1940 \e$BIi$N0z?t$rM?$($k$H\e(B auto-fill-mode \e$B5Z$S\e(B SKK \e$B%b!<%I$+$iH4$1$k!#\e(B"
1941   (interactive "P")
1942   (let ((auto-fill
1943          (cond ((null arg) (not auto-fill-function))
1944                ((> (prefix-numeric-value arg) 0) t))))
1945     (auto-fill-mode (if auto-fill 1 -1))
1946     (skk-mode arg)
1947     (run-hooks 'skk-auto-fill-mode-hook)))
1948
1949 (defun skk-kill-emacs-without-saving-jisyo (&optional query)
1950   "SKK \e$B<-=q$r%;!<%V$7$J$$$G!"\e(BEmacs \e$B$r=*N;$9$k!#\e(B"
1951   (interactive "P")
1952   ;; format \e$B$r0z?t$K;}$?$;$?>l9g$O!"\e(Bskk-yes-or-no-p \e$B$r;H$&$H$+$($C$F>iD9$K$J$k!#\e(B
1953   (if (yes-or-no-p
1954        (format (if skk-japanese-message-and-error
1955                    "\e$B<-=q$NJ]B8$r$;$:$K\e(B %s \e$B$r=*N;$7$^$9!#NI$$$G$9$+!)\e(B"
1956                  "Do you really wish to kill %s without saving Jisyo? ")
1957                (cond ((eq skk-emacs-type 'xemacs) "XEmacs")
1958                      (t "Mule"))))
1959       (let ((buff (skk-get-jisyo-buffer skk-jisyo 'nomsg)))
1960         (ad-disable-advice 'save-buffers-kill-emacs 'before 'skk-ad)
1961         (ad-activate 'save-buffers-kill-emacs)
1962         (remove-hook 'skk-before-kill-emacs-hook 'skk-save-jisyo) ; fail safe.
1963         (if buff
1964             (progn (set-buffer buff)
1965                    (set-buffer-modified-p nil)
1966                    (kill-buffer buff)))
1967         (save-buffers-kill-emacs query))))
1968
1969 (defun skk-restart ()
1970   "skk-init-file \e$B$N:F%m!<%I5Z$S3F<o:F%;%C%H%"%C%W$N8e!"\e(BSKK \e$B%b!<%I$r5/F0$9$k!#\e(B"
1971   (interactive)
1972   (let (skk-mode-invoked) (skk-mode 1)))
1973
1974 (defun skk-regularize ()
1975   ;; SKK \e$B$NF0:n$N@55,2=$r?^$k$?$a!"FbItJQ?t$d%f!<%6!<JQ?t$ND4@0$r9T$J$&!#\e(B
1976   (skk-setup-auto-paren)
1977   (setq skk-rule-tree
1978         (skk-compile-rule-list skk-rom-kana-base-rule-list skk-rom-kana-rule-list))
1979   (and (not (featurep 'skk-server))
1980        (or (and (boundp 'skk-servers-list) skk-servers-list)
1981            (or (and (boundp 'skk-server-host) skk-server-host)
1982                (getenv "SKKSERVER")))
1983        (require 'skk-server))
1984   (and (featurep 'skk-server)
1985        ;; skk-search-server \e$B$O%5!<%P!<$,Mn$A$F$b;H$($k$N$G!"30$5$J$$!#\e(B
1986        (skk-adjust-search-prog-list-for-server-search 'non-del))
1987   (and skk-auto-okuri-process (skk-adjust-search-prog-list-for-auto-okuri))
1988   (and skk-use-look (require 'skk-look))
1989   (skk-setup-delete-selection-mode)
1990   (skk-adjust-user-option))
1991
1992 (defun skk-setup-delete-backward-char ()
1993   (let ((commands '(backward-delete-char-untabify
1994                     backward-delete-char
1995                     backward-or-forward-delete-char
1996                     delete-backward-char
1997                     picture-backward-clear-column
1998                     ;; following two are SKK adviced.
1999                     ;;viper-del-backward-char-in-insert
2000                     ;;vip-del-backward-char-in-insert
2001                    ))
2002         keys)
2003     (while commands
2004       (setq keys (where-is-internal (car commands) overriding-local-map)
2005             commands (cdr commands))
2006       (while keys
2007         (define-key skk-abbrev-mode-map (car keys) 'skk-delete-backward-char)
2008         (define-key skk-j-mode-map (car keys) 'skk-delete-backward-char)
2009         (setq keys (cdr keys))))))
2010
2011 (defun skk-setup-init-file ()
2012   ;; skk-byte-compile-init-file \e$B$,\e(B non-nil \e$B$N>l9g$G!"\e(Bskk-init-file \e$B$r%P%$%H%3\e(B
2013   ;; \e$B%s%Q%$%k$7$?%U%!%$%k$,B8:_$7$J$$$+!"$=$N%P%$%H%3%s%Q%$%k:Q%U%!%$%k$h$j\e(B
2014   ;; skk-init-file \e$B$NJ}$,?7$7$$$H$-$O!"\e(Bskk-init-file \e$B$r%P%$%H%3%s%Q%$%k$9$k!#\e(B
2015   ;;
2016   ;; skk-byte-compile-init-file \e$B$,\e(B nil \e$B$N>l9g$G!"\e(Bskk-init-file \e$B$r%P%$%H%3%s%Q\e(B
2017   ;; \e$B%$%k$7$?%U%!%$%k$h$j\e(B skk-init-file \e$B$NJ}$,?7$7$$$H$-$O!"$=$N%P%$%H%3%s%Q%$\e(B
2018   ;; \e$B%k:Q%U%!%$%k$r>C$9!#\e(B
2019   (save-match-data
2020     (let* ((init-file (expand-file-name skk-init-file))
2021            (elc (concat init-file
2022                         (if (string-match "\\.el$" init-file)
2023                             "c"
2024                           ".elc"))))
2025       (if skk-byte-compile-init-file
2026           (and (file-exists-p init-file)
2027                (or (not (file-exists-p elc))
2028                    (file-newer-than-file-p init-file elc))
2029                (save-window-excursion ; for keep window configuration.
2030                  (skk-message "%s \e$B$r%P%$%H%3%s%Q%$%k$7$^$9!#\e(B" "Byte-compile %s"
2031                               skk-init-file)
2032                  (sit-for 2)
2033                  (byte-compile-file init-file)))
2034         (and (file-exists-p init-file)
2035              (file-exists-p elc)
2036              (file-newer-than-file-p init-file elc)
2037              (delete-file elc))))))
2038
2039 (defun skk-emulate-original-map (arg)
2040   ;; \e$B%-!<F~NO$KBP$7$F!"\e(BSKK \e$B$N%b!<%I$G$O$J$/!"\e(BEmacs \e$B$N%*%j%8%J%k$N%-!<3d$jIU$1$G\e(B
2041   ;; \e$B%3%^%s%I$r<B9T$9$k!#\e(B
2042   (let ((prefix-arg arg)
2043         (keys (skk-command-key-sequence (this-command-keys) this-command)))
2044     (if (not keys)
2045         ;; no alternative commands.  may be invoked by M-x.
2046         nil
2047       (let (skk-mode skk-latin-mode skk-j-mode skk-abbrev-mode skk-jisx0208-latin-mode
2048                      command)
2049         (setq command (key-binding keys))
2050         (if (eq command this-command)
2051             ;; avoid recursive calling of skk-emulate-original-map.
2052             nil
2053           ;; if no bindings are found, call `undefined'.  it's
2054           ;; original behaviour.
2055           (skk-cancel-undo-boundary)
2056           (command-execute (or command (function undefined))))))))
2057
2058 (defun skk-command-key-sequence (key command)
2059   ;; KEY \e$B$+$i\e(B universal arguments \e$B$r<h$j=|$-!"\e(BCOMMAND \e$B$r<B9T$9$k%-!<$rJV$9!#\e(B
2060   ;; `execute-extended-command' \e$B$K$h$C$F%3%^%s%I$,<B9T$5$l$?>l9g$O!"\e(Bnil \e$B$rJV$9!#\e(B
2061   (while (not (or (zerop (length key))
2062                   (eq command (key-binding key))))
2063     (setq key (vconcat (cdr (append key nil)))))
2064   (and (not (zerop (length key))) key))
2065
2066 (defun skk-setup-delete-selection-mode ()
2067   ;; Delete Selection \e$B%b!<%I$,\e(B SKK \e$B$r;H$C$?F|K\8lF~NO$KBP$7$F$b5!G=$9$k$h$&$K\e(B
2068   ;; \e$B%;%C%H%"%C%W$9$k!#\e(B
2069   (and (featurep 'delsel)
2070        (not (get 'skk-insert 'delete-selection))
2071        (mapcar (function (lambda (func) (put func 'delete-selection t)))
2072                '(skk-current-kuten
2073                  skk-current-touten
2074                  skk-input-by-code-or-menu
2075                  skk-insert
2076                  skk-today))))
2077
2078 (defun skk-setup-auto-paren ()
2079   (if (and skk-auto-insert-paren skk-auto-paren-string-alist)
2080       (let ((strlst (mapcar 'char-to-string skk-special-midashi-char-list))
2081             rulealst str alist)
2082         (while strlst
2083           ;; skk-auto-paren-string-alist \e$B$NCf$+$i!"\e(Bskk-special-midashi-char-list
2084           ;; \e$B$NMWAG$K4XO"$9$k$b$N$r<h$j=|$/!#\e(B
2085           (remove-alist 'skk-auto-paren-string-alist (car strlst))
2086           (setq strlst (cdr strlst)))
2087         (if (null (memq t (mapcar (function
2088                                    (lambda (e)
2089                                      (skk-ascii-char-p (string-to-char (car e)))))
2090                                   skk-auto-paren-string-alist)))
2091             nil
2092           (setq alist skk-auto-paren-string-alist
2093                 rulealst (nconc (mapcar (function (lambda (e) (nth 2 e)))
2094                                         skk-rom-kana-rule-list)
2095                                 (mapcar (function (lambda (e) (nth 2 e)))
2096                                         skk-rom-kana-base-rule-list)))
2097           (while alist
2098             (setq str (car (car alist)))
2099             (and (skk-ascii-char-p (string-to-char str))
2100                  ;; \e$B=PNOJ8;z$,F~$C$F$$$k%;%k$rD4$Y$F!"$$$:$l$+$N%-!<$K%P%$%s%I\e(B
2101                  ;; \e$B$5$l$F$$$J$$$+$I$&$+$r3NG'$9$k!#\e(B
2102                  (null (assoc str rulealst))
2103                  (null (rassoc str rulealst))
2104                  ;; \e$B3d$jIU$1$h$&$H$7$F$$$k%-!<$,!"2?$+B>$N=PNOJ8;z$K%P%$%s%I$5\e(B
2105                  ;; \e$B$l$F$$$J$$$+$I$&$+$r3NG'$9$k!#\e(B
2106                  (null (assoc str skk-rom-kana-base-rule-list))
2107                  (null (assoc str skk-rom-kana-rule-list))
2108                  ;; skk-auto-paren-string-alist \e$B$N3FMWAG$N\e(B car \e$B$NJ8;z$,\e(B
2109                  ;; ascii char \e$B$G$"$k>l9g$O!"\e(Bskk-rom-kana-rule-list,
2110                  ;; skk-rom-kana-base-rule-list \e$B$K$=$NJ8;z$r=q$-9~$`\e(B (\e$BK\\e(B
2111                  ;; \e$BMh$O\e(B ascii char \e$B$O\e(B skk-rom-kana-rule-list,
2112                  ;; skk-rom-kana-base-rule-list \e$B$K=q$/I,MW$,$J$$\e(B ---
2113                  ;; skk-emulate-original-map\e$B$K$h$kF~NO$,9T$J$o$l$k\e(B ---
2114                  ;; \e$B$,!"\e(Bskk-auto-paren-string-alist \e$B$K;XDj$5$l$?BP$K$J$k\e(B
2115                  ;; \e$BJ8;z$NA^F~$N$?$a$K$O!"%-!<$H$J$kJ8;z$r=q$$$F$*$/I,MW$,\e(B
2116                  ;; \e$B$"$k\e(B)\e$B!#\e(B
2117                  (setq skk-rom-kana-rule-list (cons (list str nil str)
2118                                                     skk-rom-kana-rule-list)))
2119             (setq alist (cdr alist)))))))
2120
2121 (defun skk-adjust-user-option ()
2122   ;; \e$BN>N)$G$-$J$$%*%W%7%g%s$ND4@0$r9T$J$&!#\e(B
2123   (and skk-process-okuri-early
2124        ;; skk-process-okuri-early \e$B$NCM$,\e(B non-nil \e$B$G$"$k$H$-$K2<5-$NCM$,\e(B non-nil
2125        ;; \e$B$G$"$l$P@5>o$KF0$+$J$$$N$G$3$NJQ?t$NM%@h=g0L$r9b$/$7$?!#\e(B
2126        (setq skk-kakutei-early nil
2127              skk-auto-okuri-process nil
2128              skk-henkan-okuri-strictly nil
2129              skk-henkan-strict-okuri-precedence nil)))
2130
2131 (defun skk-try-completion (arg)
2132   "\e$B"&%b!<%I$G8+=P$78l$NJd40$r9T$&!#\e(B
2133 \e$B$=$l0J30$N%b!<%I$G$O!"%*%j%8%J%k$N%-!<3d$jIU$1$N%3%^%s%I$r%(%_%e%l!<%H$9$k!#\e(B"
2134   (interactive "P")
2135   (skk-with-point-move
2136    (if (and skk-henkan-on (not skk-henkan-active))
2137        (progn
2138          (setq this-command 'skk-completion)
2139          (skk-completion (not (eq last-command 'skk-completion))))
2140      (skk-emulate-original-map arg))))
2141
2142 (defun skk-latin-mode (arg)
2143   "SKK \e$B$N%b!<%I$r\e(B latin (ascii) \e$B%b!<%I$KJQ99$9$k!#\e(B"
2144   (interactive "P")
2145   (skk-kakutei)
2146   (skk-latin-mode-on))
2147
2148 (defun skk-jisx0208-latin-mode (arg)
2149   "SKK \e$B$N%b!<%I$rA43Q1Q;zF~NO%b!<%I$KJQ99$9$k!#\e(B"
2150   (interactive "P")
2151   (skk-kakutei)
2152   (skk-jisx0208-latin-mode-on))
2153
2154 (defun skk-abbrev-mode (arg)
2155   "ascii \e$BJ8;z$r%-!<$K$7$?JQ49$r9T$&$?$a$NF~NO%b!<%I!#\e(B"
2156   (interactive "*P")
2157   (and skk-henkan-on (not skk-henkan-active)
2158        (skk-error "\e$B4{$K"&%b!<%I$KF~$C$F$$$^$9\e(B" "Already in \e$B"&\e(B mode"))
2159   (skk-kakutei)
2160   (skk-set-henkan-point-subr)
2161   (skk-abbrev-mode-on))
2162
2163 (defun skk-toggle-kana (arg)
2164   "\e$B"#%b!<%I$G!"$R$i$,$J%b!<%I$H%+%?%+%J%b!<%I$r%H%0%k$G@Z$jBX$($k!#\e(B
2165 \e$B"&%b!<%I$G$O!"\e(Bskk-henkan-start-point (\e$B"&$ND>8e\e(B) \e$B$H%+!<%=%k$N4V$NJ8;zNs$r\e(B
2166
2167     \e$B$R$i$,$J\e(B <=> \e$B%+%?%+%J\e(B
2168     \e$BA43Q1Q?t;z\e(B <=> ascii
2169
2170 \e$B$N$h$&$KJQ49$9$k!#\e(B"
2171   (interactive "P")
2172   (cond ((and skk-henkan-on (not skk-henkan-active))
2173          (let (char)
2174            (skk-save-point
2175             (goto-char skk-henkan-start-point)
2176             ;; "\e$B!<\e(B" \e$B$G$OJ8;z<oJL$,H=JL$G$-$J$$$N$G!"%]%$%s%H$r?J$a$k!#\e(B
2177             (while (looking-at "\e$B!<\e(B")
2178               (forward-char 1))
2179             (setq char (skk-what-char-type)))
2180            (skk-set-marker skk-henkan-end-point (point))
2181            (cond ((eq char 'hiragana)
2182                   (skk-katakana-henkan arg))
2183                  ((eq char 'katakana)
2184                   (skk-hiragana-henkan arg))
2185                  ((eq char 'jisx0208-latin)
2186                   (skk-latin-henkan arg))
2187                  ((eq char 'ascii)
2188                   (skk-jisx0208-latin-henkan arg)))))
2189         ((and (skk-in-minibuffer-p) (not skk-j-mode))
2190          ;; \e$B%_%K%P%C%U%!$X$N=iFMF~;~!#\e(B
2191          (skk-j-mode-on))
2192         (t (setq skk-katakana (not skk-katakana))))
2193   (skk-kakutei))
2194
2195 (defun skk-misc-for-picture ()
2196   ;; picture-mode \e$B$XF~$C$?$H$-$K\e(B SKK \e$B5/F0A0$N>uBV$KLa$9!#\e(B
2197   ;; edit-picture-hook \e$B$K\e(B add-hook \e$B$7$F;HMQ$9$k!#\e(B
2198   ;;
2199   ;; \e$B4{B8$N%P%C%U%!$r\e(B picture mode \e$B$K$7$?$H$-!"\e(Bpicture-mode \e$B4X?t$O\e(B
2200   ;; kill-all-local-variables \e$B4X?t$r8F$P$J$$$N$G!"\e(BSKK \e$B4XO"$N%P%C%U%!%m!<%+%k\e(B
2201   ;; \e$BJQ?t$,85$N%P%C%U%!$NCM$N$^$^$K$J$C$F$7$^$&!#$=$3$G!"\e(Bpicture mode \e$B$KF~$C$?\e(B
2202   ;; \e$B$H$-$K%U%C%/$rMxMQ$7$F$3$l$i$N%P%C%U%!%m!<%+%kJQ?t$r\e(B kill \e$B$9$k!#\e(B
2203   ;; RMS \e$B$O\e(B picture-mode \e$B$G\e(B kill-all-local-variables \e$B4X?t$r8F$P$J$$$N$O!"%P%0\e(B
2204   ;; \e$B$G$O$J$$!"$H8@$C$F$$$?!#\e(B
2205   ;;
2206   ;; picture-mode \e$B$G\e(B SKK \e$B$r;HMQ$74A;zF~NO$r$7$?>l9g$K!"\e(BBS \e$B$GA43QJ8;z$,>C$;$J$$\e(B
2207   ;; \e$B$N$O!"\e(BSKK \e$B$NIT6q9g$G$O$J$/!"\e(Bpicture.el \e$B$NLdBj\e(B (move-to-column-force \e$B4X?t\e(B
2208   ;; \e$B$NCf$G;HMQ$7$F$$$k\e(B move-to-column \e$B$GA43QJ8;z$rL5;k$7$?%+%i%`?t$,M?$($i$l\e(B
2209   ;; \e$B$?$H$-$K%+!<%=%k0\F0$,$G$-$J$$$+$i\e(B) \e$B$G$"$k!#>C$7$?$$J8;z$K%]%$%s%H$r9g$o\e(B
2210   ;; \e$B$;!"\e(BC-c C-d \e$B$G0lJ8;z$E$D>C$9$7$+J}K!$O$J$$!#\e(B
2211   (and skk-mode (skk-kill-local-variables)))
2212
2213 (defun skk-kill-local-variables ()
2214   ;; SKK \e$B4XO"$N%P%C%U%!%m!<%+%kJQ?t$rL58z$K$9$k!#\e(B
2215   (skk-mode -1)
2216   (let ((lv (buffer-local-variables))
2217         v vstr)
2218     (while lv
2219       (setq v (car (car lv))
2220             lv (cdr lv)
2221             vstr (prin1-to-string v))
2222       (and (> (length vstr) 3) (string= "skk-" (substring vstr 0 4))
2223            (kill-local-variable v)))))
2224
2225 ;;;; kana inputting functions
2226
2227 (defun skk-insert (&optional arg)
2228   "SKK \e$B$NJ8;zF~NO$r9T$J$&!#\e(B"
2229   ;; skk-rom-kana-\\(base-\\)*rule-list \e$B$N\e(B caddr \e$B$K4X?t$r=q$-!"$=$N4X?tFb$G!"0l\e(B
2230   ;; \e$BDj>r7o$rK~$7$?>l9g$K\e(B (\e$BJ8;zA^F~0J30$N\e(B) \e$B$"$kFCDj$NF0:n$r$5$;!"$=$&$G$J$$>l9g$O$"$kFC\e(B
2231   ;; \e$BDjJ8;z$NA^F~$r9T$J$&$3$H$N%a%j%C%H!"%G%a%j%C%H$K$D$$$F!#\e(B
2232   ;;
2233   ;; \e$B%a%j%C%H\e(B; \e$BI,$:\e(B skk-kana-input \e$B$rDL$k$N$G!"\e(Bunfixed prefix + \e$B%H%j%,!<%-!<$N\e(B
2234   ;; \e$BJ8;z=hM}$r9T$J$C$F$+$i;XDj$N4X?t8F$S=P$7$KF~$k$3$H$,$G$-$k!#\e(B
2235   ;;
2236   ;; \e$B%G%a%j%C%H\e(B; \e$B%3!<%k$5$l$?4X?tFb$G!"FH<+$KA^F~J8;z$r7hDj$9$k$3$H$O$G$-$k$,!"\e(B
2237   ;; skk-rom-kana-\\(base-\\)*rule-list \e$BFb$GDj5A$,9T$J$($J$$\e(B (\e$B4{$KJ8;z$NBe$o$j\e(B
2238   ;; \e$B$K4X?tL>$,;XDj$5$l$F$$$k$+$i!#3:Ev4X?tFb$G!"\e(Bskk-kana-input \e$B$r%3!<%k$9$k$H!"\e(B
2239   ;; \e$BL58B%k!<%W$K4Y$$$C$F$7$^$&\e(B)\e$B!#4X?tFb$G%*%j%8%J%k$N%+%l%s%H%^%C%W$NF0:n$r%(\e(B
2240   ;; \e$B%_%e%l!<%H$9$k$H!"%f!<%6!<$,A^F~J8;z$NDj5A$rJQ99$G$-$J$$!#\e(B
2241   ;;
2242   ;; \e$B$^$?!"\e(Bskk-input-vector \e$B$rGQ$7!"\e(Bskk-rom-kana-\\(base-\\)*rule-list \e$B$KA^F~\e(B
2243   ;; \e$B$9$Y$-J8;zDj5A$r=8Cf$5$;$?$3$H$+$i!"2DG=$J8B$j$3$l$rJx$7$?$/$J$$!#\e(B
2244   ;;
2245   ;; \e$B>e5-$N9M;!$+$i!"2<5-$N$h$&$KJ}?K$r7h$a$?!#\e(B
2246   ;;
2247   ;; (1)\e$BA^F~J8;z$NDj5A$O!"\e(Bskk-rom-kana-\\(base-\\)*rule-list \e$B0J30$G$O9T$J$o$J\e(B
2248   ;;    \e$B$$!#\e(B
2249   ;; (2)\e$B%H%j%,!<%-!<$r%f!<%6!<JQ?t$H$7!"$3$N%-!<$,2!$5$l$?>l9g$+$I$&$+$NH=Dj$O!"\e(B
2250   ;;    skk-insert \e$BFb$G9T$J$$!"E,Ev$J4X?t$r%3!<%k$9$k!#\e(B
2251   ;; (3)(2)\e$B$N%f!<%6!<JQ?t$O!"\e(Bskk-abbrev-mode-map \e$B$N%-!<Dj5A$J$I$G$b;2>H$9$k$3\e(B
2252   ;;    \e$B$H$H$7!"2DG=$J8B$jF0:n$NE}0l$r?^$k!#\e(B
2253   ;; (4)unfixed prefix + \e$B%H%j%,!<%-!<$N=hM}$OI,MW$K1~$8$F3:Ev4X?t$NCf$KKd$a9~\e(B
2254   ;;    \e$B$`!#\e(B
2255   (interactive "*p")
2256   (skk-with-point-move
2257    (let ((ch last-command-char))
2258      (cond (
2259             ;; start writing a midasi key.
2260             (or (and (memq ch skk-set-henkan-point-key)
2261                      (or skk-okurigana
2262                          (not (skk-get-prefix skk-current-rule-tree))
2263                          (not (skk-select-branch skk-current-rule-tree ch))))
2264                 (and skk-henkan-on (memq ch skk-special-midashi-char-list)))
2265             ;; normal pattern
2266             ;; skk-set-henkan-point -> skk-kana-input.
2267             (skk-set-henkan-point arg))
2268            ;; start conversion.
2269            ((and skk-henkan-on (eq ch skk-start-henkan-char))
2270             (skk-start-henkan arg))
2271            ;; for completion.
2272            ((and skk-henkan-on (not skk-henkan-active))
2273             (cond ((eq ch skk-try-completion-char)
2274                    (setq this-command 'skk-completion)
2275                    (skk-completion (not (eq last-command 'skk-completion))))
2276                   ((eq last-command 'skk-completion)
2277                    (cond ((eq ch skk-next-completion-char)
2278                           (setq this-command 'skk-completion)
2279                           (skk-completion nil))
2280                          ((eq ch skk-previous-completion-char)
2281                           (setq this-command 'skk-completion)
2282                           (skk-previous-completion))
2283                          (t (skk-kana-input arg))))
2284                   (t (skk-kana-input arg))))
2285            ;; just input Kana.
2286            (t (skk-kana-input arg))))))
2287
2288 (defun skk-kana-input (&optional arg)
2289   ;;"\e$B$+$JJ8;z$NF~NO$r9T$&%k!<%A%s!#\e(B"
2290   ;; Message-Id: <19980610190611B.sakurada@kuis.kyoto-u.ac.jp>
2291   ;; From: Hideki Sakurada <sakurada@kuis.kyoto-u.ac.jp>
2292   ;; Date: Wed, 10 Jun 1998 19:06:11 +0900 (JST)
2293   ;;
2294   ;; \e$B?7$7$$\e(B skk-kana-input \e$B$O\e(B, \e$B4JC1$K@bL@$9$k$H\e(B,
2295   ;; \e$B$"$i$+$8$a%k!<%k$rLZ$N7A$KI=8=$7$F$*$$$F\e(B, \e$BF~NO$r8+\e(B
2296   ;; \e$B$FLZ$rC)$j\e(B, \e$B$=$l0J>eC)$l$J$/$J$C$?$i$=$N@a$KEPO?$5\e(B
2297   ;; \e$B$l$F$$$k2>L>$rF~NO$9$k\e(B. \e$B$H$$$&$7$/$_$G$9\e(B.
2298   ;;
2299   ;; \e$BNc$($P\e(B, n a t \e$B$N$_$+$i$J$k0J2<$N%k!<%k\e(B
2300   ;;
2301   ;;     a  \e$B"*\e(B \e$B$"\e(B
2302   ;;     n  \e$B"*\e(B \e$B$s\e(B
2303   ;;     nn \e$B"*\e(B \e$B$s\e(B
2304   ;;     na \e$B"*\e(B \e$B$J\e(B
2305   ;;     ta \e$B"*\e(B \e$B$?\e(B
2306   ;;     tt \e$B"*\e(B \e$B$C\e(B (\e$B<!>uBV\e(B t)
2307   ;;
2308   ;; \e$B$r%k!<%kLZ$KJQ49$9$k$H\e(B,
2309   ;;
2310   ;;                 \e$B!?\e(B/\e$B!@\e(B
2311   ;;               \e$B!?\e(B /   \e$B!@\e(B
2312   ;;           a \e$B!?\e(B  / t    \e$B!@\e(B n
2313   ;;           \e$B!?\e(B   /         \e$B!@\e(B
2314   ;;          \e$B$"\e(B   \e$B!&\e(B           \e$B$s\e(B
2315   ;;             \e$B!?\e(B|           / \e$B!@\e(B
2316   ;;         a \e$B!?\e(B  | t      a /    \e$B!@\e(B n
2317   ;;         \e$B!?\e(B    |         /       \e$B!@\e(B
2318   ;;       \e$B$?\e(B     \e$B$C\e(B        \e$B$J\e(B        \e$B$s\e(B
2319   ;;          (\e$B<!>uBV\e(B "t")
2320   ;;
2321   ;; \e$B$H$$$&7A$K$J$j$^$9\e(B.
2322   ;;
2323   ;; \e$B=i4|>uBV\e(B(\e$BLZ$N:,\e(B)\e$B$G\e(B `a' \e$B$rF~NO$9$k$H\e(B, \e$BLZ$N:,$+$i\e(B
2324   ;; \e$B!V$"!W$K0\F0$7$^$9\e(B. \e$B<!$K$I$N$h$&$JF~NO$,Mh$F$b\e(B,
2325   ;; \e$B$=$l$h$j2<$K$?$I$l$J$$$N$G\e(B, \e$B!V$"!W$r=PNO$7$F:,$KLa$j$^$9\e(B.
2326   ;; \e$B%k!<%k$K<!>uBV$,@_Dj$5$l$F$$$k>l9g$O\e(B, \e$B@_Dj$5$l$F$$\e(B
2327   ;; \e$B$kJ8;zNs$r%-%e!<$KLa$7$F$+$i:,$KLa$j$^$9\e(B.
2328   ;;
2329   ;; \e$B=i4|>uBV$G\e(B `n' \e$B$rF~NO$9$k$H\e(B, \e$B!V$s!W$K0\F0$7$^$9\e(B.
2330   ;; \e$B<!$K\e(B `a' \e$B$^$?$O\e(B `n' \e$B$,F~NO$5$l$l$P$=$l$h$j2<$K$?$I$l$k\e(B
2331   ;; \e$B$N$G<!$NF~NO$r8+$k$^$G$^$@=PNO$7$^$;$s\e(B.
2332   ;; \e$B<!$K\e(B `t' \e$B$,F~NO$5$l$?>l9g$O\e(B, `t' \e$B$G$O2<$K$?$I$l$J$$$N$G\e(B,
2333   ;; \e$B!V$s!W$r=PNO$7$F\e(B `t' \e$B$r%-%e!<$KLa$7$^$9\e(B.
2334   ;;
2335   ;; \e$B$3$3$G\e(B, \e$B=i4|>uBV\e(B, \e$B8=>uBV$r$=$l$>$l\e(B skk-rule-tree,
2336   ;; skk-current-rule-tree \e$B$GI=$7\e(B.
2337   ;; \e$BLZ$r2<$K$?$I$k\e(B, \e$B$H$$$&A`:n$O\e(B, skk-select-branch \e$B$r\e(B
2338   ;; \e$BMQ$$$F\e(B,
2339   ;;
2340   ;;   (skk-select-branch rule-tree ?a)
2341   ;;
2342   ;; \e$B$N$h$&$K$7$^$9\e(B. \e$B8=>uBV$K@_Dj$5$l$F$$$k$+$J\e(B(("\e$B%"\e(B". "\e$B$"\e(B")\e$B$J$I\e(B),
2343   ;; \e$B<!>uBV\e(B("t" \e$B$J$I\e(B)\e$B$O\e(B, \e$B$=$l$>$l\e(B skk-get-kana,
2344   ;; skk-get-nextstate \e$B$G<h$j$^$9\e(B.
2345   ;; don't echo key strokes in the minibuffer.
2346   (let ((echo-keystrokes 0)
2347         (queue (list last-command-char)))
2348     (while queue
2349       (if (not (skk-get-prefix skk-current-rule-tree))
2350           (progn
2351             (skk-set-marker skk-kana-start-point (point))
2352             (setq skk-current-rule-tree skk-rule-tree))
2353         (skk-erase-prefix))
2354       (setq skk-prefix (concat (skk-get-prefix skk-current-rule-tree)
2355                                (char-to-string last-command-char)))
2356       (let ((next (skk-select-branch skk-current-rule-tree (car queue)))
2357             data)
2358         (if next
2359             ;; can go down SKK-CURRENT-RULE-TREE
2360             (if (skk-get-branch-list next)
2361                 ;; NEXT have at least one branch
2362                 (progn
2363                   (and skk-henkan-active
2364                        skk-kakutei-early
2365                        (not skk-process-okuri-early)
2366                        (skk-kakutei))
2367                   (setq queue (cdr queue)
2368                         skk-current-rule-tree next))
2369               ;; NEXT does not have any branch (i.e. NEXT is a leaf)
2370               (setq data (skk-get-kana next)
2371                     queue (nconc (string-to-list (skk-get-nextstate next))
2372                                  (cdr queue))
2373                     skk-current-rule-tree nil))
2374           ;; can not go down SKK-CURRENT-RULE-TREE
2375           (let ((d (skk-get-kana skk-current-rule-tree)))
2376             (if d
2377                 ;; SKK-CURRENT-RULE-TREE have a roma->kana rule
2378                 (setq data d
2379                       queue
2380                       (nconc (string-to-list
2381                               (skk-get-nextstate skk-current-rule-tree))
2382                              queue)
2383                       skk-current-rule-tree nil)
2384               ;; SKK-CURRENT-RULE-TREE does not have any roma->kana rule
2385               (let ((dd (and skk-kana-input-search-function
2386                              (funcall skk-kana-input-search-function))))
2387                 (if dd
2388                     (setq data (car dd)
2389                           queue (nconc (string-to-list (cdr dd))
2390                                        (cdr queue))
2391                           skk-current-rule-tree nil)
2392                   (if (eq skk-current-rule-tree skk-rule-tree)
2393                       ;; typo on the root of tree
2394                       (setq queue nil
2395                             skk-current-rule-tree nil)
2396                     ;; otherwise move to root of the tree, and redo
2397                     (setq skk-current-rule-tree nil)))))))
2398         (if (not data)
2399             (if skk-current-rule-tree
2400                 (progn
2401                   ;;(digit-argument arg)
2402                   ;; \e$B$&!A$s!"$h$&J,$+$i$s!#$H$j$"$($:!#\e(B
2403                   (or skk-isearch-message (setq prefix-arg arg))
2404                   (setq skk-prefix (skk-get-prefix skk-current-rule-tree))
2405                   (skk-insert-prefix skk-prefix))
2406               ;;(skk-kana-cleanup 'force)
2407               (and skk-henkan-active (skk-kakutei))
2408               (setq skk-prefix "")
2409               (or queue
2410                   (skk-emulate-original-map (skk-make-raw-arg arg))))
2411           (skk-cancel-undo-boundary)
2412           (setq skk-prefix "")
2413           (and (functionp data)
2414                (setq data (funcall data (skk-make-raw-arg arg))))
2415           (if (not (stringp (if (consp data) (car data) data)))
2416               nil
2417             (let* ((str (if (consp data) (if skk-katakana (car data) (cdr data))
2418                           data))
2419                    (pair (and skk-auto-insert-paren
2420                               (cdr (assoc str skk-auto-paren-string-alist))))
2421                    (count0 arg) (count1 arg) (inserted 0))
2422               (and skk-henkan-active
2423                    skk-kakutei-early (not skk-process-okuri-early)
2424                    (skk-kakutei))
2425               ;; arg \e$B$OJ]B8$7$F$*$+$J$$$H!"\e(B0 \e$B$K$J$C$F$7$^$$!"\e(Bqueue
2426               ;; \e$B$,$?$^$C$F$$$F:FEY$3$3$X$d$C$FMh$?$H$-$KJ8;zF~NO$,\e(B
2427               ;; \e$B$G$-$J$/$J$k!#\e(B
2428               (while (> count0 0)
2429                 (skk-insert-str str)
2430                 (setq count0 (1- count0)))
2431               (if (not pair)
2432                   nil
2433                 (while (> count1 0)
2434                   (if (not (string= pair (char-to-string (following-char))))
2435                       (progn
2436                         (setq inserted (1+ inserted))
2437                         (skk-insert-str pair)))
2438                   (setq count1 (1- count1)))
2439                 (or (= inserted 0) (backward-char inserted)))
2440               (and skk-okurigana (null queue) (skk-set-okurigana))))))
2441       ;; XXX I don't know how skk-isearch-message works....
2442       (and skk-isearch-message (skk-isearch-message)))))
2443
2444 ;; tree procedure (\e$B%D%j!<$K%"%/%;%9$9$k$?$a$N%$%s%?!<%U%'!<%9\e(B)
2445 (defun skk-search-tree (tree char-list)
2446   ;; TREE \e$B$N:,$+$i@hC<$X\e(B CHAR-LIST \e$B$K=>$C$F$?$I$k!#\e(B
2447   ;; \e$B@.8y$7$?>l9g$O\e(B nil \e$B$H\e(B \e$B7k2L$NLZ$NAH$rJV$7\e(B,
2448   ;; \e$B<:GT$7$?>l9g$O$?$I$l$J$+$C$?\e(B CHAR-LIST \e$B$N;D$j$H$?$I$l$J$/$J$C$?\e(B
2449   ;; \e$B@aE@$NLZ$NAH$rJV$9!#\e(B
2450   (catch 'return
2451     (let (next char rest)
2452       (while char-list
2453         (setq char (car char-list)
2454               rest (cdr char-list)
2455               next (skk-select-branch tree char))
2456         (if next
2457             (setq tree next
2458                   char-list rest)
2459           (throw 'return (cons char-list tree))))
2460       (cons nil tree))))
2461
2462 (defun skk-add-rule (tree rule)
2463   (let* ((prefix (nth 0 rule))
2464          (l (length prefix))
2465          (result (skk-search-tree tree (string-to-list prefix)))
2466          (rest (car result))
2467          (addpoint (cdr result)))
2468     (while rest
2469       (let ((addtree
2470              (skk-make-rule-tree (car rest)
2471                                  (substring prefix 0 (1+ (- l (length rest))))
2472                                  nil nil nil)))
2473         (skk-add-branch addpoint addtree)
2474         (setq addpoint addtree
2475               rest (cdr rest))))
2476     (skk-set-nextstate addpoint (nth 1 rule))
2477     (skk-set-kana addpoint (nth 2 rule))))
2478
2479 (defun skk-delete-rule (tree string)
2480   ;; \e$BF~NO\e(B STRING \e$B$KBP$9$k%k!<%k$r%k!<%kLZ\e(B TREE \e$B$+$i:o=|\e(B
2481   (catch 'return
2482     (let ((char-list (string-to-list string))
2483           (cutpoint tree)
2484           (cuttree (car (skk-get-branch-list tree)))
2485                                         ; TREE \e$B$N:,$+$i=P$k;^$,\e(B1\e$BK\$7$+$J$$>l9g\e(B
2486                                         ; \e$B$N$?$a$K0l1~=i4|2=$7$F$*$/\e(B
2487           next)
2488       (while char-list
2489         (setq next (skk-select-branch tree (car char-list))
2490               char-list (cdr char-list))
2491         (if next
2492             (if (> (length (skk-get-branch-list tree)) 1)
2493                 (setq cutpoint tree     ; \e$B;^$,\e(B2\e$BK\0J>e$N;~\e(B cutpoint cuttree
2494                       cuttree next      ; \e$B$r\e(B update
2495                       tree next)
2496               (setq tree next))
2497           (throw 'return nil)))
2498       (skk-set-branch-list cutpoint
2499                            (delq cuttree (skk-get-branch-list cutpoint))))))
2500
2501 ;; convert skk-rom-kana-rule-list to skk-rule-tree.
2502 ;; The rule tree follows the following syntax:
2503 ;; <branch-list>  := nil | (<tree> . <branch-list>)
2504 ;; <tree>         := (<char> <prefix> <nextstate> <kana> <branch-list>)
2505 ;; <kana>         := (<\e$B$R$i$,$JJ8;zNs\e(B> . <\e$B%+%?%+%JJ8;zNs\e(B>) | nil
2506 ;; <char>         := <\e$B1Q>.J8;z\e(B>
2507 ;; <nextstate>    := <\e$B1Q>.J8;zJ8;zNs\e(B> | nil
2508 (defun skk-compile-rule-list (&rest l)
2509   ;; rule-list \e$B$rLZ$N7A$K%3%s%Q%$%k$9$k!#\e(B
2510   (let ((tree (skk-make-rule-tree nil "" nil nil nil))
2511         rule ll)
2512     (while l
2513       (setq ll (car l)
2514             l (cdr l))
2515       (while ll
2516         (setq rule (car ll)
2517               ll (cdr ll))
2518         (skk-add-rule tree rule)))
2519     tree))
2520
2521 (defun skk-insert-str (str)
2522   ;; STR \e$B$rA^F~$9$k!#I,MW$G$"$l$P\e(B self-insert-after-hook \e$B$r%3\e(B
2523   ;; \e$B!<%k$9$k!#\e(Boverwrite-mode \e$B$G$"$l$P!"E,@Z$K>e=q$-$r9T$&!#\e(B
2524   (insert-and-inherit str)
2525   (if (and skk-henkan-on (not skk-henkan-active))
2526       (and skk-auto-start-henkan (not skk-okurigana) (skk-auto-start-henkan str))
2527     (and (boundp 'self-insert-after-hook) self-insert-after-hook
2528          (funcall self-insert-after-hook (- (point) (length str)) (point)))
2529     (and overwrite-mode
2530          (skk-del-char-with-pad (skk-ovwrt-len (string-width str))))))
2531
2532 (defun skk-ovwrt-len (len)
2533   ;; \e$B>e=q$-$7$FNI$$D9$5$rJV$9!#\e(B
2534   (min (string-width
2535         (buffer-substring-no-properties
2536          (point) (skk-save-point (end-of-line) (point))))
2537        len))
2538
2539 (defun skk-del-char-with-pad (length)
2540   ;; \e$BD9$5\e(B LENGTH \e$B$NJ8;z$r>C5n$9$k!#D4@0$N$?$a!"I,MW$G$"$l$P!"KvHx$K%9%Z!<%9$r\e(B
2541   ;; \e$BA^F~$9$k!#\e(B
2542   (let ((p (point)) (len 0))
2543     (while (< len length)
2544       (forward-char 1)
2545       (setq len (string-width (buffer-substring-no-properties (point) p))))
2546     (delete-region p (point))
2547     (or (= length len)
2548         (progn
2549           (insert-and-inherit " ")
2550           (backward-char 1)))))
2551
2552 (defun skk-cancel-undo-boundary ()
2553   ;; skk-insert, skk-jisx0208-latin-insert \e$B$GO"B3$7$FF~NO$5\e(B
2554   ;; \e$B$l$?\e(B 20 \e$BJ8;z$r\e(B 1 \e$B2s$N%"%s%I%%$NBP>]$H$9$k!#\e(B`20' \e$B$O\e(B
2555   ;; keyboard.c \e$B$KDj$a$i$l$?%^%8%C%/%J%s%P!<!#\e(BMule-2.3 \e$BE:IU\e(B
2556   ;; \e$B$N\e(B egg.el \e$B$r;29M$K$7$?!#\e(B
2557   (if (and (< skk-self-insert-non-undo-count 20)
2558            (memq last-command
2559                  '(skk-insert
2560                    skk-jisx0208-latin-insert
2561                    ;; SKK abbrev \e$B%b!<%I$G$O!"%"%9%-!<J8;zF~NO$,\e(B Emacs \e$B%*%j%8%J\e(B
2562                    ;; \e$B%k$N\e(B self-insert-command \e$B$K$h$j9T$J$o$l$F$$$k$N$G!"\e(B
2563                    ;; skk-self-insert-non-undo-count \e$B$r%$%s%/%j%a%s%H$9$k$3$H\e(B
2564                    ;; \e$B$,$G$-$J$$$N$G!"%"%s%I%%$r%(%_%e%l!<%H$G$-$J$$!#\e(B
2565                    ;; \e$B$7$+$b!"%+%s%^$d%T%j%*%I$rA^F~$7$?;~E@$G!"\e(B
2566                    ;; skk-abbrev-comma \e$B$d\e(B skk-abbrev-period \e$B$r;H$&$3$H$K$J$k$N\e(B
2567                    ;; \e$B$G\e(B (self-insert-command \e$B0J30$N%3%^%s%I$r;H$C$F$7$^$&$N$G\e(B)\e$B!"\e(B
2568                    ;; \e$B%*%j%8%J%k$N%"%s%I%%$N5!G=$bB;$J$C$F$7$^$&!#\e(B
2569                    ;; \e$B$7$+$78=<BLdBj$H$7$F$O!"\e(BSKK abbrev \e$B%b!<%I$O>JN,7A$H$7$F$N\e(B
2570                    ;; \e$B8+=P$78l$rA^F~$9$k$?$a$N%b!<%I$G$"$k$N$G!"D9$$8+=P$78l$r\e(B
2571                    ;; \e$BA^F~$9$k$3$H$O$"$^$j$J$/!"LdBj$b>.$5$$$H9M$($i$l$k!#\e(B
2572                    ;;skk-abbrev-comma
2573                    ;;skk-abbrev-period
2574                   )))
2575       (progn
2576         (cancel-undo-boundary)
2577         (if (null skk-current-rule-tree)
2578             ;; \e$B$^$@$+$JJ8;z$,40@.$7$F$$$J$$$H$-$O!"\e(Bundo count \e$B$r%$%s%/%j%a%s%H\e(B
2579             ;; \e$B$7$J$$!#\e(B
2580             (setq skk-self-insert-non-undo-count
2581                   (1+ skk-self-insert-non-undo-count))))
2582     (setq skk-self-insert-non-undo-count 1)))
2583
2584 (defun skk-translate-okuri-char (okurigana)
2585   (and skk-okuri-char-alist
2586        (cdr (assoc (skk-substring-head-character okurigana) skk-okuri-char-alist))))
2587
2588 (defun skk-set-okurigana ()
2589   ;; \e$B8+=P$78l$+$i\e(B skk-henkan-okurigana, skk-henkan-key \e$B$N3FCM$r%;%C%H$9$k!#\e(B
2590   (cancel-undo-boundary)
2591   (and skk-katakana (skk-hiragana-region skk-henkan-start-point (point)))
2592   (skk-set-marker skk-henkan-end-point skk-okurigana-start-point)
2593   ;; just in case
2594   (skk-save-point
2595     (goto-char skk-okurigana-start-point)
2596     (or (eq (following-char) ?*) (insert-and-inherit "*")))
2597   (setq skk-henkan-okurigana (buffer-substring-no-properties
2598                               (1+ skk-okurigana-start-point)
2599                               (point)))
2600   (setq skk-henkan-key (concat (buffer-substring-no-properties
2601                                 skk-henkan-start-point
2602                                 skk-henkan-end-point)
2603                                (or (skk-translate-okuri-char
2604                                     skk-henkan-okurigana)
2605                                    skk-okuri-char))
2606         skk-prefix "")
2607   (delete-region skk-okurigana-start-point (1+ skk-okurigana-start-point))
2608   (setq skk-henkan-count 0)
2609   (skk-henkan)
2610   (setq skk-okurigana nil))
2611
2612 ;;;; other inputting functions
2613
2614 (defun skk-toggle-kutouten ()
2615   "\e$B6gFIE@$N<oN`$r%H%0%k$GJQ99$9$k!#\e(B"
2616   (interactive)
2617   (setq skk-kutouten-type (if (eq skk-kutouten-type 'jp) 'en 'jp))
2618   (and (interactive-p)
2619        (skk-message "\e$B6gE@\e(B: `%s'  \e$BFIE@\e(B: `%s'"
2620                     "Kuten: `%s'  Touten: `%s'"
2621                     (skk-current-kuten nil) (skk-current-touten nil))))
2622
2623 (defun skk-current-kuten (arg)
2624   ;; just ignore arg.
2625   (car (cdr (assq skk-kutouten-type skk-kuten-touten-alist))))
2626
2627 (defun skk-current-touten (arg)
2628   ;; just ignore arg.
2629   (cdr (cdr (assq skk-kutouten-type skk-kuten-touten-alist))))
2630
2631 (defun skk-abbrev-period (arg)
2632   "SKK abbrev \e$B%b!<%I$G8+=P$7$NJd40$r9T$C$F$$$k:GCf$G$"$l$P!"<!$N8uJd$rI=<($9$k!#\e(B
2633 \e$BJd40$ND>8e$G$J$1$l$P!"%*%j%8%J%k$N%-!<3d$jIU$1$N%3%^%s%I$r%(%_%e%l!<%H$9$k!#\e(B
2634 SKK abbrev \e$B%b!<%I0J30$G$O!"\e(Bskk-insert-period \e$B4X?t$r;HMQ$9$k$3$H!#\e(B"
2635   (interactive "*P")
2636   (skk-with-point-move
2637    (if (eq last-command 'skk-completion)
2638        (progn
2639          (setq this-command 'skk-completion)
2640          (skk-completion nil))
2641      (skk-emulate-original-map arg))))
2642
2643 (defun skk-abbrev-comma (arg)
2644   "SKK abbrev \e$B%b!<%I$G8+=P$7$NJd40$r9T$C$F$$$k:GCf$G$"$l$P!"D>A0$N8uJd$rI=<($9$k!#\e(B
2645 \e$BJd40$ND>8e$G$J$1$l$P!"%*%j%8%J%k$N%-!<3d$jIU$1$N%3%^%s%I$r%(%_%e%l!<%H$9$k!#\e(B
2646 SKK abbrev \e$B%b!<%I0J30$G$O!"\e(Bskk-insert-comma \e$B4X?t$r;HMQ$9$k$3$H!#\e(B"
2647   (interactive "*P")
2648   (skk-with-point-move
2649    (if (eq last-command 'skk-completion)
2650        (progn
2651          (setq this-command 'skk-completion)
2652          (skk-previous-completion))
2653      (skk-emulate-original-map arg))))
2654
2655 (defun skk-jisx0208-latin-insert (arg)
2656   "\e$BA41QJ8;z$r%+%l%s%H%P%C%U%!$KA^F~$9$k!#\e(B
2657 skk-jisx0208-latin-vector \e$B$r%F!<%V%k$H$7$F!":G8e$KF~NO$5$l$?%-!<$KBP1~$9$kJ8\e(B
2658 \e$B;z$rA^F~$9$k!#\e(B
2659 skk-auto-insert-paren \e$B$NCM$,\e(B non-nil \e$B$N>l9g$G!"\e(Bskk-auto-paren-string-alist \e$B$K\e(B
2660 \e$BBP1~$9$kJ8;zNs$,$"$k$H$-$O!"$=$NBP1~$9$kJ8;zNs\e(B (\e$B$+$C$3N`\e(B) \e$B$r<+F0E*$KA^F~$9$k!#\e(B"
2661   (interactive "*p")
2662   (skk-with-point-move
2663    (let* ((str (aref skk-jisx0208-latin-vector last-command-char))
2664           (arg2 arg)
2665           (pair-str
2666            (and skk-auto-insert-paren
2667                 (cdr (assoc str skk-auto-paren-string-alist))))
2668           (pair-str-inserted 0))
2669      (if (not str)
2670          (skk-emulate-original-map arg)
2671        (skk-cancel-undo-boundary)
2672        (while (> arg 0)
2673          (skk-insert-str str)
2674          (setq arg (1- arg)))
2675        (if (not pair-str)
2676            nil
2677          (while (> arg2 0)
2678            (if (not (string= pair-str (char-to-string (following-char))))
2679                (progn
2680                  (setq pair-str-inserted (1+ pair-str-inserted))
2681                  (skk-insert-str pair-str)))
2682            (setq arg2 (1- arg2)))
2683          (or (= pair-str-inserted 0) (backward-char pair-str-inserted)))))))
2684
2685 (defun skk-delete-backward-char (arg)
2686   "\e$B"'%b!<%I$G\e(B skk-delete-implies-kakutei \e$B$,\e(B non-nil \e$B$@$C$?$iD>A0$NJ8;z$r>C$7$F3NDj$9$k!#\e(B
2687 \e$B"'%b!<%I$G\e(B skk-delete-implies-kakutei \e$B$,\e(B nil \e$B$@$C$?$iA08uJd$rI=<($9$k!#\e(B
2688 \e$B"&%b!<%I$G\e(B`\e$B"&\e(B'\e$B$h$j$bA0$N%]%$%s%H$G<B9T$9$k$H3NDj$9$k!#\e(B
2689 \e$B3NDjF~NO%b!<%I$G!"$+$J%W%l%U%#%C%/%9$NF~NOCf$J$i$P!"$+$J%W%l%U%#%C%/%9$r>C$9!#\e(B"
2690   (interactive "*P")
2691   (skk-with-point-move
2692    (let ((count (prefix-numeric-value arg)))
2693      (cond (skk-henkan-active
2694             (if (and (not skk-delete-implies-kakutei)
2695                      (= skk-henkan-end-point (point)))
2696                 (skk-previous-candidate)
2697               ;; overwrite-mode \e$B$G!"%]%$%s%H$,A43QJ8;z$K0O$^$l$F$$$k$H\e(B
2698               ;; \e$B$-$K\e(B delete-backward-char \e$B$r;H$&$H!"A43QJ8;z$O>C$9$,H>\e(B
2699               ;; \e$B3QJ8;zJ,$7$+\e(B backward \e$BJ}8~$K%]%$%s%H$,La$i$J$$\e(B (Emacs
2700               ;; 19.31 \e$B$K$F3NG'\e(B)\e$B!#JQ49Cf$N8uJd$KBP$7$F$O\e(B
2701               ;; delete-backward-char \e$B$GI,$:A43QJ8;z\e(B 1 \e$BJ8;zJ,\e(B backward
2702               ;; \e$BJ}8~$KLa$C$?J}$,NI$$!#\e(B
2703               (if overwrite-mode
2704                   (progn
2705                     (backward-char count)
2706                     (delete-char count arg))
2707                 (skk-emulate-original-map arg))
2708               ;; XXX assume skk-prefix has no multibyte chars.
2709               (if (> (length skk-prefix) count)
2710                   (setq skk-prefix (substring skk-prefix 0 (- (length skk-prefix) count)))
2711                 (setq skk-prefix ""))
2712               (and (>= skk-henkan-end-point (point)) (skk-kakutei))))
2713            ((and skk-henkan-on (>= skk-henkan-start-point (point)))
2714             (setq skk-henkan-count 0)
2715             (skk-kakutei))
2716            ;; \e$BF~NOCf$N8+=P$78l$KBP$7$F$O\e(B delete-backward-char \e$B$GI,$:A43QJ8;z\e(B 1
2717            ;; \e$BJ8;zJ,\e(B backward \e$BJ}8~$KLa$C$?J}$,NI$$!#\e(B
2718            ((and skk-henkan-on overwrite-mode)
2719             (backward-char count)
2720             (delete-char count arg))
2721            (t
2722             (skk-delete-okuri-mark)
2723             (if (skk-get-prefix skk-current-rule-tree)
2724                 (skk-erase-prefix 'clean)
2725               (skk-emulate-original-map arg)))))))
2726
2727 ;;;; henkan routines
2728 (defun skk-henkan ()
2729   ;; \e$B%+%J$r4A;zJQ49$9$k%a%$%s%k!<%A%s!#\e(B
2730   (let (mark new-word kakutei-henkan)
2731     (if (string= skk-henkan-key "")
2732         (skk-kakutei)
2733       ;; we use mark to go back to the correct position after henkan
2734       (or (eobp) (setq mark (skk-save-point (forward-char 1) (point-marker))))
2735       (if (not skk-henkan-active)
2736           (progn
2737             (skk-change-marker)
2738             (setq skk-current-search-prog-list skk-search-prog-list)))
2739       ;; skk-henkan-1 \e$B$NCf$+$i%3!<%k$5$l$k\e(B skk-henkan-show-candidate \e$B$+$i\e(B throw
2740       ;; \e$B$5$l$k!#$3$3$G%-%c%C%A$7$?>l9g$O!"\e(B?x \e$B$,%9%H%j!<%`$KLa$5$l$F$$$k$N$G!"\e(B
2741       ;; \e$B$3$N4X?t$r=P$F!"\e(Bskk-previous-candidates \e$B$X$f$/!#\e(B
2742       (catch 'unread
2743         (setq new-word (or (skk-henkan-1) (skk-henkan-in-minibuff))
2744               kakutei-henkan skk-kakutei-flag)
2745         (and new-word (skk-insert-new-word new-word)))
2746       (if mark
2747           (progn
2748             (goto-char mark)
2749             ;; \e$B;2>H$5$l$F$$$J$$%^!<%+!<$O!"\e(BGarbage Collection \e$B$,%3!<%k$5$l$?$H\e(B
2750             ;; \e$B$-$K2s<}$5$l$k$,!"$=$l$^$G$N4V!"%F%-%9%H$N$I$3$+$r;X$7$F$$$k$H!"\e(B
2751             ;; \e$B%F%-%9%H$N%"%C%W%G!<%H$N:]$K$=$N%^!<%+!<CM$r99?7$9$kI,MW$,$"$k\e(B
2752             ;; \e$B$N$G!"$I$3$b;X$5$J$$$h$&$K$9$k!#\e(B
2753             (skk-set-marker mark nil)
2754             (backward-char 1))
2755         (goto-char (point-max)))
2756       (and kakutei-henkan
2757            (skk-kakutei (if (skk-numeric-p)
2758                             (skk-get-current-candidate-simply 'noconv)
2759                           new-word))))))
2760
2761 (defun skk-henkan-1 ()
2762   ;; skk-henkan \e$B$N%5%V%k!<%A%s!#\e(B
2763   (let (new-word)
2764     (if (= skk-henkan-count 0)
2765         (progn
2766           (and (eq last-command 'skk-undo-kakutei-henkan)
2767                (eq (car (car skk-current-search-prog-list))
2768                    'skk-search-kakutei-jisyo-file)
2769                ;; in this case, we should not search kakutei jisyo.
2770                (setq skk-current-search-prog-list
2771                      (cdr skk-current-search-prog-list)))
2772           (setq skk-henkan-list (skk-search))
2773           (if (null skk-henkan-list)
2774               nil
2775             (setq new-word (skk-get-current-candidate))
2776             (and skk-kakutei-flag
2777                  ;; found the unique candidate in kakutei jisyo
2778                  (setq this-command 'skk-kakutei-henkan))))
2779       ;; \e$BJQ492s?t$,\e(B 1 \e$B0J>e$N$H$-!#\e(B
2780       (setq new-word (skk-get-current-candidate))
2781       (or new-word
2782           ;; \e$B?7$7$$8uJd$r8+$D$1$k$+!"\e(Bskk-current-search-prog-list \e$B$,6u$K$J\e(B
2783           ;; \e$B$k$^$G\e(B skk-search \e$B$rO"B3$7$F%3!<%k$9$k!#\e(B
2784           (while (and skk-current-search-prog-list (not new-word))
2785             (setq skk-henkan-list (skk-nunion skk-henkan-list (skk-search))
2786                   new-word (skk-get-current-candidate))))
2787       (and new-word (> skk-henkan-count 3)
2788            ;; show candidates in minibuffer
2789            (setq new-word (skk-henkan-show-candidates))))
2790     new-word))
2791
2792 (defun skk-get-current-candidate ()
2793   (if (skk-numeric-p)
2794       (let (val)
2795         (skk-num-uniq)
2796         (setq val (skk-num-convert (skk-get-current-candidate-simply)))
2797         (if (not skk-num-recompute-key)
2798             val
2799           (skk-num-uniq)
2800           (skk-num-convert (skk-get-current-candidate-simply))))
2801     (skk-get-current-candidate-simply)))
2802
2803 (defun skk-henkan-show-candidates ()
2804   ;; \e$B%_%K%P%C%U%!$GJQ49$7$?8uJd72$rI=<($9$k!#\e(B
2805   (skk-save-point
2806    (let* ((candidate-keys ; \e$BI=<(MQ$N%-!<%j%9%H\e(B
2807            (mapcar
2808             (function (lambda (c)
2809                         (and (memq c '(?\C-g ?\040 ?x)) ; ?\040 is SPC.
2810                              (skk-error "`%s' \e$B$KL58z$J%-!<$,;XDj$5$l$F$$$^$9!#\e(B"
2811                                         "Illegal key in `%s'"
2812                                         "skk-henkan-show-candidates-keys"))
2813                         (char-to-string (upcase c))))
2814             skk-henkan-show-candidates-keys))
2815           key-num-alist ; \e$B8uJdA*BrMQ$NO"A[%j%9%H\e(B
2816           (key-num-alist1 ; key-num-alist \e$B$rAH$_N)$F$k$?$a$N:n6HMQO"A[%j%9%H!#\e(B
2817            (let ((count 6))
2818              (mapcar (function (lambda (key) (prog1 (cons key count)
2819                                                (setq count (1- count)))))
2820                      ;; \e$B5U$5$^$K$7$F$*$$$F!"I=<($9$k8uJd$N?t$,>/$J$+$C$?$i@h\e(B
2821                      ;; \e$BF,$+$i4v$D$+:o$k!#\e(B
2822                      (reverse skk-henkan-show-candidates-keys))))
2823           (loop 0)
2824           inhibit-quit
2825           henkan-list new-one str reverse n)
2826      ;; Emacs 19.28 \e$B$@$H\e(B Overlay \e$B$r>C$7$F$*$+$J$$$H!"<!$K\e(B insert \e$B$5$l$k\e(B
2827      ;; skk-henkan-key \e$B$K2?8N$+\e(B Overlay \e$B$,$+$+$C$F$7$^$&!#\e(B
2828      (and skk-use-face (skk-henkan-face-off))
2829      (delete-region skk-henkan-start-point skk-henkan-end-point)
2830      (while loop
2831        (if str
2832            (let (message-log-max)
2833              (message str))
2834          (cond (reverse
2835                 (setq loop (1- loop)
2836                       henkan-list (nthcdr (+ 4 (* loop 7)) skk-henkan-list)
2837                       reverse nil))
2838                (skk-exit-show-candidates
2839                 ;; \e$B8uJd$,?T$-$F$7$^$C$F!"\e(Bskk-henkan-show-candidates ->
2840                 ;; skk-henkan-in-minibuff -> skk-henkan
2841                 ;; -> skk-henkan-show-candidates \e$B$N=g$G!":F$S$3$N4X?t$,8F$P$l\e(B
2842                 ;; \e$B$?$H$-$O!"$3$3$G\e(B henkan-list \e$B$H\e(B loop \e$B$r7W;;$9$k!#\e(B
2843                 (setq henkan-list (nthcdr skk-henkan-count skk-henkan-list)
2844                       loop (car skk-exit-show-candidates)
2845                       skk-exit-show-candidates nil))
2846                (t
2847                 ;; skk-henkan-show-candidates-keys \e$B$N:G=*$N%-!<$KBP1~$9$k8uJd\e(B
2848                 ;; \e$B$,=P$F$/$k$^$G%5!<%A$rB3$1$k!#\e(B
2849                 (and (skk-numeric-p) (skk-num-uniq))
2850                 (while (and skk-current-search-prog-list
2851                             (null (nthcdr (+ 11 (* loop 7)) skk-henkan-list)))
2852                   (setq skk-henkan-list
2853                         (skk-nunion skk-henkan-list (skk-search)))
2854                   (and (skk-numeric-p) (skk-num-uniq)))
2855                 (and (skk-numeric-p) (skk-num-convert*7))
2856                 (setq henkan-list (nthcdr (+ 4 (* loop 7)) skk-henkan-list))))
2857          (setq n (skk-henkan-show-candidate-subr candidate-keys henkan-list)))
2858        (if (> n 0)
2859            (condition-case nil
2860                (let* ((event (skk-read-event))
2861                       (char (event-to-character event))
2862                       num)
2863                  (if (eq skk-emacs-type 'xemacs)
2864                      (message "")) ; clear out candidates in echo area
2865                  (if (null char)
2866                      (skk-unread-event event)
2867                    (setq key-num-alist (nthcdr (- 7 n) key-num-alist1))
2868                    (and key-num-alist
2869                         (setq num (cdr (or (assq char key-num-alist)
2870                                            (if (skk-lower-case-p char)
2871                                                (assq (upcase char) key-num-alist)
2872                                              (assq (downcase char) key-num-alist))))))
2873                    (cond (num
2874                           (setq new-one (nth num henkan-list)
2875                                 skk-henkan-count (+ 4 (* loop 7) num)
2876                                 skk-kakutei-flag t
2877                                 loop nil
2878                                 str nil))
2879                          ((eq char ?\040) ; SPC
2880                           (if (or skk-current-search-prog-list
2881                                   (nthcdr 7 henkan-list))
2882                               (setq loop (1+ loop)
2883                                     str nil)
2884                             ;; \e$B8uJd$,?T$-$?!#$3$N4X?t$+$iH4$1$k!#\e(B
2885                             (let ((last-showed-index (+ 4 (* loop 7))))
2886                               (setq skk-exit-show-candidates
2887                                     ;; cdr \e$BIt$O!"<-=qEPO?$KF~$kA0$K:G8e$KI=<($7\e(B
2888                                     ;; \e$B$?8uJd72$NCf$G:G=i$N8uJd$r;X$9%$%s%G%/%9\e(B
2889                                     (cons loop last-showed-index))
2890                               ;; \e$B<-=qEPO?$KF~$k!#\e(Bskk-henkan-count \e$B$O\e(B
2891                               ;; skk-henkan-list \e$B$N:G8e$N8uJd$N<!\e(B (\e$BB8:_$7$J$$\e(B
2892                               ;; --- nil)\e$B$r;X$9!#\e(B
2893                               (setq skk-henkan-count (+ last-showed-index n)
2894                                     loop nil
2895                                     str nil))))
2896                          ((eq char skk-previous-candidate-char) ; ?x
2897                           (if (= loop 0)
2898                               ;; skk-henkan-show-candidates \e$B$r8F$VA0$N>uBV$KLa\e(B
2899                               ;; \e$B$9!#\e(B
2900                               (progn
2901                                 (setq skk-henkan-count 4)
2902                                 (skk-unread-event (character-to-event
2903                                                    skk-previous-candidate-char))
2904                                 ;; skk-henkan \e$B$^$G0l5$$K\e(B throw \e$B$9$k!#\e(B
2905                                 (throw 'unread nil))
2906                             ;; \e$B0l$DA0$N8uJd72$r%(%3!<%(%j%"$KI=<($9$k!#\e(B
2907                             (setq reverse t
2908                                   str nil)))
2909                          ;; \e$B$3$l$,$J$$$H\e(B quit \e$B$G$-$J$$!#2?8N!)\e(B
2910                          ((and (eq skk-emacs-type 'xemacs)
2911                                (eq char (quit-char)))
2912                           (signal 'quit nil))
2913                          (t (skk-message "\"%c\" \e$B$OM-8z$J%-!<$G$O$"$j$^$;$s!*\e(B"
2914                                          "\"%c\" is not valid here!"
2915                                          char)
2916                             (sit-for 1)))))
2917              (quit
2918               ;; skk-previous-candidate \e$B$X\e(B
2919               (setq skk-henkan-count 0)
2920               (skk-unread-event (character-to-event skk-previous-candidate-char))
2921               ;; skk-henkan \e$B$^$G0l5$$K\e(B throw \e$B$9$k!#\e(B
2922               (throw 'unread nil)))))  ; end of while loop
2923      (if (consp new-one)
2924          (cdr new-one)
2925        new-one))))
2926
2927 (defun skk-henkan-show-candidate-subr (keys candidates)
2928   ;; key \e$B$H\e(B candidates \e$B$rAH$_9g$o$;$F\e(B 7 \e$B$D$N8uJd72\e(B (\e$B8uJd?t$,\e(B 7 \e$B$KK~$?$J$+$C\e(B
2929   ;; \e$B$?$i$=$3$GBG$A@Z$k\e(B) \e$B$NJ8;zNs$r:n$j!"%_%K%P%C%U%!$KI=<($9$k!#\e(B
2930   (let ((workinglst
2931          ;; CANDIDATES \e$B$N@hF,$N\e(B 7 \e$B$D$N$_$N%j%9%H!#\e(B
2932          (let ((count 0) e v)
2933            (while (> 7 count)
2934              (setq e (nth count candidates))
2935              (if e
2936                  (setq v (cons e v)
2937                        count (1+ count))
2938                (setq count 7)))
2939            (nreverse v)))
2940         (n 0) str cand message-log-max)
2941     (if (not (car workinglst))
2942         nil
2943       (setq workinglst (skk-truncate-message workinglst))
2944       (setq n 1
2945             ;; \e$B:G=i$N8uJd$NA0$K6uGr$r$/$C$D$1$J$$$h$&$K:G=i$N8uJd$@$1@h$K<h$j\e(B
2946             ;; \e$B=P$9!#\e(B
2947             str (concat (car keys) ":" (if (consp (car workinglst))
2948                                             (cdr (car workinglst))
2949                                           (car workinglst))))
2950       ;; \e$B;D$j$N\e(B 6 \e$B$D$r<h$j=P$9!#8uJd$H8uJd$N4V$r6uGr$G$D$J$0!#\e(B
2951       (while (and (< n 7) (setq cand (nth n workinglst)))
2952         (setq cand (if (consp cand) (cdr cand) cand)
2953               str (concat str "  " (nth n keys) ":" cand)
2954               n (1+ n)))
2955       (message "%s  [\e$B;D$j\e(B %d%s]"
2956                str (length (nthcdr n candidates))
2957                (make-string (length skk-current-search-prog-list) ?+)))
2958     ;; \e$BI=<($9$k8uJd?t$rJV$9!#\e(B
2959     n))
2960
2961 (defun skk-truncate-message (l)
2962   (let* (
2963          ;; L \e$B$KF~$C$F$$$k$=$l$>$l$NMWAG\e(B (\e$B8uJd\e(B) \e$B$NJ8;zNs$NI}$N%j%9%H!#\e(B
2964          (width-list
2965           (mapcar
2966            (function (lambda (e) (string-width (if (consp e) (cdr e) e))))
2967            l))
2968          ;; \e$B8uJd?t!#\e(B
2969          (candidates-num (length l))
2970          ;; \e$B8uJd0J30$K%(%3!<%(%j%"$KI=<($5$l$kItIJ$NJ8;zNs$NI}!#\e(B
2971          ;; (string-width "  [\e$B;D$j\e(B 100+]") -> 13
2972          ;; ` F:'\e$B$J$I$N8uJd$NA*Br$N$?$a$KI=<($5$l$k\e(B width 3 \e$B$NJ8;zNs$,8uJd?tJ,$"$k!#\e(B
2973          ;; \e$B%(%3!<%(%j%"$N:G=i$N8uJd$O6uGr$,A0$KIU$$$F$$$J$$$N$G\e(B 1-\e$B!#\e(B
2974          (parts-len (+ 13 (1- (* 3 candidates-num))))
2975          ;; \e$B$G!"%H!<%?%k$G$I$l$@$1$NI}$K$J$k$+!#\e(B
2976          (message-width (apply '+ parts-len width-list))
2977          (diff (- (window-width) message-width))
2978          (count 0) (plus 0) max)
2979     (if (> diff 0)
2980         ;; window-width \e$B$K<}$^$C$F$$$l$P2?$b$7$J$$!#\e(B
2981         l
2982       ;; \e$B$=$l$>$l$N8uJd$N:GBgI}$r2>7h$a$9$k!#\e(B
2983       (setq max (/ (float (- (window-width) parts-len)) candidates-num))
2984       (while width-list
2985         (if (> (car width-list) max)
2986             (setq count (1+ count))
2987           (setq plus (+ (- max (car width-list)) plus)))
2988         (setq width-list (cdr width-list)))
2989       ;; \e$B:GBgI}$KK~$?$J$$D9$5$r=8$a$F:GBgI}$r=$@5!#\e(B
2990       (setq max (truncate (/ (+ plus (- (window-width) parts-len))
2991                              candidates-num)))
2992       (mapcar
2993        (function
2994         (lambda (e)
2995           ;; \e$B:GBgI}0J>e$NJ8;zNs$r\e(B
2996           (cond ((and (stringp e) (> (string-width e) max))
2997                  ;; \e$B:GBgI}$K<}$^$k$h$&$KC;$+$/$9$k!#\e(B
2998                  (concat (truncate-string-to-width e (- max 3)) "..."))
2999                 ((and (consp e) (> (string-width (cdr e)) max))
3000                  (cons (car e)
3001                        (concat (truncate-string-to-width (cdr e) (- max 3))
3002                                "...")))
3003                 (t e))))
3004        l))))
3005
3006 (defun skk-henkan-in-minibuff ()
3007   ;; \e$B%_%K%P%C%U%!$G<-=qEPO?$r$7!"EPO?$7$?%(%s%H%j$NJ8;zNs$rJV$9!#\e(B
3008   (save-match-data
3009     (let ((enable-recursive-minibuffers t)
3010           ;; \e$BJQ49Cf$K\e(B isearch message \e$B$,=P$J$$$h$&$K$9$k!#\e(B
3011           skk-isearch-message new-one)
3012       (add-hook 'minibuffer-setup-hook 'skk-j-mode-on)
3013       (add-hook
3014        'minibuffer-setup-hook
3015        (function (lambda ()
3016                    (add-hook 'pre-command-hook 'skk-pre-command nil 'local))))
3017       (condition-case nil
3018           (setq new-one
3019                 (read-from-minibuffer
3020                  (concat (or (and (skk-numeric-p) (skk-num-henkan-key))
3021                              (if skk-okuri-char
3022                                  (skk-compute-henkan-key2)
3023                                skk-henkan-key))
3024                          " ")
3025                  (if (and (not skk-okuri-char)
3026                           skk-read-from-minibuffer-function)
3027                      (funcall skk-read-from-minibuffer-function))))
3028         (quit
3029          (setq new-one "")))
3030       (if (string= new-one "")
3031           (if skk-exit-show-candidates
3032               ;; \e$B%_%K%P%C%U%!$KI=<($7$?8uJd$,?T$-$F<-=qEPO?$KF~$C$?$,!"6uJ8;z\e(B
3033               ;; \e$BNs$,EPO?$5$l$?>l9g!#:G8e$K%_%K%P%C%U%!$KI=<($7$?8uJd72$r:FI=\e(B
3034               ;; \e$B<($9$k!#\e(B
3035               (progn
3036                 (setq skk-henkan-count (cdr skk-exit-show-candidates))
3037                 (skk-henkan))
3038             ;; skk-henkan-show-candidates \e$B$KF~$kA0$K8uJd$,?T$-$?>l9g\e(B
3039             (setq skk-henkan-count (1- skk-henkan-count))
3040             (if (= skk-henkan-count -1)
3041                 (progn
3042                   ;; \e$BAw$j$"$j$NJQ49$G<-=qEPO?$KF~$j!"6uJ8;z$rEPO?$7$?8e!"$=$N\e(B
3043                   ;; \e$B$^$^:FEYAw$j$J$7$H$7$FJQ49$7$?>l9g$O\e(B
3044                   ;; skk-henkan-okurigana, skk-okuri-char \e$B$NCM$r\e(B nil \e$B$K$7$J$1\e(B
3045                   ;; \e$B$l$P!"$=$l$>$l$NCM$K8E$$Aw$j2>L>$,F~$C$?$^$^$G8!:w$K<:GT\e(B
3046                   ;; \e$B$9$k!#\e(B
3047                   (setq skk-henkan-okurigana nil
3048                         skk-okurigana nil
3049                         skk-okuri-char nil)
3050                   (skk-change-marker-to-white))
3051               ;; skk-henkan-count \e$B$,\e(B -1 \e$B$G$J$1$l$P!"%+%l%s%H%P%C%U%!$G$O:G8e$N\e(B
3052               ;; \e$B8uJd$rI=<($7$?$^$^$J$N$G\e(B (\e$BI=<(4XO"$G$O2?$b$7$J$/$F$b!"$b$&4{\e(B
3053               ;; \e$B$KK>$_$N>uBV$K$J$C$F$$$k\e(B) \e$B2?$b$7$J$$!#\e(B
3054              ))
3055         ;; \e$B%_%K%P%C%U%!$GJQ49$7$?J8;zNs$,$"$k\e(B (\e$B6uJ8;zNs$G$J$$\e(B) \e$B$H$-!#\e(B
3056         ;; \e$BKvHx$N6uGr$r<h$j=|$/!#\e(B
3057         (and (string-match "[ \e$B!!\e(B]+$" new-one)
3058              (setq new-one (substring new-one 0 (match-beginning 0))))
3059         (if (skk-numeric-p)
3060             (setq new-one (skk-num-process-user-minibuf-input new-one))
3061           ;; \e$B$9$4$/$?$/$5$s$N8uJd$,$"$k>l9g$K!"$=$N:G8e$K?7$7$$8uJd$r2C$($k$N$O\e(B
3062           ;; \e$B$1$C$3$&9|$@$,!#\e(B
3063           (setq skk-henkan-list (nconc skk-henkan-list (list new-one))
3064                 ;; \e$B%U%i%0$r%*%s$K$9$k!#\e(B
3065                 skk-kakutei-flag t))
3066         (setq skk-henkan-in-minibuff-flag t
3067               skk-touroku-count (1+ skk-touroku-count)))
3068       ;; (nth skk-henkan-count skk-henkan-list) \e$B$,\e(B nil \e$B$@$+$i<-=qEPO?$K\e(B
3069       ;; \e$BF~$C$F$$$k!#\e(Bskk-henkan-count \e$B$r%$%s%/%j%a%s%H$9$kI,MW$O$J$$!#\e(B
3070       ;; (setq skk-henkan-count (1+ skk-henkan-count))
3071       ;; new-one \e$B$,6uJ8;zNs$@$C$?$i\e(B nil \e$B$rJV$9!#\e(B
3072       (if (not (string= new-one "")) new-one))))
3073
3074 (defun skk-compute-henkan-key2 ()
3075   ;; skk-henkan-okurigana \e$B$,\e(B non-nil \e$B$J$i\e(B skk-henkan-key \e$B$+$i!"$+$D$F\e(B
3076   ;; skk-henkan-key2 \e$B$H8F$P$l$F$$$?$b$N$r:n$k!#\e(B
3077   ;; skk-henkan-key2 \e$B$H$O!"!V4A;zItJ,$NFI$_\e(B + "*" + \e$BAw$j2>L>!W$N7A<0$NJ8;zNs$r\e(B
3078   ;; \e$B8@$&!#\e(B
3079   (if skk-henkan-okurigana
3080       (save-match-data
3081         (string-match "[a-z]+$" skk-henkan-key)
3082         (concat (substring skk-henkan-key 0 (match-beginning 0))
3083                 "*" skk-henkan-okurigana))))
3084
3085 (defun skk-setup-minibuffer ()
3086   ;; \e$B%+%l%s%H%P%C%U%!$NF~NO%b!<%I$K=>$$%_%K%P%C%U%!$NF~NO%b!<%I$r@_Dj$9$k!#\e(B
3087   (cond ((eq skk-minibuffer-origin-mode 'hiragana)
3088          (skk-j-mode-on))
3089         ((eq skk-minibuffer-origin-mode 'katakana)
3090          (skk-j-mode-on t))
3091         ((eq skk-minibuffer-origin-mode 'abbrev)
3092          (skk-abbrev-mode-on))
3093         ((eq skk-minibuffer-origin-mode 'latin)
3094          (skk-latin-mode-on))
3095         ((eq skk-minibuffer-origin-mode 'jisx0208-latin)
3096          (skk-jisx0208-latin-mode-on))))
3097
3098 (defun skk-previous-candidate (&optional arg)
3099   "\e$B"'%b!<%I$G$"$l$P!"0l$DA0$N8uJd$rI=<($9$k!#\e(B
3100 \e$B"'%b!<%I0J30$G$O%+%l%s%H%P%C%U%!$K\e(B \"x\" \e$B$rA^F~$9$k!#\e(B
3101 \e$B3NDj<-=q$K$h$k3NDj$ND>8e$K8F$V$H3NDj$,%"%s%I%%$5$l$F!"3NDjA0$N>uBV$G\e(B
3102 \e$BD>A0$N8+=P$78l$,%+%l%s%H%P%C%U%!$KA^F~$5$l$k!#\e(B"
3103   (interactive "*p")
3104   (skk-with-point-move
3105    (if (not skk-henkan-active)
3106        (if (not (eq last-command 'skk-kakutei-henkan))
3107            (skk-kana-input arg)
3108          ;; restore the state just before the last kakutei henkan.
3109          (delete-region skk-henkan-start-point (point))
3110          (skk-set-henkan-point-subr)
3111          (insert-and-inherit (skk-get-last-henkan-data 'henkan-key))
3112          (setq this-command 'skk-undo-kakutei-henkan))
3113      (if (string= skk-henkan-key "")
3114          nil
3115        (let ((mark
3116               (if (not (eobp))
3117                   (skk-save-point (forward-char 1) (point-marker)))))
3118          (skk-save-point
3119           (if (= skk-henkan-count 0)
3120               (progn
3121                 (and skk-okuri-char
3122                      ;; roman prefix for okurigana should be removed.
3123                      (setq skk-henkan-key (substring skk-henkan-key 0 -1)))
3124                 (setq skk-henkan-count -1
3125                       skk-henkan-in-minibuff-flag nil
3126                       skk-henkan-list nil
3127                       skk-henkan-okurigana nil
3128                       skk-okuri-char nil
3129                       skk-okuri-index-min -1
3130                       skk-okuri-index-max -1
3131                       skk-okurigana nil
3132                       skk-prefix "")
3133                 (and (skk-numeric-p) (skk-num-initialize))
3134                 ;; Emacs 19.28 \e$B$@$H\e(B Overlay \e$B$r>C$7$F$*$+$J$$$H!"<!$K\e(B insert \e$B$5$l\e(B
3135                 ;; \e$B$k\e(B skk-henkan-key \e$B$K2?8N$+\e(B Overlay \e$B$,$+$+$C$F$7$^$&!#\e(B
3136                 (and skk-use-face (skk-henkan-face-off))
3137                 (delete-region skk-henkan-start-point skk-henkan-end-point)
3138                 (goto-char skk-henkan-end-point)
3139                 (insert-and-inherit skk-henkan-key)
3140                 (skk-change-marker-to-white))
3141             (setq skk-henkan-count (1- skk-henkan-count))
3142             (skk-insert-new-word (skk-get-current-candidate-simply))))
3143          (if mark
3144              (progn
3145                (goto-char mark)
3146                (skk-set-marker mark nil)
3147                (backward-char 1))
3148            (goto-char (point-max)))
3149          (and skk-abbrev-mode (= skk-henkan-count -1) (skk-abbrev-mode-on)))))))
3150
3151 (defun skk-insert-new-word (word)
3152   ;; \e$B8+=P$78l$r>C$7!"$=$N>l=j$XJQ497k2L$NJ8;zNs$rA^F~$9$k!#\e(B
3153   (let (func)
3154     ;; Emacs 19.28 \e$B$@$H\e(B Overlay \e$B$r>C$7$F$*$+$J$$$H!"<!$K\e(B insert \e$B$5$l$k\e(B
3155     ;; skk-henkan-key \e$B$K2?8N$+\e(B Overlay \e$B$,$+$+$C$F$7$^$&!#\e(B
3156     (and skk-use-face (skk-henkan-face-off))
3157     (delete-region skk-henkan-start-point skk-henkan-end-point)
3158     (goto-char skk-henkan-start-point)
3159     ;; (^_^;) \e$B$N$h$&$J8+=P$78l$KBP$7!"\e(Bread-from-string \e$B$r8F$V$H%(%i!<$K$J$k$N\e(B
3160     ;; \e$B$G!"\e(Bcondition-case \e$B$G$=$N%(%i!<$rJa$^$($k!#\e(B
3161     (condition-case nil
3162         (setq func (car (read-from-string word)))
3163       (error (setq func word)))
3164     (condition-case nil
3165         (insert-and-inherit (if (and (listp func)
3166                                      (functionp (car func)))
3167                                 (eval func) word))
3168       ;; \e$BJ8;zNs$rJV$5$J$$\e(B Lisp \e$B%W%m%0%i%`$rI>2A$7$F$b%(%i!<$K$J$i$J$$J}$,JXMx!)\e(B
3169       (error nil))
3170     (skk-set-marker skk-henkan-end-point (point))
3171     (and skk-use-face (skk-henkan-face-on))
3172     (and skk-insert-new-word-function
3173          (funcall skk-insert-new-word-function))))
3174
3175 (defun skk-kakutei (&optional word)
3176   "\e$B8=:_I=<($5$l$F$$$k8l$G3NDj$7!"<-=q$N99?7$r9T$&!#\e(B
3177 \e$B%+%l%s%H%P%C%U%!$G\e(B SKK \e$B%b!<%I$K$J$C$F$$$J$+$C$?$i\e(B SKK \e$B%b!<%I$KF~$k!#\e(B
3178 \e$B%*%W%7%g%J%k0z?t$N\e(B WORD \e$B$rEO$9$H!"8=:_I=<($5$l$F$$$k8uJd$H$OL54X78$K\e(B WORD \e$B$G3N\e(B
3179 \e$BDj$9$k!#\e(B"
3180   ;; read only \e$B$G%(%i!<$K$J$k$h$&$K$9$k$H\e(B read only \e$B%P%C%U%!$G\e(B SKK \e$B$,5/F0$G$-\e(B
3181   ;; \e$B$J$/$J$k!#\e(B
3182   (interactive)
3183   (let ((inhibit-quit t)
3184         converted kakutei-word)
3185     (if (not skk-henkan-on)
3186         nil
3187       (if (not skk-henkan-active)
3188           nil
3189         (setq kakutei-word
3190               ;; \e$B3NDj<-=q$N8l$G3NDj$7$?$H$-$O!"<-=q$K$=$N8l$r=q$-9~$`I,MW$b$J\e(B
3191               ;; \e$B$$$7!"99?7$9$kI,MW$b$J$$$H;W$C$F$$$?$,!"Jd40$r9T$J$&$H$-$O!"\e(B
3192               ;; \e$B8D?M<-=q$r;2>H$9$k\e(B (\e$B3NDj<-=q$O;2>H$7$J$$\e(B) \e$B$N$G!"B?>/;q8;$H;~\e(B
3193               ;; \e$B4V$rL5BL$K$7$F$b!"8D?M<-=q$K3NDj<-=q$N%(%s%H%j$r=q$-9~$s$G99\e(B
3194               ;; \e$B?7$b$7$F$*$/!#\e(B
3195               (or word (skk-get-current-candidate-simply (skk-numeric-p))))
3196         (if (or
3197              (and (not skk-search-excluding-word-pattern-function) kakutei-word)
3198              (and
3199               kakutei-word skk-search-excluding-word-pattern-function
3200               (not
3201                (funcall skk-search-excluding-word-pattern-function kakutei-word))))
3202             (progn
3203               (skk-update-jisyo kakutei-word)
3204               (if (skk-numeric-p)
3205                   (progn
3206                     (setq converted (skk-get-current-candidate-simply))
3207                     (skk-num-update-jisyo kakutei-word converted))))))
3208       (if skk-mode
3209           (progn
3210             (skk-kakutei-cleanup-buffer)
3211             ;; KAKUTEI-WORD \e$B$J$I$N>pJs$,I,MW$G$"$l$P!"\e(Bskk-last-henkan-data \e$B$+$iF@$i$l\e(B
3212             ;; \e$B$k!#I,MW$J%G!<%?$,$=$l$i$NJQ?t$K8BDj$5$l$J$$$N$G!"0z?t$K$7$J$$!#\e(B
3213             (and skk-kakutei-end-function (funcall skk-kakutei-end-function))
3214             (skk-kakutei-initialize
3215              (if (skk-numeric-p) (cons kakutei-word converted) kakutei-word)))))
3216     (skk-do-auto-fill)
3217     (if skk-mode
3218         (skk-j-mode-on skk-katakana)
3219       ;; \e$B%+%l%s%H%P%C%U%!$G$^$@\e(B skk-mode \e$B$,%3!<%k$5$l$F$$$J$+$C$?$i!"%3!<%k$9$k!#\e(B
3220       (skk-mode 1))))
3221
3222 (defun skk-kakutei-cleanup-buffer ()
3223   ;; \e$B3NDjD>8e$N%P%C%U%!$N@07A$r9T$J$&!#\e(B
3224   (if skk-okurigana
3225       (progn
3226         (skk-delete-okuri-mark)
3227         (and skk-katakana skk-convert-okurigana-into-katakana
3228              (skk-katakana-region skk-henkan-end-point (point)))))
3229   (skk-delete-henkan-markers)
3230   (and (boundp 'self-insert-after-hook) self-insert-after-hook
3231        (funcall self-insert-after-hook skk-henkan-start-point (point)))
3232   (and overwrite-mode
3233        (skk-del-char-with-pad
3234         (skk-ovwrt-len
3235          (string-width
3236           (buffer-substring-no-properties skk-henkan-start-point (point)))))))
3237
3238 (defun skk-kakutei-initialize (&optional kakutei-word)
3239   ;; \e$B3NDj;~$KJQ?t$N=i4|2=$H%"%s%I%%$N$?$a$NJQ?t$NJ]B8$r9T$J$&!#\e(B
3240   (if (and kakutei-word (or (consp kakutei-word)
3241                             (not (string= kakutei-word ""))))
3242       (progn
3243         (setq skk-kakutei-count (1+ skk-kakutei-count))
3244         ;; skk-undo-kakutei \e$B$N$?$a$K:G8e$NJQ49$N%G!<%?$rJ]B8$9$k!#\e(B
3245         (skk-put-last-henkan-data 'henkan-key skk-henkan-key)
3246         (skk-put-last-henkan-data 'okuri-char skk-okuri-char)
3247         (skk-put-last-henkan-data 'henkan-okurigana skk-henkan-okurigana)
3248         (skk-put-last-henkan-data
3249          'henkan-list
3250          ;; \e$B3NDj$7$?8l$r@hF,$K$9$k!#\e(B
3251          (cons kakutei-word (delete kakutei-word skk-henkan-list)))
3252         ;; (eq last-command 'skk-kakutei-henkan) \e$B$G%]!<%?%V%k$K3NG'$G$-$k$N$G\e(B
3253         ;; \e$B$"$($F$$$i$J$$$+!#\e(B
3254         ;;(skk-put-last-henkan-data
3255         ;; 'kakutei-henkan
3256         ;; (eq this-command 'skk-kakutei-henkan))
3257         ;;
3258         ;; \e$B>e5-0J30$N\e(B henkan data \e$B$r\e(B skk-last-henkan-data \e$B$K;D$7$?$+$C$?$i!"\e(B
3259         ;; skk-kakutei-end-function \e$B$rMxMQ$9$k!#\e(B
3260         ))
3261   (setq skk-abbrev-mode nil
3262         skk-exit-show-candidates nil
3263         skk-henkan-active nil
3264         skk-henkan-count -1
3265         skk-henkan-in-minibuff-flag nil
3266         skk-henkan-key nil
3267         skk-henkan-list nil
3268         skk-henkan-okurigana nil
3269         skk-henkan-on nil
3270         skk-kakutei-flag nil
3271         skk-okuri-char nil
3272         skk-okuri-index-min -1
3273         skk-okuri-index-max -1
3274         ;; skk-prefix ""
3275         )
3276   (and (skk-numeric-p) (skk-num-initialize))
3277   (and skk-use-look (setq skk-look-completion-words nil)))
3278
3279 (defun skk-undo-kakutei ()
3280   "\e$B0lHV:G8e$N3NDj$r%"%s%I%%$7!"8+=P$7$KBP$9$k8uJd$rI=<($9$k!#\e(B
3281 \e$B:G8e$K3NDj$7$?$H$-$N8uJd$O%9%-%C%W$5$l$k!#\e(B
3282 \e$B8uJd$,B>$K$J$$$H$-$O!"%_%K%P%C%U%!$G$N<-=qEPO?$KF~$k!#\e(B"
3283   (interactive)
3284   (skk-with-point-move
3285    (cond ((eq last-command 'skk-undo-kakutei)
3286           (skk-error "\e$B3NDj%"%s%I%%$OO"B3;HMQ$G$-$^$;$s\e(B"
3287                      "Cannot undo kakutei repeatedly"))
3288          (skk-henkan-active
3289           (skk-error "\e$B"'%b!<%I$G$O3NDj%"%s%I%%$G$-$^$;$s\e(B"
3290                      "Cannot undo kakutei in \e$B"'\e(B mode"))
3291          ( ; skk-henkan-key may be nil or "".
3292           (or (not (skk-get-last-henkan-data 'henkan-key))
3293               (string= (skk-get-last-henkan-data 'henkan-key) ""))
3294           (skk-error "\e$B%"%s%I%%%G!<%?$,$"$j$^$;$s\e(B" "Lost undo data")))
3295    (condition-case nil
3296        (let ((end
3297               (if (skk-get-last-henkan-data 'henkan-okurigana)
3298                   (+ (length (skk-get-last-henkan-data 'henkan-okurigana))
3299                      skk-henkan-end-point)
3300                 skk-henkan-end-point)))
3301          (setq skk-henkan-active t
3302                skk-henkan-on t
3303                skk-current-search-prog-list
3304                (if (eq (car (car skk-search-prog-list))
3305                        'skk-search-kakutei-jisyo-file)
3306                    ;; \e$B3NDj<-=q$OC5$7$F$bL50UL#!#\e(B
3307                    (cdr skk-search-prog-list)
3308                  skk-search-prog-list))
3309          ;; get henkan data back from skk-last-henkan-data.
3310          (setq skk-henkan-key (skk-get-last-henkan-data 'henkan-key)
3311                skk-henkan-list (skk-get-last-henkan-data 'henkan-list)
3312                skk-henkan-okurigana (skk-get-last-henkan-data 'henkan-okurigana)
3313                skk-okuri-char (skk-get-last-henkan-data 'okuri-char))
3314          (and skk-use-numeric-conversion
3315               (setq skk-num-list (skk-get-last-henkan-data 'skk-num-list)))
3316          (and (>= (point-max) end)
3317               ;; \e$B:G8e$NJQ49ItJ,$N%F%-%9%H$r>C$9!#Aw$j2>L>$rGD0.$7$F$$$k$N$J$i\e(B
3318               ;; (skk-process-okuri-early \e$B$,\e(B non-nil \e$B$J$iAw$j2>L>$rGD0.$G$-$J$$\e(B)\e$B!"\e(B
3319               ;; \e$BAw$j2>L>$r4^$a$?ItJ,$^$G$r>C$9!#\e(B
3320               (delete-region skk-henkan-start-point end))
3321          (goto-char skk-henkan-start-point)
3322          (insert-and-inherit "\e$B"'\e(B")
3323          (skk-set-marker skk-henkan-start-point (point))
3324          (if skk-okuri-char
3325              (progn                     ; \e$BAw$j$"$j\e(B
3326                (insert-and-inherit (substring skk-henkan-key 0
3327                                               (1- (length skk-henkan-key))))
3328                (skk-set-marker skk-henkan-end-point (point))
3329                (and skk-henkan-okurigana (insert-and-inherit skk-henkan-okurigana)))
3330            (insert-and-inherit skk-henkan-key)
3331            (skk-set-marker skk-henkan-end-point (point)))
3332          (skk-message "\e$B3NDj%"%s%I%%!*\e(B" "Undo kakutei!")
3333          (setq skk-henkan-count 1)
3334          (skk-henkan))
3335      ;; skk-kakutei-undo \e$B$+$iESCf$GH4$1$?>l9g$O!"3F<o%U%i%0$r=i4|2=$7$F$*$+$J$$\e(B
3336      ;; \e$B$H<!$NF0:n$r$7$h$&$H$7$?$H$-$K%(%i!<$K$J$k!#\e(B
3337      (error (skk-kakutei))
3338      (quit (skk-kakutei)))))
3339
3340 (defun skk-set-henkan-point (&optional arg)
3341   ;;"\e$BJQ49$r3+;O$9$k%]%$%s%H$r%^!<%/$7!"BP1~$9$k\e(B skk-prefix \e$B$+!"Jl2;$rF~NO$9$k!#\e(B"
3342   (let* ((last-char (skk-downcase last-command-char))
3343          (normal (not (eq last-char last-command-char)))
3344          (sokuon (and (string= skk-prefix (char-to-string last-char))
3345                       (/= last-char ?o)))
3346          (henkan-active skk-henkan-active))
3347     (if (or (not skk-henkan-on) skk-henkan-active)
3348         (if normal
3349             (skk-set-henkan-point-subr)
3350           (and skk-henkan-on (skk-set-henkan-point-subr))
3351           (if henkan-active
3352               (skk-emulate-original-map arg)
3353             ;; What's to be here?
3354             ;;(skk-self-insert arg)
3355            ))
3356       (if (not normal)
3357           (progn                        ; special char
3358             (insert-and-inherit last-char)
3359             (skk-set-marker skk-henkan-end-point (point))
3360             (setq skk-henkan-count 0
3361                   skk-henkan-key (buffer-substring-no-properties
3362                                   skk-henkan-start-point (point))
3363                   skk-prefix "")
3364             (skk-henkan))
3365         ;; prepare for the processing of okurigana if not skk-okurigana
3366         ;; and the preceding character is not a numeric character.
3367         ;; if the previous char is a special midashi char or a
3368         ;; numeric character, we assume that the user intended to type the
3369         ;; last-command-char in lower case.
3370         (if (and (or (not (skk-get-prefix skk-current-rule-tree)) ; for KAnji, KanJIru
3371                      (and
3372                       (not (= skk-henkan-start-point skk-kana-start-point))
3373                       (or sokuon        ; for TaSSi or TasSi
3374                           (skk-kana-cleanup)))) ; for NEko
3375                  (not skk-okurigana)
3376                  (or (= skk-henkan-start-point (point))
3377                      (let ((p (char-before)))
3378                        (not
3379                         (or
3380                          ;; previous char is a special midashi char
3381                          (memq p skk-special-midashi-char-list)
3382                          ;; previous char is an ascii numeric char
3383                          (and (<= ?0 p) (<= p ?9))
3384                          ;; previous char is a JIS X 0208 numeric char
3385                           (and (skk-jisx0208-p p)
3386                                (= (skk-char-octet p 0) 35) ;?#
3387                                (<= 48 (skk-char-octet p 1)) ; ?0
3388                                (<= (skk-char-octet p 1) 57))  ; ?9
3389                          )))))
3390             (if skk-process-okuri-early
3391                 (progn
3392                   (skk-set-marker skk-henkan-end-point (point))
3393                   (setq skk-okuri-char (char-to-string last-char))
3394                   (if sokuon
3395                       (progn
3396                         (setq skk-henkan-key
3397                               (concat (buffer-substring-no-properties
3398                                        skk-henkan-start-point
3399                                        skk-kana-start-point)
3400                                       (if skk-katakana "\e$B%C\e(B" "\e$B$C\e(B")
3401                                       skk-henkan-okurigana))
3402                         (skk-erase-prefix)
3403                         (insert-and-inherit (if skk-katakana "\e$B%C\e(B " "\e$B$C\e(B "))
3404                         (setq skk-prefix ""
3405                               skk-henkan-count 0)
3406                         (skk-henkan)
3407                         (delete-backward-char 2))
3408                     (setq skk-henkan-key (concat
3409                                           (buffer-substring-no-properties
3410                                            skk-henkan-start-point
3411                                            (point))
3412                                           skk-okuri-char))
3413                     (insert-and-inherit " ")
3414                     (setq skk-prefix ""
3415                           skk-henkan-count 0)
3416                     (skk-henkan)
3417                     (delete-backward-char 1))
3418                   ;; we set skk-kana-start-point here, since the marker may no
3419                   ;; longer point at the correct position after skk-henkan.
3420                   (skk-set-marker skk-kana-start-point (point)))
3421               (if (= skk-henkan-start-point (point))
3422                   nil
3423                 (if sokuon
3424                     (progn
3425                       (skk-erase-prefix 'clean)
3426                       (insert-and-inherit (if skk-katakana "\e$B%C\e(B" "\e$B$C\e(B"))))
3427                 (skk-set-marker skk-okurigana-start-point (point))
3428                 (insert-and-inherit "*")
3429                 (skk-set-marker skk-kana-start-point (point))
3430                 (setq skk-okuri-char (char-to-string last-char)
3431                       skk-okurigana t))))))
3432     (if normal
3433         (progn
3434           (setq last-command-char last-char)
3435           (skk-kana-input arg)))))
3436
3437 (defun skk-start-henkan (arg)
3438   "\e$B"&%b!<%I$G$O4A;zJQ49$r3+;O$9$k!#"'%b!<%I$G$O<!$N8uJd$rI=<($9$k!#\e(B
3439 \e$B"&%b!<%I$G!"%+%?%+%J%b!<%I$N$^$^4A;zJQ49$r3+;O$9$k$H!"8+=P$78l$rJ?2>L>$K\e(B
3440 \e$BJQ498e!"4A;zJQ49$r3+;O$9$k!#\e(B
3441 \e$B8+=P$78l$NJQ49$;$:$K$=$N$^$^4A;zJQ49$r9T$J$$$?$1$l$P!"\e(BC-u SPC \(arg \e$B$,\e(B 4
3442 \e$B$K$J$k\e(B\) \e$B$H%?%$%W$9$k!#\e(B"
3443   (interactive "*p")
3444   (skk-with-point-move
3445    (cancel-undo-boundary)
3446    (if skk-henkan-active
3447        (progn
3448          (setq skk-henkan-count (1+ skk-henkan-count))
3449          (skk-henkan))
3450      (save-match-data
3451        (let (pos)
3452          (skk-kana-cleanup 'force)
3453          (and (skk-get-prefix skk-current-rule-tree)
3454               ;; Never.  `skk-erase-prefix' called by `skk-kana-cleanup'
3455               ;; initializes `skk-prefix'.
3456               (skk-error "\e$B%U%#%C%/%9$5$l$F$$$J$$\e(B skk-prefix \e$B$,$"$j$^$9\e(B"
3457                          "Have unfixed skk-prefix"))
3458          (setq pos (point))
3459          (and (< pos skk-henkan-start-point)
3460               (skk-error
3461                "\e$B%+!<%=%k$,JQ493+;OCOE@$h$jA0$K$"$j$^$9\e(B"
3462                "Henkan end point must be after henkan start point"))
3463          (and skk-katakana (= arg 1)
3464               (skk-hiragana-region skk-henkan-start-point pos))
3465          (setq skk-henkan-key (buffer-substring-no-properties
3466                                skk-henkan-start-point pos))
3467          (and skk-okurigana (string-match "\\* *$" skk-henkan-key)
3468               (skk-error
3469                "\e$B6u$NAw$j2>L>$G4A;z$rEPO?$7$h$&$H$7$F$$$^$9\e(B"
3470                "No okurigana!"))
3471          (if skk-allow-spaces-newlines-and-tabs
3472              ;; skk-henkan-key \e$B$NCf$N\e(B "[ \n\t]+" \e$B$r40A4$K<h$j=|$/!#\e(B
3473              (while (string-match "[ \n\t]+" skk-henkan-key)
3474                (setq skk-henkan-key
3475                      (concat (substring skk-henkan-key 0 (match-beginning 0))
3476                              (substring skk-henkan-key (match-end 0)))))
3477            (skk-save-point
3478             (beginning-of-line)
3479             (and (> (point) skk-henkan-start-point)
3480                  (skk-error
3481                   "\e$BJQ49%-!<$K2~9T$,4^$^$l$F$$$^$9\e(B"
3482                   "Henkan key may not contain a new line character")))
3483            ;; \e$B:G=i$N%9%Z!<%9$G\e(B skk-henkan-key \e$B$r$A$g$s@Z$k$@$1!#\e(B
3484            (setq skk-henkan-key (substring skk-henkan-key 0
3485                                            (string-match " "
3486                                                          skk-henkan-key))))
3487          (skk-set-marker skk-henkan-end-point pos)
3488          (setq skk-henkan-count 0)
3489          (skk-henkan)
3490          (if (and skk-abbrev-mode skk-henkan-active)
3491              (progn
3492                (skk-j-mode-on)
3493                (setq skk-abbrev-mode t))))))))
3494
3495 (defun skk-auto-start-henkan (str)
3496   ;; skk-auto-start-henkan-keyword-list \e$B$NMWAG$NJ8;zNs$rA^F~$7$?$H$-$K<+F0E*$K\e(B
3497   ;; (\e$B%9%Z!<%9$rBG80$7$J$/$H$b\e(B) \e$BJQ49$r3+;O$9$k!#%(!<!_%$%=%U%H<R$N\e(B MSDOS \e$BMQ\e(B \e$B$N\e(B
3498   ;; FEP\e$B!"\e(BWX2+ \e$BIw!#\e(B
3499   (and (member str skk-auto-start-henkan-keyword-list)
3500        (skk-save-point
3501         (backward-char 1)
3502         (and (> (point) skk-henkan-start-point)
3503              (let ((skk-prefix ""))
3504                (skk-start-henkan (prefix-numeric-value current-prefix-arg)))))))
3505
3506 (defun skk-backward-and-set-henkan-point (arg)
3507   "\e$B%]%$%s%H$ND>A0$K$"$kJ8;zNs$N@hF,$KJQ493+;O%]%$%s%H$r<($9\e(B \"\e$B"&\e(B\" \e$B$rIU$1$k!#\e(B
3508 \e$B%+!<%=%k$ND>A0$K$"$kJ8;z\e(B \(\e$B%9%Z!<%9J8;z!"%?%VJ8;z!"D92;$rI=$o$9!V!<!W\e(B \e$B$OL5>r7o\e(B
3509 \e$B$K%9%-%C%W$5$l$k\e(B\) \e$B$r\e(B skk-what-char-type \e$B$K$FH=JL$7!"F1<o$NJ8;zNs$r$R$H$+$?$^\e(B
3510 \e$B$j$H$7$F8eJ}$X%9%-%C%W$9$k!#\e(B
3511 \e$BC"$7!"$R$i$+$J$N>l9g$O!V$r!W$ND>A0$G!"%+%?%+%J$N>l9g$O!V%r!W$ND>A0$G;_$^$k!#\e(B
3512 C-u ARG \e$B$G\e(B ARG \e$B$rM?$($k$H!"$=$NJ8;zJ,$@$1La$C$FF1$8F0:n$r9T$J$&!#\e(B"
3513   (interactive "*P")
3514   (if (not skk-mode)
3515       (skk-emulate-original-map arg)
3516     (catch 'exit1
3517       (skk-save-point
3518        ;; \e$B$H$j$"$($::G=i$N\e(B SPC, TAB, \e$BA43Q\e(B SPC \e$B$@$1%8%c%s%W$9$k!#\e(B
3519        (skip-chars-backward " \t\e$B!!\e(B")
3520        ;; \e$B0z?t$"$j!#\e(B
3521        (if arg
3522            (if (not skk-allow-spaces-newlines-and-tabs)
3523                (backward-char (prefix-numeric-value arg))
3524              (setq arg (prefix-numeric-value arg))
3525              (while (> arg 0)
3526                (skip-chars-backward " \t\e$B!!\e(B")
3527                (if (bolp)
3528                    ;; \e$B9TF,$@$C$?$i0l9TA0$N9TKv$^$GLa$k$,!"\e(Barg \e$B$O8:$i$5$J$$!#\e(B
3529                    (backward-char 1)
3530                  (backward-char 1)
3531                  (setq arg (1- arg)))))
3532          ;; \e$B0z?t$J$7!#\e(B
3533          (let ((limit
3534                 (if (not skk-allow-spaces-newlines-and-tabs)
3535                     (skk-save-point (beginning-of-line) (point))
3536                   (point-min)))
3537                ;; \e$B!2!1!0!/!.!-!,!+!*!)!(!'!&!%!$!#\e(B
3538                (unknown-chars-regexp
3539                 (if skk-allow-spaces-newlines-and-tabs
3540                     "[ \e$B!!\e(B\n\t\e$B!<!7!6!5!4!3\e(B]"
3541                   "[\e$B!!!<!7!6!5!4!3\e(B]"))
3542                type p)
3543            (save-match-data
3544              (skk-save-point
3545               (backward-char 1)
3546               (while (and (> (point) limit)
3547                           ;; unknown-chars-regexp \e$B$G$OJ8;z<oJL$,H=JL$G$-$J$$$N\e(B
3548                           ;; \e$B$G!"$=$NJ8;zNs$,B3$/8B$j%]%$%s%H$r%P%C%U%!$N@hF,\e(B
3549                           ;; \e$BJ}8~$XLa$9!#\e(B
3550                           (looking-at unknown-chars-regexp))
3551                 (backward-char 1))
3552               (setq type (skk-what-char-type))
3553               (if (eq type 'unknown)
3554                   (throw 'exit1 nil)
3555                 (skk-backward-and-set-henkan-point-1 type)
3556                 (setq p (point))
3557                 (if skk-allow-spaces-newlines-and-tabs
3558                     (while (and (> (point) limit) (bolp))
3559                       ;; 1 \e$B9T>e$N9TKv$X!#\e(B
3560                       (backward-char 1)
3561                       ;; \e$B%]%$%s%H$,H=JL$G$-$J$$J8;z<oJL$N>e$K$"$k4V$O\e(B
3562                       ;; backward \e$BJ}8~$X%]%$%s%H$rLa$9!#\e(B
3563                       ;;(while (and (> (point) limit)
3564                       ;;            (looking-at unknown-chars-regexp))
3565                       ;;  (backward-char 1))
3566                       (if;;(or
3567                           (> 0 (skk-backward-and-set-henkan-point-1 type))
3568                           ;;(eq (skk-what-char-type) type))
3569                           (setq p (point))))))))
3570            (goto-char p)
3571            (skip-chars-forward unknown-chars-regexp)))
3572        (skk-set-henkan-point-subr)))))
3573
3574 (defun skk-backward-and-set-henkan-point-1 (type)
3575   ;; skk-backward-and-set-henkan-point \e$B$N%5%V%k!<%A%s!#\e(BCHAR \e$B$N<oN`$K1~$8$?J8;z\e(B
3576   ;; \e$B$r%9%-%C%W$7$F%P%C%U%!$N@hF,J}8~$XLa$k!#\e(B
3577   (cond ((eq type 'hiragana)
3578          ;; "\e$B$r\e(B" \e$B$NA0$G;_$^$C$?J}$,JXMx!)\e(B
3579          (skip-chars-backward "\e$B!3!4!5!6!7!<$s$!\e(B-\e$B$q\e(B"))
3580         ((eq type 'katakana)
3581          ;; "\e$B%r\e(B" \e$B$NA0$G;_$^$C$?J}$,JXMx!)\e(B
3582          (skip-chars-backward "\e$B!3!4!5!6!7!<%s%!\e(B-\e$B%q\e(B"))
3583         ((eq type 'jisx0208-latin)
3584          (skip-chars-backward "\e$B!!\e(B-\e$B#z\e(B"))
3585         ((eq type 'ascii)
3586          (skip-chars-backward " -~"))))
3587
3588 (defun skk-what-char-type ()
3589   ;; \e$B8=:_$N%]%$%s%H$K$"$kJ8;z$,$I$s$J<oN`$+$rH=JL$9$k!#\e(B
3590   (save-match-data
3591     (cond ((looking-at "[\e$B$!\e(B-\e$B$s\e(B]") 'hiragana)
3592           ((looking-at "[\e$B%!\e(B-\e$B%s\e(B]") 'katakana)
3593           ;; "\e$B!<\e(B" \e$B$r=|30$7$F$$$k\e(B ("\e$B!<\e(B" \e$B$O\e(B "\e$B!;\e(B" \e$B$H\e(B "\e$B!=\e(B" \e$B$N4V$KF~$C$F$$$k\e(B)\e$B!#\e(B
3594           ((looking-at "[\e$B!!\e(B-\e$B!;!=\e(B-\e$B#z\e(B]") 'jisx0208-latin)
3595           ((looking-at "[ -~]") 'ascii)
3596           (t 'unknown))))
3597
3598 (defun skk-set-henkan-point-subr (&optional arg)
3599   "\e$B$+$J$rF~NO$7$?8e$G!"%]%$%s%H$KJQ493+;O$N%^!<%/\e(B \(\e$B"&\e(B\) \e$B$rIU$1$k!#\e(B
3600 \e$B85!9$O$3$N4X?t$O\e(B skk-set-henkan-point \e$B$NFbIt4X?t$G$"$k!#\e(B"
3601   (interactive "*P")
3602   (skk-with-point-move
3603    (cancel-undo-boundary)
3604    (if skk-henkan-on (skk-kakutei)
3605      (skk-kana-cleanup));; XXX
3606    (if (not (skk-get-prefix skk-current-rule-tree))
3607        (insert-and-inherit "\e$B"&\e(B")
3608      (skk-erase-prefix)
3609      (insert-and-inherit "\e$B"&\e(B")
3610      (skk-set-marker skk-kana-start-point (point))
3611      (skk-insert-prefix))
3612    (setq skk-henkan-on t)
3613    (skk-set-marker skk-henkan-start-point (point))))
3614
3615 (defun skk-change-marker ()
3616   ;; "\e$B"&\e(B"\e$B$r\e(B"\e$B"'\e(B"\e$B$KJQ$($k!#\e(Bskk-henkan-active \e$B%U%i%0$r\e(B t \e$B$K$9$k!#\e(B
3617   (skk-save-point
3618    (goto-char (- skk-henkan-start-point skk-kanji-len))
3619    (if (looking-at "\e$B"&\e(B")
3620        (progn
3621          (cancel-undo-boundary)
3622          (let ((buffer-undo-list t))
3623              (insert-and-inherit "\e$B"'\e(B")
3624              (delete-char 1))
3625          (setq skk-henkan-active t))
3626      (skk-kakutei)
3627      (skk-error "\e$B"&$,$"$j$^$;$s\e(B" "It seems that you have deleted \e$B"&\e(B"))))
3628
3629 (defun skk-change-marker-to-white ()
3630   ;; "\e$B"'\e(B"\e$B$r\e(B"\e$B"&\e(B"\e$B$KJQ$($k!#\e(Bskk-henkan-active \e$B%U%i%0$r\e(B nil \e$B$K$9$k!#\e(B
3631   (skk-save-point
3632    (goto-char (- skk-henkan-start-point skk-kanji-len))
3633    (cancel-undo-boundary)
3634    (if (looking-at "\e$B"'\e(B")
3635        (let ((buffer-undo-list t))
3636          (insert-and-inherit "\e$B"&\e(B")
3637          (delete-char 1))
3638      (goto-char skk-henkan-start-point)
3639      (insert-and-inherit "\e$B"&\e(B")
3640      (skk-set-marker skk-henkan-start-point (point))
3641      (skk-message "\e$B"'$,$"$j$^$;$s\e(B" "It seems that you have deleted \e$B"'\e(B"))
3642    (setq skk-henkan-active nil)))
3643
3644 (defun skk-delete-henkan-markers (&optional nomesg)
3645   ;; \e$BJQ49;~$K%+%l%s%H%P%C%U%!$KI=$o$l$k\e(B `\e$B"&\e(B', `\e$B"'\e(B' \e$B%^!<%/$r>C$9!#\e(B
3646   (if (not (marker-position skk-henkan-start-point))
3647       nil
3648     (save-match-data
3649       (skk-save-point
3650        (goto-char (- skk-henkan-start-point skk-kanji-len))
3651        (if skk-henkan-active
3652            (progn
3653              (and skk-use-face (skk-henkan-face-off))
3654              (if (looking-at "\e$B"'\e(B")
3655                  (delete-char 1)
3656                (or nomesg
3657                    (skk-message "\e$B"'$,$"$j$^$;$s\e(B"
3658                                 "It seems that you have deleted \e$B"'\e(B"))))
3659          (if (looking-at "\e$B"&\e(B")
3660              (delete-char 1)
3661            (or nomesg
3662                (skk-message "\e$B"&$,$"$j$^$;$s\e(B"
3663                             "It seems that you have deleted \e$B"&\e(B"))))))))
3664
3665 (defun skk-delete-okuri-mark ()
3666   ;; \e$BAw$j2>L>F~NOCf$K%+%l%s%H%P%C%U%!$KI=$o$l$k\e(B `*' \e$B%^!<%/$r>C$7!"Aw$j2>L>4XO"\e(B
3667   ;; \e$B%U%i%0$r\e(B nil \e$B$K%;%C%H$9$k!#\e(B
3668   (if (or (not skk-okurigana)
3669           (not skk-okurigana-start-point)
3670           (not (markerp skk-okurigana-start-point))
3671           (not (marker-position skk-okurigana-start-point)))
3672       nil
3673     (skk-save-point
3674       (and (eq (char-after skk-okurigana-start-point) ?*) ; ?*
3675            (delete-region skk-okurigana-start-point
3676                           (1+ skk-okurigana-start-point)))
3677       (setq skk-okurigana nil
3678             skk-okuri-char nil
3679             skk-henkan-okurigana nil))))
3680
3681 ;;;; jisyo related functions
3682 (defun skk-purge-from-jisyo (&optional arg)
3683   "\e$B"'%b!<%I$G8=:_$N8uJd$r<-=q%P%C%U%!$+$i>C5n$9$k!#\e(B"
3684   (interactive "*P")
3685   (skk-with-point-move
3686    (if (and skk-henkan-active (not (string= skk-henkan-key "")))
3687        (if (not
3688             (yes-or-no-p (format
3689                           (if skk-japanese-message-and-error
3690                               "%s /%s/%s\e$B$r<-=q$+$i:o=|$7$^$9!#NI$$$G$9$+!)\e(B"
3691                             "Really purge \"%s /%s/%s\"?")
3692                           skk-henkan-key (skk-get-current-candidate-simply)
3693                           (if (and skk-henkan-okurigana
3694                                    (or skk-henkan-okuri-strictly
3695                                        skk-henkan-strict-okuri-precedence))
3696                               (concat
3697                                (if skk-japanese-message-and-error
3698                                    " (\e$BAw$j2>L>\e(B: "
3699                                  "(okurigana: ")
3700                                skk-henkan-okurigana
3701                                ") ")
3702                             " "))))
3703            nil
3704          ;; skk-henkan-start-point \e$B$+$i\e(B point \e$B$^$G:o=|$7$F$7$^$C$F$b!"JQ49D>8e\e(B
3705          ;; \e$B$K\e(B (\e$B%+!<%=%k$rF0$+$9$3$H$J$/\e(B) skk-purge-from-jisyo \e$B$r8F$Y$PLdBj$J$$\e(B
3706          ;; \e$B$,!"%+!<%=%k$,0c$&>l=j$X0\F0$7$F$$$?>l9g$O!":o=|$9$Y$-$G$J$$$b$N$^\e(B
3707          ;; \e$B$G:o=|$7$F$7$^$&2DG=@-$,$"$k!#$=$3$G!"Aw$j2>L>$,$"$l$P$=$ND9$5$r4^\e(B
3708          ;; \e$B$a$?\e(B end \e$B$r5a$a!":#2s$NJQ49$K4XO"$7$?8D=j$@$1$r@53N$K@Z$j<h$k$h$&$K\e(B
3709          ;; \e$B$9$k!#\e(B
3710          (let ((end (if skk-henkan-okurigana (+ (length skk-henkan-okurigana)
3711                                                 skk-henkan-end-point)
3712                       skk-henkan-end-point))
3713                (word (skk-get-current-candidate-simply (skk-numeric-p))))
3714            (skk-update-jisyo word 'purge)
3715            ;; Emacs 19.28 \e$B$@$H\e(B Overlay \e$B$r>C$7$F$*$+$J$$$H!"<!$K\e(B insert \e$B$5$l$k\e(B
3716            ;; skk-henkan-key \e$B$K2?8N$+\e(B Overlay \e$B$,$+$+$C$F$7$^$&!#\e(B
3717            (and skk-use-face (skk-henkan-face-off))
3718            (delete-region skk-henkan-start-point end)
3719            (skk-change-marker-to-white)
3720            (skk-kakutei))))))
3721
3722 (defun skk-save-jisyo (&optional quiet)
3723   "SKK \e$B$N<-=q%P%C%U%!$r%;!<%V$9$k!#\e(B
3724   \e$B%*%W%7%g%J%k0z?t$N\e(B QUIET \e$B$,\e(B non-nil \e$B$G$"$l$P!"<-=q%;!<%V;~$N%a%C%;!<%8$r=P$5$J\e(B
3725   \e$B$$!#\e(B"
3726   (interactive "P")
3727   (funcall skk-save-jisyo-function quiet))
3728
3729 (defun skk-save-jisyo-original (&optional quiet)
3730   ;;"SKK \e$B$N<-=q%P%C%U%!$r%;!<%V$9$k!#\e(B
3731   ;;\e$B%*%W%7%g%J%k0z?t$N\e(B QUIET \e$B$,\e(B non-nil \e$B$G$"$l$P!"<-=q%;!<%V;~$N%a%C%;!<%8$r=P$5$J\e(B
3732   ;;\e$B$$!#\e(B"
3733   (let* ((skk-jisyo (expand-file-name skk-jisyo))
3734          (jisyo-buffer (skk-get-jisyo-buffer skk-jisyo 'nomsg)))
3735     (if (or (not jisyo-buffer) (not (buffer-modified-p jisyo-buffer)))
3736         (if (not quiet)
3737             (progn
3738               (skk-message "SKK \e$B<-=q$rJ]B8$9$kI,MW$O$"$j$^$;$s\e(B"
3739                            "No need to save SKK jisyo")
3740               (sit-for 1)))
3741       (with-current-buffer jisyo-buffer
3742         (let ((inhibit-quit t)
3743               (tempo-file (skk-make-temp-jisyo)))
3744           (if (not quiet)
3745               (skk-message "SKK \e$B<-=q$rJ]B8$7$F$$$^$9\e(B..."
3746                            "Saving SKK jisyo..."))
3747           (skk-save-jisyo-1 tempo-file)
3748           (skk-check-size-and-do-save-jisyo tempo-file)
3749           ;; \e$B<-=q$N%;!<%V$K@.8y$7$F=i$a$F\e(B modified \e$B%U%i%C%0$r\e(B nil \e$B$K$9$k!#\e(B
3750           (set-buffer-modified-p nil)
3751           (setq skk-update-jisyo-count 0)
3752           (if (not quiet)
3753               (progn
3754                 (skk-message "SKK \e$B<-=q$rJ]B8$7$F$$$^$9\e(B...\e$B40N;!*\e(B"
3755                              "Saving SKK jisyo...done")
3756                 (sit-for 1)))
3757           (and (eq this-command 'save-buffers-kill-emacs)
3758                (skk-record-jisyo-data)))))))
3759
3760 (defun skk-save-jisyo-1 (file)
3761   (save-match-data
3762     (let (buffer-read-only)
3763       (goto-char (point-min))
3764       (if (re-search-forward "^;; okuri-ari entries.$" nil 'noerror)
3765           nil
3766         (skk-error
3767          "\e$BAw$j$"$j%(%s%H%j$N%X%C%@!<$,$"$j$^$;$s!*\e(B SKK \e$B<-=q$N%;!<%V$rCf;_$7$^$9\e(B"
3768          "Header line for okuri-ari entries is missing!  Stop saving SKK jisyo"))
3769       ;; \e$B$*$C!"%3%a%s%H%U%'%$%9$,\e(B $ \e$B$G=*$o$i$J$$$>\e(B > hilit19.el
3770       (if (re-search-forward "^;; okuri-nasi entries.$" nil 'noerror)
3771           nil
3772         (skk-error
3773          "\e$BAw$j$J$7%(%s%H%j$N%X%C%@!<$,$"$j$^$;$s\e(B \e$B!*\e(B SKK \e$B<-=q$N%;!<%V$rCf;_$7$^$9\e(B"
3774          "Header line for okuri-nasi entries is missing!  Stop saving SKK jisyo")))
3775     (write-region-as-coding-system
3776      (cond ((and skk-jisyo-code
3777        (and (symbolp skk-jisyo-code)
3778                  (or (coding-system-p skk-jisyo-code)
3779                      (and (fboundp 'find-coding-system)
3780                           (find-coding-system skk-jisyo-code)))))
3781             skk-jisyo-code)
3782            ((and skk-jisyo-code (stringp skk-jisyo-code))
3783             (cdr (assoc skk-jisyo-code skk-coding-system-alist)))
3784            (t (cdr (assoc "euc" skk-coding-system-alist))))
3785      1 (point-max) file nil 'nomsg)))
3786
3787 (defun skk-check-size-and-do-save-jisyo (new-file)
3788   (let ((new-size (nth 7 (file-attributes new-file)))
3789         old-size)
3790     (if (= new-size 0)
3791         (progn
3792           (delete-file new-file)
3793           (skk-error "SKK \e$B<-=q$,6u$K$J$C$F$$$^$9!*\e(B \e$B<-=q$N%;!<%V$rCf;_$7$^$9\e(B"
3794                      "Null SKK jisyo!  Stop saving jisyo")))
3795     (if (or (not skk-compare-jisyo-size-when-saving)
3796             ;; \e$B5l<-=q$H$N%5%$%:Hf3S$r9T$J$o$J$$!#\e(B
3797             (progn
3798               ;; (1)skk-jisyo \e$B$,$J$$$+!"\e(B
3799               ;; (2)new-file \e$B$H\e(B skk-jisyo \e$B$,F10l$N%5%$%:$+\e(B
3800               ;;    (skk-(aux-)large-jisyo \e$B$+$i?75,$NC18l$rFI$_9~$^$J$+$C$?$j!"\e(B
3801               ;;    \e$B?75,C18l$NEPO?$r9T$J$o$J$+$C$?>l9g$O%5%$%:$,F1$8\e(B)\e$B!"\e(B
3802               ;; (3)new-file \e$B$NJ}$,Bg$-$$\e(B
3803               ;; \e$B>l9g\e(B (\e$B>e5-$N\e(B 3 \e$BDL$j$G$"$l$P$$$:$l$b@5>o\e(B)\e$B!#\e(B
3804               (setq old-size (nth 7 (file-attributes skk-jisyo)))
3805               (or (not old-size)
3806                   (>= new-size old-size))))
3807         (skk-make-new-jisyo new-file)
3808       ;; yes-or-no-p \e$B$K2sEz$7!"\e(Bnewline \e$B$9$k$H!"\e(Bthis-command \e$B$,JQ$C$F$7$^$&!#\e(B
3809       (let (this-command this-command-char last-command last-command-char)
3810         (if (skk-yes-or-no-p
3811              (format
3812               "skk-jisyo \e$B$,\e(B %dbytes \e$B>.$5$/$J$j$^$9$,!"%;!<%V$7$FNI$$$G$9$+!)\e(B"
3813               (- old-size new-size))
3814              (format
3815               "New %s will be %dbytes smaller.  Save anyway?"
3816               skk-jisyo (- old-size new-size)))
3817             ;; \e$B$H$K$+$/%;!<%V!#\e(B
3818             (skk-make-new-jisyo new-file)
3819           ;; \e$B%;!<%V$H$j;_$a!#\e(B
3820           (delete-file new-file)
3821           (with-output-to-temp-buffer "*SKK warning*"
3822             (if skk-japanese-message-and-error
3823                 (progn
3824                   (princ "\e$B%;!<%V$7$h$&$H$9$k<-=q$N%5%$%:$,85$N$b$N$h$j$b>.$5$J$C$F$7$^$&$N$G!"\e(B")
3825                   (terpri)
3826                   (princ "\e$B%;!<%V$rESCf$GCf;_$7$^$7$?!#<-=q$N%5%$%:$,>.$5$/$J$C$?860x$K$ONc$(\e(B")
3827                   (terpri)
3828                   (princ "\e$B$P!"\e(B")
3829                   (terpri)
3830                   (terpri)
3831                   (princ "    \e$B!&\e(BM-x skk-purge-from-jisyo \e$B$r<B9T$7$?!#\e(B")
3832                   (terpri)
3833                   (terpri)
3834                   (princ "    \e$B!&\e(B.skk-jisyo \e$B$N4A;z%3!<%I$H!"\e(B\" *.skk-jisyo*\" \e$B%P%C%U%!$N4A;z%3!<%I\e(B")
3835                   (terpri)
3836                   (princ "      \e$B$,0[$J$C$F$$$k!#\e(B")
3837                   (terpri)
3838                   (terpri)
3839                   (princ "    \e$B!&\e(B\" *.skk-jisyo*\" \e$B%P%C%U%!$r<+J,$GJT=8$7$?!#\e(B")
3840                   (terpri)
3841                   (terpri)
3842                   (princ "\e$B$J$I$,9M$($i$l$^$9\e(B (\e$B:G=i$N\e(B 2 \e$B$D$,860x$G$"$l$P!"0[>o$G$O$"$j$^$;$s!#\e(B")
3843                   (terpri)
3844                   (princ "\e$B:G8e$N>l9g$O!"$"$J$?$,$I$N$h$&$JJT=8$r$7$?$+$K$h$j$^$9\e(B)\e$B!#860x$r3NG'\e(B")
3845                   (terpri)
3846                   (princ "\e$B8e!"?5=E$K<-=q$N%;!<%V$r9T$J$&$3$H$r$*4+$a$7$^$9!#\e(B")
3847                   (terpri)
3848                   (terpri)
3849                   (princ "\e$B85$N<-=q$r:FEYFI$_9~$`$K$O!"\e(B")
3850                   (terpri)
3851                   (terpri)
3852                   (princ "    M-x skk-reread-private-jisyo")
3853                   (terpri)
3854                   (terpri)
3855                   (princ "\e$B$r<B9T$7$F2<$5$$!#\e(B"))
3856               (princ "As size of your private JISYO to be saved is smaller than the")
3857               (terpri)
3858               (princ "original, we have stopped saving JISYO.  For example, the following")
3859               (terpri)
3860               (princ "condition makes a smaller private JISYO;")
3861               (terpri)
3862               (terpri)
3863               (princ "    (a)You executed M-x skk-purge-from-jisyo,")
3864               (terpri)
3865               (terpri)
3866               (princ "    (b)Kanji code of .skk-jisyo is different from the one of")
3867               (terpri)
3868               (princ "       \" *.skk-jisyo*\" buffer, or")
3869               (terpri)
3870               (terpri)
3871               (princ "    (c)You edited \" *.skk-jisyo*\" buffer manually.")
3872               (terpri)
3873               (terpri)
3874               (princ "The first two conditions are not strange, but the last one depends on")
3875               (terpri)
3876               (princ "how you edited JISYO.  We strongly recommend to save JISYO")
3877               (terpri)
3878               (princ "carefully after checking what causes this.")
3879               (terpri)
3880               (princ "If you want to reread your original private JISYO, type")
3881               (terpri)
3882               (terpri)
3883               (princ "    M-x skk-reread-private-jisyo")
3884               (terpri)))
3885           (skk-error "SKK \e$B<-=q$N%;!<%V$rCf;_$7$^$7$?!*\e(B"
3886                      "Stop saving SKK jisyo!"))))))
3887
3888 (defun skk-make-temp-jisyo ()
3889   ;; SKK \e$B8D?M<-=qJ]B8$N$?$a$N:n6HMQ$N%U%!%$%k$r:n$j!"%U%!%$%k$N%b!<%I$r\e(B
3890   ;; skk-jisyo \e$B$N$b$N$HF1$8$K@_Dj$9$k!#:n$C$?:n6HMQ%U%!%$%k$NL>A0$rJV$9!#\e(B
3891   (let ((tempo-name (skk-make-temp-file "skkdic")))
3892     (skk-create-file tempo-name)
3893     ;; temporary file \e$B$K\e(B remote file \e$B$r;XDj$9$k$3$H$J$IM-$jF@$J$$!)\e(B
3894     ;;(if (or
3895     ;;     ;; XEmacs has efs.el
3896     ;;     (eq skk-emacs-type 'xemacs)
3897     ;;     ;; ange-ftp.el does not have a wrapper to set-file-modes.
3898     ;;     (not (and (featurep 'ange-ftp) (boundp 'ange-ftp-name-format)
3899     ;;               (string-match (car ange-ftp-name-format) tempo-name))))
3900     (set-file-modes tempo-name  (file-modes skk-jisyo))
3901     ;;)
3902     tempo-name))
3903
3904 (defun skk-make-temp-file (prefix)
3905   (let ((dir
3906          (cond ((skk-file-exists-and-writable-p temporary-file-directory)
3907                 (expand-file-name temporary-file-directory))
3908                ((and (memq system-type '(ms-dos windows-nt))
3909                      (skk-file-exists-and-writable-p "a:/temp"))
3910                 ;; NEC PC-9800 series.
3911                 "a:/temp")
3912                (t (or (file-exists-p "~/tmp") (make-directory "~/tmp"))
3913                   (or (file-writable-p "~/tmp") (set-file-modes "~/tmp" 1023))
3914                   "~/tmp"))))
3915     (make-temp-name
3916      (concat dir
3917              (if (memq (skk-str-ref dir (1- (length dir))) '(?/ ?\\))
3918                  "" "/")
3919              prefix))))
3920
3921 (defun skk-make-new-jisyo (tempo-file)
3922   ;; TEMPO-FILE \e$B$r?75,$N\e(B skk-jisyo \e$B$K$9$k!#\e(Bskk-backup-jisyo \e$B$,\e(B non-nil \e$B$@$C$?\e(B
3923   ;; \e$B$i%P%C%/%"%C%W<-=q$r:n$k!#\e(B
3924   (if skk-backup-jisyo
3925       (progn
3926         (if (file-exists-p skk-backup-jisyo)
3927             (delete-file skk-backup-jisyo))
3928         (rename-file skk-jisyo skk-backup-jisyo))
3929     (delete-file skk-jisyo))
3930   (rename-file tempo-file skk-jisyo 'ok-if-already-exists))
3931
3932 (defun skk-reread-private-jisyo (&optional force)
3933   "\e$B%P%C%U%!$KFI$_9~$s$@8D?M<-=q$rGK4~$7!"%U%!%$%k$+$i%P%C%U%!$X:FFI$_9~$_$9$k!#\e(B
3934 \e$B%*%W%7%g%J%k0z?t$N\e(B FORCE \e$B$,\e(B non-nil \e$B$G$"$l$P!"GK4~$N3NG'$r$7$J$$!#\e(B"
3935   (interactive "P")
3936   (let ((buf (skk-get-jisyo-buffer skk-jisyo 'nomsg)))
3937     (if (and buf
3938              (or force
3939                  (skk-yes-or-no-p "\e$BJT=8Cf$N8D?M<-=q$rGK4~$7$^$9$+!)\e(B"
3940                                   "Discard your editing private JISYO?")))
3941         (progn
3942           (with-current-buffer buf
3943             (set-buffer-modified-p nil)
3944             (kill-buffer buf))
3945           (or
3946            (skk-get-jisyo-buffer skk-jisyo 'nomsg)
3947            (skk-error "\e$B8D?M<-=q$r:FFI$_9~$_$9$k$3$H$,$G$-$^$;$s!*\e(B"
3948                       "Cannot reread private JISYO!"))))))
3949
3950 (defun skk-record-jisyo-data ()
3951   ;; \e$B<-=q%G!<%?$r<h$j!"\e(BEmacs \e$B$N=*N;$N:]$G$"$l$P!"$=$N%G!<%?$r\e(B
3952   ;; skk-record-file \e$B$KJ]B8$7!"$=$l0J30$G$"$l$P!"$=$l$r%(%3!<$9$k!#\e(B
3953   (if (or (not skk-keep-record) (> 1 skk-kakutei-count))
3954       nil
3955     (with-temp-file skk-record-file
3956       (insert-file-contents skk-record-file)
3957       (goto-char (point-min))
3958       (insert
3959        (format
3960         "%s  \e$BEPO?\e(B: %3d  \e$B3NDj\e(B: %4d  \e$B3NDjN(\e(B: %3d%%  \e$B8l?t\e(B:%6d\n"
3961         (current-time-string)
3962         skk-touroku-count skk-kakutei-count
3963         (/ (* 100 (- skk-kakutei-count skk-touroku-count))
3964            skk-kakutei-count)
3965         (cond ((featurep 'skk-rdbms)
3966                ;; RDBMS \e$B$r;H$($P$b$C$H6=L#?<$$E}7W$,<h$l$k$+$b$7$l$J$$\e(B
3967                ;; \e$B$,!"$H$j$"$($:8l?t$@$1?t$($FF~$l$F$*$/!#\e(B
3968                (skk-rdbms-count-jisyo-candidates skk-rdbms-private-jisyo-table))
3969               (skk-count-private-jisyo-candidates-exactly
3970                (skk-count-jisyo-candidates (expand-file-name skk-jisyo)))
3971                ;; 1 \e$B9T\e(B 1 \e$B8uJd$H$_$J$9!#\e(B
3972               (t (with-current-buffer (skk-get-jisyo-buffer skk-jisyo 'nomsg)
3973                    (- (count-lines (point-min) (point-max)) 2)))))))
3974     (setq skk-touroku-count 0 skk-kakutei-count 0)))
3975
3976 (defun skk-count-jisyo-candidates (file-or-table)
3977   "SKK \e$B<-=q$N8uJd?t$r?t$($k!#\e(B"
3978   (interactive
3979    (list (cond ((eq skk-count-jisyo-candidates-function
3980                     'skk-count-jisyo-candidates-original)
3981                 (read-file-name
3982                  (format "Jisyo file: (default: %s) " skk-jisyo)
3983                  default-directory skk-jisyo 'confirm))
3984                ((eq skk-count-jisyo-candidates-function
3985                     'skk-rdbms-count-jisyo-candidates)
3986                 ;; \e$B%G!<%?%Y!<%9%U%!%$%k$rD>@\%U%!%$%kL>$G;XDj$G$-$k\e(B
3987                 ;; permission \e$B$,$J$$>l9g$,B?$$$h$M\e(B...\e$B!#\e(B
3988                 ;;(read-file-name
3989                 ;; (format "Jisyo table: (default: %s) "
3990                 ;;       skk-rdbms-private-jisyo-table))
3991                 skk-rdbms-private-jisyo-table))))
3992   ;; mule@emacs19.31 \e$B$@$H2<5-$N$h$&$K$9$k$H\e(B (`\e$B%!\e(B' \e$B$,860x$N$h$&\e(B) \e$B2?8N$+\e(B
3993   ;; default-directory \e$B$NKvHx$K2~9T$,IU$/!#\e(B
3994   ;; \e$BDL>o$O5$$,IU$+$J$$$,!"\e(Brsz-mini.el \e$B$r;H$C$F\e(B resize-minibuffer-mode \e$B$r\e(B
3995   ;; non-nil \e$B$K$7$F$$$k$HITMW$J\e(B 2 \e$B9TL\$,=P8=$9$k!#\e(B
3996   ;; (interactive "f\e$B<-=q%U%!%$%k\e(B: ")
3997   (let ((count (funcall skk-count-jisyo-candidates-function file-or-table)))
3998     (if (interactive-p)
3999         (message (if (= count 1) "%d candidate" "%d candidates") count)
4000       count)))
4001
4002 (defun skk-count-jisyo-candidates-original (file)
4003   ;;"SKK \e$B<-=q$N8uJd?t$r?t$($k!#\e(B
4004   ;;`[' \e$B$H\e(B `]' \e$B$K0O$^$l$?Aw$j2>L>Kh$N%V%m%C%/Fb$O?t$($J$$!#\e(B"
4005   (with-current-buffer (find-file-noselect file)
4006     (save-match-data
4007       (let ((count 0)
4008             (min (point-min))
4009             (max (and (interactive-p) (point-max)))
4010             (interactive-p (interactive-p)))
4011         (goto-char min)
4012         (if (or
4013              ;; \e$B$3$A$i$O\e(B skk-save-point \e$B$r;H$o$:!"%]%$%s%H$r0\F0$5$;$k!#\e(B
4014              (not (re-search-forward "^;; okuri-ari entries.$" nil t nil))
4015              (not
4016               (skk-save-point
4017                 (re-search-forward "^;; okuri-nasi entries.$" nil t nil))))
4018             (skk-error "\e$B$3$N%U%!%$%k$O\e(B SKK \e$B<-=q$G$O$"$j$^$;$s\e(B"
4019                        "This file is not a SKK dictionary"))
4020         (beginning-of-line)
4021         (while (looking-at ";")
4022           (forward-line 1)
4023           (beginning-of-line))
4024         (search-forward " " nil t)
4025         (while (search-forward "/" nil t)
4026           (cond ((or (eolp) (looking-at "\\["))
4027                  (forward-line 1)
4028                  (beginning-of-line)
4029                  (while (looking-at ";")
4030                    (forward-line 1)
4031                    (beginning-of-line))
4032                  (search-forward " " nil t))
4033                 (t
4034                  (setq count (1+ count))))
4035           (if interactive-p
4036               (message "Counting jisyo candidates...%3d%% done"
4037                        (/ (* 100 (- (point) min)) max))))
4038         count))))
4039
4040 (defun skk-create-file (file &optional japanese english)
4041   ;; FILE \e$B$,$J$1$l$P!"\e(BFILE \e$B$H$$$&L>A0$N6u%U%!%$%k$r:n$k!#\e(B
4042   ;; \e$B%*%W%7%g%J%k0z?t$N\e(B JAPANESE/ENGLISH \e$B$r;XDj$9$k$H!"%U%!%$%k:n@.8e$=$N%a%C%;\e(B
4043   ;; \e$B!<%8$r%_%K%P%C%U%!$KI=<($9$k!#\e(B
4044   (let ((file (expand-file-name file)))
4045     (or (file-exists-p file)
4046         (progn
4047           (write-region 1 1 file nil 0)
4048           (if (or japanese english)
4049               (progn
4050                 (message (if skk-japanese-message-and-error
4051                              japanese english))
4052                 (sit-for 3)))))))
4053
4054 (defun skk-get-jisyo-buffer (file &optional nomsg)
4055   ;; FILE \e$B$r3+$$$F\e(B SKK \e$B<-=q%P%C%U%!$r:n$j!"%P%C%U%!$rJV$9!#\e(B
4056   ;; \e$B%*%W%7%g%J%k0z?t$N\e(B NOMSG \e$B$r;XDj$9$k$H%U%!%$%kFI$_9~$_$N:]$N%a%C%;!<%8$r\e(B
4057   ;; \e$BI=<($7$J$$!#\e(B
4058   (if file
4059       (let ((inhibit-quit t)
4060             (jisyo-buf (concat " *" (file-name-nondirectory file)
4061                                "*")))
4062         ;; \e$B<-=q%P%C%U%!$H$7$F%*!<%W%s$5$l$F$$$k$J$i!"2?$b$7$J$$!#\e(B
4063         (or (get-buffer jisyo-buf)
4064             (with-current-buffer (setq jisyo-buf (get-buffer-create jisyo-buf))
4065               (setq file (expand-file-name file))
4066               (buffer-disable-undo jisyo-buf)
4067               (auto-save-mode -1)
4068               ;; \e$B%o!<%-%s%0%P%C%U%!$N%b!<%I%i%$%s$O%"%C%W%G!<%H$5$l$J$$!)\e(B
4069               ;;(make-local-variable 'line-number-mode)
4070               ;;(make-local-variable 'column-number-mode)
4071               ;;(setq column-number-mode nil
4072               ;;      line-number-mode nil)
4073               (setq buffer-read-only nil
4074                     case-fold-search nil
4075                     ;; buffer-file-name \e$B$r\e(B nil \e$B$K$7$F$*$/$H\e(B M-x compile \e$B$J$I\e(B
4076                     ;; \e$BFbIt$G\e(B save-some-buffers \e$B$r%3!<%k$7$F$$$k%3%^%s%I$r\e(B
4077                     ;; \e$B;H$C$?$H$-$G$b%;!<%V$9$k$+$I$&$+$r?R$M$F$3$J$/$J$k!#\e(B
4078                     ;; buffer-file-name file
4079                     ;; cache-long-line-scans nil
4080                     ;; dabbrev \e$B$N%5!<%A$H$J$k%P%C%U%!$K$J$i$J$$$h$&$KB8:_$7$J\e(B
4081                     ;; \e$B$$%b!<%IL>$K$7$F$*$/!#<B32$N$"$kI{:nMQ$O$J$$$O$:!#\e(B
4082                     major-mode 'skk-jisyo-mode
4083                     mode-name "SKK dic")
4084               (or nomsg
4085                   (skk-message "SKK \e$B<-=q\e(B %s \e$B$r%P%C%U%!$KFI$_9~$s$G$$$^$9\e(B..."
4086                                "Inserting contents of %s ..."
4087                                (file-name-nondirectory file)))
4088               (let (enable-character-translation enable-character-unification)
4089                 (insert-file-contents-as-coding-system
4090                  (cond ((and skk-jisyo-code
4091                (and (symbolp skk-jisyo-code)
4092                              (or (coding-system-p skk-jisyo-code)
4093                                  (and (fboundp 'find-coding-system)
4094                                       (find-coding-system skk-jisyo-code)))))
4095                         skk-jisyo-code)
4096                        ((and skk-jisyo-code (stringp skk-jisyo-code))
4097                         (cdr (assoc skk-jisyo-code skk-coding-system-alist)))
4098                        (t (cdr (assoc "euc" skk-coding-system-alist))))
4099                  file))
4100               (or nomsg
4101                   (skk-message
4102                    "SKK \e$B<-=q\e(B %s \e$B$r%P%C%U%!$KFI$_9~$s$G$$$^$9\e(B...\e$B40N;!*\e(B"
4103                    "Inserting contents of %s ...done"
4104                    (file-name-nondirectory file)))
4105               (skk-setup-jisyo-buffer)
4106               (set-buffer-modified-p nil)
4107               jisyo-buf)))))
4108
4109 (defun skk-setup-jisyo-buffer ()
4110   ;; skk-jisyo \e$B$N<-=q%P%C%U%!$G!"\e(B
4111   ;; (1)\e$B6u%P%C%U%!$G$"$l$P!"?7$7$/%X%C%@!<$r:n$j!"\e(B
4112   ;; (2)\e$B<-=q%(%s%H%j$,$"$k4{B8$N<-=q%P%C%U%!$J$i$P!"%X%C%@!<$,@5$7$$$+$I$&$+$r\e(B
4113   ;;    \e$B%A%'%C%/$9$k!#\e(B
4114   ;;
4115   ;; skk-okuri-ari-min \e$B$H\e(B skk-okuri-nasi-min \e$B$N0LCV$rJQ99$7$?!#\e(B
4116   ;;                       \e$B"-\e(B \e$B?7$7$$\e(B skk-okuri-ari-min
4117   ;;   ;; okuri-ari entries.
4118   ;;   \e$B"+\e(B \e$B0JA0$N\e(B skk-okuri-ari-min
4119   ;;
4120   ;;   \e$B"-\e(B skk-okuri-ari-max \e$B"-\e(B \e$B?7$7$$\e(B skk-okuri-nasi-min
4121   ;;   ;; okuri-nasi entries.
4122   ;;   \e$B"+\e(B \e$B0JA0$N\e(B skk-okuri-nasi-min
4123   ;;
4124   ;;
4125   ;; \e$BJQ99A0$N0LCV$G$"$l$P!"2<5-$N$h$&$J6u<-=q$N>l9g!"\e(B
4126   ;;
4127   ;;   ;; okuri-ari entries.
4128   ;;   ;; okuri-nasi entries.
4129   ;;
4130   ;; skk-okuri-ari-min \e$B$H\e(B skk-okuri-ari-max \e$B$N%^!<%+!<$,=E$J$C$F$7$^$$!"\e(B
4131   ;; skk-okuri-ari-min \e$B$N0LCV$KA^F~$7$?%(%s%H%j$,\e(B skk-okuri-ari-max \e$B$N%^!<%+!<\e(B
4132   ;; \e$B$r8eJ}$K2!$7$d$i$J$$!#\e(B
4133   ;;
4134   ;; \e$B$3$N4X?t$N%*%j%8%J%k$NL>>N$O!"\e(Bj-check-jisyo \e$B$@$C$?$,!"\e(Bskk-check-jisyo \e$B$H\e(B
4135   ;; \e$B$$$&L>A0$K$9$k$H\e(B skk-tools.el \e$BFb$N4X?tL>$H=EJ#$9$k!#\e(B
4136   ;; case-fold-search \e$B$O!"<-=q%P%C%U%!$G$O>o$K\e(B nil\e$B!#\e(B
4137   (save-match-data
4138     (if (= (buffer-size) 0)
4139         ;; \e$B6u%P%C%U%!$@$C$?$i!"%X%C%@!<$N$_A^F~!#\e(B
4140         (insert ";; okuri-ari entries.\n" ";; okuri-nasi entries.\n"))
4141     (goto-char (point-min))
4142     (if (re-search-forward "^;; okuri-ari entries.$" nil 'noerror)
4143         ;; \e$B8GDj%]%$%s%H$J$N$G!"\e(B(point) \e$B$G==J,!#\e(B
4144         (setq skk-okuri-ari-min (point))
4145       (skk-error "\e$BAw$j$"$j%(%s%H%j$N%X%C%@!<$,$"$j$^$;$s!*\e(B"
4146                  "Header line for okuri-ari entries is missing!"))
4147     (if (re-search-forward "^;; okuri-nasi entries.$" nil 'noerror)
4148         (progn
4149           (beginning-of-line)
4150           ;; \e$B6&M-<-=q$J$i8GDj%]%$%s%H$G$bNI$$$N$@$,!"<-=q%P%C%U%!$GJT=8$r9T\e(B
4151           ;; \e$B$J$C$?$H$-$N$3$H$rG[N8$7$F%^!<%+!<$K$7$F$*$/!#\e(B
4152           (setq skk-okuri-ari-max (point-marker))
4153           (forward-line 1)
4154           (backward-char 1)
4155           (setq skk-okuri-nasi-min (point-marker)))
4156       (skk-error "\e$BAw$j$J$7%(%s%H%j$N%X%C%@!<$,$"$j$^$;$s!*\e(B"
4157                  "Header line for okuri-nasi entries is missing!"))))
4158
4159 (defun skk-search ()
4160   ;; skk-current-search-prog-list \e$B$NMWAG$K$J$C$F$$$k%W%m%0%i%`$rI>2A$7$F!"\e(B
4161   ;; skk-henkan-key\e$B$r%-!<$K$7$F8!:w$r9T$&!#\e(B
4162   (let (l)
4163     (while (and (null l) skk-current-search-prog-list)
4164       (setq l (eval (car skk-current-search-prog-list))
4165             skk-current-search-prog-list (cdr skk-current-search-prog-list)))
4166     l))
4167
4168 (defun skk-search-jisyo-file (file limit &optional nomsg)
4169   ;; SKK \e$B<-=q%U%)!<%^%C%H$N\e(B FILE \e$B$G\e(B skk-henkan-key \e$B$r%-!<$K$7$F8!:w$r9T$&!#\e(B
4170   ;; \e$B8!:w%j!<%8%g%s$,\e(B LIMIT \e$B0J2<$K$J$k$^$G%P%$%J%j%5!<%A$r9T$$!"$=$N8e%j%K%"\e(B
4171   ;; \e$B%5!<%A$r9T$&!#\e(B
4172   ;; LIMIT \e$B$,\e(B 0 \e$B$G$"$l$P!"%j%K%"%5!<%A$N$_$r9T$&!#\e(B
4173   ;; \e$B<-=q$,%=!<%H$5$l$F$$$J$$$N$G$"$l$P!"\e(BLIMIT \e$B$r\e(B 0 \e$B$9$kI,MW$,$"$k!#\e(B
4174   ;; \e$B%*%W%7%g%J%k0z?t$N\e(B NOMSG \e$B$,\e(B non-nil \e$B$G$"$l$P\e(B skk-get-jisyo-buffer \e$B$N%a%C\e(B
4175   ;; \e$B%;!<%8$r=PNO$7$J$$$h$&$K$9$k!#\e(B
4176   (let ((jisyo-buffer (skk-get-jisyo-buffer file nomsg)))
4177     (if jisyo-buffer
4178         ;; skk-henkan-key \e$B$H\e(B skk-henkan-okurigana \e$B$O%+%l%s%H%P%C%U%!$N%m!<%+%k\e(B
4179         ;; \e$BCM!#\e(B
4180         (let ((okurigana (or skk-henkan-okurigana skk-okuri-char))
4181               (midasi
4182                (if skk-use-numeric-conversion
4183                    ;; skk-henkan-key \e$B$,\e(B nil \e$B$N$3$H$,$"$k!#2?8N\e(B?
4184                    (skk-num-compute-henkan-key skk-henkan-key)
4185                  skk-henkan-key))
4186               (henkan-buffer (current-buffer))
4187               entry-list entry)
4188           (with-current-buffer jisyo-buffer
4189             (setq skk-henkan-key midasi
4190                   entry-list (skk-search-jisyo-file-1 okurigana limit))
4191             (if entry-list
4192                 (progn
4193                   (setq entry
4194                         (cond ((and okurigana skk-henkan-okuri-strictly)
4195                                ;; \e$BAw$j2>L>$,F10l$N%(%s%H%j$N$_$rJV$9!#\e(B
4196                                (nth 2 entry-list))
4197                               ((and okurigana skk-henkan-strict-okuri-precedence)
4198                                ;; \e$BAw$j2>L>$,F10l$N%(%s%H%j$N$&$7$m$K!"\e(B
4199                                ;; \e$B$=$NB>$N%(%s%H%j$r$D$1$F$+$($9!#\e(B
4200                                (skk-nunion (nth 2 entry-list) (car entry-list)))
4201                               (t (car entry-list))))
4202                   (and skk-search-end-function
4203                        (setq entry (funcall skk-search-end-function
4204                                             henkan-buffer midasi okurigana entry)))
4205                   entry)))))))
4206
4207 (defun skk-search-jisyo-file-1 (okurigana limit &optional delete)
4208   ;; skk-search-jisyo-file \e$B$N%5%V%k!<%A%s!#\e(Bskk-compute-henkan-lists \e$B$r;HMQ$7!"\e(B
4209   ;; \e$B8+=P$78l$K$D$$$F$N%(%s%H%j$N>pJs$rJV$9!#\e(B
4210   ;; DELETE \e$B$,\e(B non-nil \e$B$G$"$l$P!"\e(BMIDASI \e$B$K%^%C%A$9$k%(%s%H%j$r:o=|$9$k!#\e(B
4211   (let ((key (concat "\n" skk-henkan-key " /"))
4212         min max size p)
4213     (save-match-data
4214       ;; skk-okuri-ari-min \e$B$H\e(B skk-okuri-ari-max \e$B$O<-=q%P%C%U%!$N%m!<%+%kCM!#\e(B
4215       (if okurigana
4216           (setq min skk-okuri-ari-min
4217                 max skk-okuri-ari-max)
4218         (setq min skk-okuri-nasi-min
4219               max (point-max)))
4220       (if (> limit 0)
4221           (while (progn (setq size (- max min)) (> size limit))
4222             (goto-char (+ min (/ size 2)))
4223             (beginning-of-line)
4224             (setq p (point))
4225             ;; \e$BAw$j$"$j$J$i5U=g$KHf3S$r9T$J$&!#\e(B
4226             (if
4227                 (if okurigana
4228                     (string< (buffer-substring-no-properties
4229                               p (1- (search-forward  " ")))
4230                              skk-henkan-key)
4231                   (string< skk-henkan-key
4232                            (buffer-substring-no-properties
4233                             p (1- (search-forward " ")))))
4234                 (setq max p)
4235               (setq min p))))
4236       (goto-char min)
4237       ;; key \e$B$,8!:w3+;OCOE@$K$"$C$?>l9g$G$b8!:w2DG=$J$h$&$K0lJ8;zLa$k!#\e(Bkey \e$B$,\e(B
4238       ;; \e$B$=$N@hF,ItJ,$K\e(B "\n" \e$B$r4^$s$G$$$k$3$H$KCm0U!#\e(B
4239       (or (bobp) (backward-char 1))
4240       ;; case-fold-search \e$B$O!"<-=q%P%C%U%!$G$O>o$K\e(B nil\e$B!#\e(B
4241       (if (search-forward key max 'noerror)
4242           (prog1
4243               (skk-compute-henkan-lists okurigana)
4244             (if delete
4245                 (progn
4246                   (beginning-of-line)
4247                   (delete-region (point)
4248                                  (progn (forward-line 1) (point))))))))))
4249
4250
4251 (defun skk-compute-henkan-lists (okurigana)
4252   ;; \e$B<-=q%(%s%H%j$r\e(B 4 \e$B$D$N%j%9%H$KJ,2r$9$k!#\e(B
4253   ;;
4254   ;; \e$BAw$j$J$7\e(B (\e$BNc$($P!"<-=q%(%s%H%j\e(B "\e$B$F$s$5$$\e(B /\e$BE>:\\e(B/\e$BE7:R\e(B/\e$BE7:M\e(B/" \e$B$N=hM}\e(B)
4255   ;; entry1 := ("\e$BE>:\\e(B" "\e$BE7:R\e(B" "\e$BE7:M\e(B") == \e$BA4%(%s%H%j\e(B
4256   ;; entry2 := nil
4257   ;; entry3 := nil
4258   ;; entry4 := nil
4259   ;;
4260   ;; \e$BAw$j$"$j\e(B (\e$BNc$($P!"!V5c$/!W$NJQ49$r9T$C$?>l9g$N!"<-=q%(%s%H%j\e(B
4261   ;;           "\e$B$J\e(Bk /\e$BK4\e(B/\e$BL5\e(B/\e$BLD\e(B/\e$B5c\e(B/[\e$B$/\e(B/\e$BL5\e(B/\e$BLD\e(B/\e$B5c\e(B/]/[\e$B$-\e(B/\e$BK4\e(B/]/" \e$B$N=hM}\e(B)
4262   ;; entry1 := ("\e$BK4\e(B" "\e$BL5\e(B" "\e$BLD\e(B" "\e$B5c\e(B")  == \e$B4A;zItJ,$NA4%(%s%H%j\e(B
4263   ;; entry2 := ("[\e$B$/\e(B")                == \e$BB>$NAw$j2>L>$r;H$&4A;z%(%s%H%j\e(B (\e$B$"$l\e(B
4264   ;;                                     \e$B$P\e(B) + \e$B:#2s$NJQ49$NAw$j2>L>ItJ,\e(B
4265   ;; entry3 := ("\e$BL5\e(B" "\e$BLD\e(B" "\e$B5c\e(B")       == \e$B:#2s$NJQ49$NAw$j2>L>$r;H$&2DG=@-$N\e(B
4266   ;;                                     \e$B$"$kA44A;z%(%s%H%j\e(B
4267   ;; entry4 := ("]" "[\e$B$-\e(B" "\e$BK4\e(B" "]")   == \e$BB>$NAw$j2>L>$r;H$&4A;z%(%s%H%j\e(B (\e$B;D\e(B
4268   ;;                                     \e$B$j!#$"$l$P\e(B)
4269   ;;
4270   ;;   * "[" \e$B$OD>8e$KB3$/$R$i$,$J$rAw$j2>L>$K;}$D4A;z$N%(%s%H%j$N=i$^$j$rI=$7!"\e(B
4271   ;;     "]" \e$B$O!"3:Ev$NAw$j2>L>%0%k!<%W$N=*$j$r<($9!#\e(B
4272   ;;
4273   ;; \e$B$3$N4X?t$O!"JQ49;~$H!"3NDjD>8e$N<-=q$N%"%C%W%G!<%H;~$N\e(B 2 \e$BEY8F$P$l$k\e(B
4274   ;; (\e$BJQ49;~$K8!:w$r9T$C$?<-=q$,!"\e(Bskk-jisyo \e$B$H$O8B$i$J$$$N$G!"\e(B2 \e$BEY7W;;$;$6$k\e(B
4275   ;; \e$B$rF@$J$$\e(B)\e$B!#\e(B
4276   ;;
4277   ;; \e$BJQ49;~$O!"\e(Bskk-henkan-okuri-strictly \e$B$,\e(B non-nil \e$B$G$"$l$P!"\e(B
4278   ;; \e$B7W;;7k2L$N\e(B entry3\e$B$r!"\e(Bskk-henkan-okuri-strictly \e$B$,\e(B nil \e$B$G$"$C$F\e(B
4279   ;; \e$B$+$D\e(B skk-henkan-strict-okuri-precedence \e$B$,\e(B non-nil \e$B$"$l$P\e(B
4280   ;; (skk-nunion entry3 entry1) \e$B$r<h$j=P$9!#\e(B
4281   ;; \e$B$U$?$D$NJQ?t$,$H$b$K\e(B nil \e$B$N>l9g$O\e(B entry1 \e$B$r<h$j=P$9!#\e(B
4282   (if (not okurigana)
4283       (list (split-string (buffer-substring-no-properties
4284                            (point) (progn (end-of-line) (1- (point))))
4285                           "/") nil nil nil)
4286     (save-match-data
4287       (let ((stage 1) (q1 (queue-create)) (q2 (queue-create))
4288             (q3 (queue-create)) (q4 (queue-create))
4289             (okuri-key (concat "\[" okurigana)) item headchar)
4290         (catch 'exit
4291           (while (not (eolp))
4292             (setq item (buffer-substring-no-properties
4293                         (point)
4294                         (1- (search-forward "/")))
4295                   headchar (if (string= item "") (int-char 0) (skk-str-ref item 0)))
4296             (cond ((and (eq headchar ?\[) (<= stage 2))
4297                    (if (string= item okuri-key)
4298                        (progn (queue-enqueue q2 item)
4299                               (setq stage 3))
4300                      (setq stage 2)
4301                      (queue-enqueue q2 item)))
4302                   ((= stage 1)
4303                    (queue-enqueue q1 item))
4304                   ((= stage 2)
4305                    (queue-enqueue q2 item))
4306                   ((= stage 3)
4307                    (if (eq headchar ?\]) ; ?\]
4308                        (progn (setq stage 4)
4309                               (queue-enqueue q4 item))
4310                      (queue-enqueue q3 item)))
4311                   ((= stage 4)
4312                    (queue-enqueue q4 item)))))
4313         ;;        entry1          entry2        entry3          entry4
4314         (list (queue-all q1) (queue-all q2) (queue-all q3) (queue-all q4))))))
4315
4316 (defun skk-nunion (x y)
4317   ;; X \e$B$H\e(B Y \e$B$NOB=89g$r:n$k!#Ey$7$$$+$I$&$+$NHf3S$O!"\e(Bequal \e$B$G9T$o$l$k!#\e(BX \e$B$K\e(B Y
4318   ;; \e$B$rGK2uE*$KO"@\$9$k!#\e(B
4319   (cond ((null x) y)
4320         ((null y) x)
4321         (t (let ((list2 y))
4322              (while list2
4323                (let* ((list1 (cons nil x))
4324                       (oldlist1 list1))
4325                  (catch 'found
4326                    (while (cdr list1)
4327                      (if (equal (car (cdr list1)) (car list2))
4328                          (throw 'found nil)
4329                        (setq list1 (cdr list1))))
4330                    (setcdr list1 (list (car list2)))
4331                    (setq x (cdr oldlist1)))
4332                (setq list2 (cdr list2)))
4333               ))
4334            x)))
4335
4336 (defun skk-search-kakutei-jisyo-file (file limit &optional nomsg)
4337   ;; \e$B<-=q%U%!%$%k$rC5$7!"8uJd$r%j%9%H$GJV$9!#\e(B
4338   ;; \e$B8uJd$r8+$D$1$?>l9g$O!"Bg0hJQ?t\e(B skk-kakutei-flag \e$B$K\e(B non-nil \e$B$rBeF~$9$k!#\e(B
4339   ;; \e$B8uJd$,8+$D$+$i$J$+$C$?>l9g$O!"\e(Bnil \e$B$rJV$9!#\e(B
4340   (setq skk-kakutei-flag (skk-search-jisyo-file file limit nomsg)))
4341
4342 (defun skk-update-jisyo (word &optional purge)
4343   (funcall skk-update-jisyo-function word purge))
4344
4345 (defun skk-update-jisyo-original (word &optional purge)
4346   ;; WORD \e$B$,<!$NJQ49;~$K:G=i$N8uJd$K$J$k$h$&$K!"%W%i%$%Y!<%H<-=q$r99?7$9$k!#\e(B
4347   ;; PURGE \e$B$,\e(B non-nil \e$B$G\e(B WORD \e$B$,6&M-<-=q$K$"$k%(%s%H%j$J$i\e(B skk-ignore-dic-word
4348   ;; \e$B4X?t$G%/%)!<%H$7$?%(%s%H%j$r%W%i%$%Y!<%H<-=q$K:n$j!"<!$NJQ49$+$i=PNO$7$J\e(B
4349   ;; \e$B$$$h$&$K$9$k!#\e(B
4350   ;; WORD \e$B$,6&M-<-=q$K$J$1$l$P!"%W%i%$%Y!<%H<-=q$N<-=q%(%s%H%j$+$i:o=|$9$k!#\e(B
4351   ;;
4352   ;; SKK 9.x \e$B$h$j!"%W%i%$%Y!<%H<-=q$N%(%s%H%j$NA^F~$NJ}K!$rJQ99$7$?\e(B (9.3 \e$B$N$_\e(B
4353   ;; \e$B$ONc30\e(B)\e$B!#\e(B
4354   ;;
4355   ;; \e$B!ZJQ99A0![\e(B
4356   ;;         ;; okuri-ari entries.
4357   ;;  \e$B8+%-\e(B   \e$B$o$k\e(Bk /\e$B0-\e(B/[\e$B$+\e(B/\e$B0-\e(B/]/[\e$B$/\e(B/\e$B0-\e(B/]/
4358   ;;  \e$B=P!<\e(B   \e$B$o$k\e(Bi /\e$B0-\e(B/[\e$B$$\e(B/\e$B0-\e(B/]/
4359   ;;  \e$B$7$K\e(B   \e$B$o$?\e(Bs /\e$BEO\e(B/[\e$B$5\e(B/\e$BEO\e(B/]/[\e$B$;\e(B/\e$BEO\e(B/]/
4360   ;;  \e$B8l9_\e(B   \e$B$o$9\e(Br /\e$BK:\e(B/[\e$B$l\e(B/\e$BK:\e(B/]/
4361   ;;  \e$B$r=g\e(B   \e$B$o$+\e(Bt /\e$BJ,\e(B/\e$BH=\e(B/[\e$B$C$?\e(B/\e$BJ,\e(B/\e$BH=\e(B/]/[\e$B$C$F\e(B/\e$BJ,\e(B/]/
4362   ;;   \e$B"-\e(B     .....
4363   ;;         \e$B$"\e(Bi /\e$B9g\e(B/[\e$B$$\e(B/\e$B9g\e(B/]/
4364   ;;         ;; okuri-nasi entries.
4365   ;;  \e$BJQ$G\e(B   \e$B$8$g$&$?$$\e(B /\e$B>uBV\e(B/
4366   ;;  \e$B49>:\e(B   \e$B$=$&$K$e$&\e(B /\e$BA^F~\e(B/
4367   ;;  \e$B=g=g\e(B   \e$B$+$J\e(B /\e$B2>L>\e(B/
4368   ;;   \e$B"-\e(B    ...
4369   ;;         ...
4370   ;;
4371   ;; \e$B!ZJQ998e![\e(B
4372   ;;         ;; okuri-ari entries.
4373   ;;  \e$BJQ$G\e(B   \e$B$G\e(Bt /\e$B=P\e(B/[\e$B$F\e(B/\e$B=P\e(B/]/[\e$B$?\e(B/\e$B=P\e(B/]/
4374   ;;  \e$B49>:\e(B   \e$B$D\e(Bi /\e$BIU\e(B/[\e$B$$\e(B/\e$BIU\e(B/]/
4375   ;;  \e$B=g=g\e(B   \e$B$1\e(Bs /\e$B>C\e(B/[\e$B$9\e(B/\e$B>C\e(B/]/[\e$B$7\e(B/\e$B>C\e(B/]/[\e$B$;\e(B/\e$B>C\e(B/]/[\e$B$5\e(B/\e$B>C\e(B/]/
4376   ;;   \e$B"-\e(B    \e$B$+$(\e(Bs /\e$BJV\e(B/[\e$B$7\e(B/\e$BJV\e(B/]/[\e$B$9\e(B/\e$BJV\e(B/]/[\e$B$5\e(B/\e$BJV\e(B/]/[\e$B$;\e(B/\e$BJV\e(B/]/
4377   ;;         ...
4378   ;;         ...
4379   ;;         \e$B$J$,\e(Bs /\e$BD9\e(B/\e$BN.\e(B/[\e$B$7\e(B/\e$BN.\e(B/]/[\e$B$5\e(B/\e$BD9\e(B/]/[\e$B$=\e(B/\e$BN.\e(B/]/
4380   ;;         ;; okuri-nasi entries.
4381   ;;  \e$BJQ$G\e(B   \e$B$8$g$&$?$$\e(B /\e$B>uBV\e(B/
4382   ;;  \e$B49>:\e(B   \e$B$=$&$K$e$&\e(B /\e$BA^F~\e(B/
4383   ;;  \e$B=g=g\e(B   \e$B$+$J\e(B /\e$B2>L>\e(B/
4384   ;;   \e$B"-\e(B    ...
4385   ;;         ...
4386   ;;
4387   ;; skk-auto-okuri-process \e$B$,\e(B non-nil \e$B$N$H$-$K!"\e(B(j-okuri-search \e$B2~$a\e(B)
4388   ;; skk-okuri-search \e$B$O8+=P$78l$ND9$$=g$K8uJd$rJV$9I,MW$,$"$k!#\e(B
4389   ;; SKK 8.6 \e$B$^$G$O!"\e(Bskk-okuri-search \e$B$,\e(B j-okuri-ari-min \e$B$+$i\e(B j-okuri-ari-max
4390   ;; \e$B$^$G$r=g$KC5$7!"8+$D$1$?$b$N=g$K8uJd$rJV$9$?$a$K%W%i%$%Y!<%H<-=q$,8+=P$7\e(B
4391   ;; \e$B8l$r%-!<$H$7$F9_=g$K%=!<%H$5$l$F$$$kI,MW$,$"$C$?!#\e(B
4392   ;; SKK 9.x \e$B$G$O!"\e(Bskk-okuri-search \e$B$,!"8+IU$1$?8uJd$r8+=P$78l$r%-!<$H$7$F>:=g\e(B
4393   ;; \e$B$K%=!<%H$7$FJV$9$?$a!"%W%i%$%Y!<%H<-=q$N%=!<%H$OI,MW$G$J$$!#$h$C$F!":G8e\e(B
4394   ;; \e$B$KJQ49$7$?$b$N$r\e(B (j-okuri-ari-min \e$B2~$a\e(B) skk-okuri-ari-min \e$B$N0LCV$KA^F~$9\e(B
4395   ;; \e$B$k!#\e(B
4396   ;;
4397   (let ((jisyo-buffer (skk-get-jisyo-buffer skk-jisyo 'nomsg))
4398         (midasi
4399          (if skk-use-numeric-conversion
4400              (skk-num-compute-henkan-key skk-henkan-key)
4401            skk-henkan-key))
4402         (henkan-buffer (current-buffer)))
4403     (if jisyo-buffer
4404         (let ((inhibit-quit t) buffer-read-only old-entry okurigana)
4405           (if (> skk-okuri-index-min -1)
4406               (setq word (skk-remove-common word)
4407                     midasi skk-henkan-key))
4408           (setq okurigana (or skk-henkan-okurigana skk-okuri-char))
4409           (with-current-buffer jisyo-buffer
4410             ;; \e$B4{B8%(%s%H%j$r8!:w8e>C5n$9$k!#A^F~$9$Y$-%(%s%H%j$,\e(B entry1 \e$B$K\e(B 1
4411             ;; \e$B$D$7$+$J$/!"\e(Bword \e$B$HF1$8J8;z$G$"$C$F$b!"$$$C$?$s>C$7$F$=$N%(%s%H\e(B
4412             ;; \e$B%j$r\e(B min \e$B%]%$%s%H$K0\F0$5$;$J$1$l$P$J$i$J$$\e(B (\e$BFI$_$NJd40$r9T$&$H\e(B
4413             ;; \e$B$-$O!"\e(Bmin \e$B%]%$%s%H$+$i8+=P$7$rC5$9$?$a!"?7$7$$8+=P$7$[$I!"\e(Bmin
4414             ;; \e$B%]%$%s%H$K6a$$$H$3$m$K$J$1$l$P$J$i$J$$\e(B)\e$B!#\e(B
4415             (setq skk-henkan-key midasi
4416                   old-entry (skk-search-jisyo-file-1 okurigana 0 'delete))
4417             (skk-update-jisyo-1 okurigana word old-entry purge)
4418             (and skk-update-end-function
4419                  (funcall skk-update-end-function
4420                           henkan-buffer midasi okurigana word purge))
4421             (setq skk-update-jisyo-count (1+ skk-update-jisyo-count))
4422             (if (and skk-jisyo-save-count
4423                      (= skk-jisyo-save-count skk-update-jisyo-count))
4424                 ;; auto save.
4425                 (skk-save-jisyo 'quiet)))))))
4426
4427 (defun skk-update-jisyo-1 (okurigana word old-entry-list purge)
4428   ;; \e$B4{B8%(%s%H%j$+$i7W;;$7$?\e(B entry[1-4] \e$B$NCM$H!":#2s$NJQ49$N7k2L\e(B word \e$B$H$r%^!<\e(B
4429   ;; \e$B%8$7$F!"?7$?$J%(%s%H%j$r7W;;$7!"A^F~$9$k!#\e(B
4430   (let ((entry1 (car old-entry-list)) (entry2 (nth 1 old-entry-list))
4431         (entry3 (nth 2 old-entry-list)) (entry4 (nth 3 old-entry-list)))
4432     (if (not purge)
4433         ;; entry1 \e$B$N@hF,$N%(%s%H%j$r\e(B word \e$B$K$9$k!#\e(B
4434         (setq entry1 (cons word (delete word entry1)))
4435       ;; \e$BAw$j$J$7!"$b$7$/$O\e(B skk-henkan-okuri-strictly \e$B$H\e(B
4436       ;; skk-henkan-strict-okuri-precedence \e$B$,\e(B nil \e$B$N>l9g!#\e(B
4437       (if (or (not okurigana) (not (or skk-henkan-okuri-strictly
4438                                        skk-henkan-strict-okuri-precedence)))
4439           ;; entry1 \e$B$r\e(B purge\e$B!#6&MQ<-=q$K$"$k%(%s%H%j$@$C$?$i!"\e(B
4440           ;; skk-ignore-dic-word \e$B$G%/%)!<%H$7$F<!$NJQ49$+$i=PNO$7$J$$$h$&$K$9\e(B
4441           ;; \e$B$k!#6&MQ<-=q$K$J$$J8;zNs$O\e(B word \e$B$r>C$9!#\e(B
4442           (if (skk-public-jisyo-has-entry-p okurigana word)
4443               (setq entry1 (skk-compose-ignore-entry entry1 word))
4444             (setq entry1 (delete word entry1)))
4445         ;; \e$BAw$j$"$j$G!"$+$D\e(B skk-henkan-okuri-strictly \e$B$+\e(B
4446         ;; skk-henkan-strict-okuri-precedence \e$B$,\e(B non-nil \e$B$N>l9g$G!"$+$D\e(B
4447         ;; \e$B$3$N\e(B word \e$B$H%Z%"$K$J$kAw$j2>L>$,\e(B okurigana \e$B$7$+$J$$$H$-!#\e(B
4448         (if (and okurigana (or skk-henkan-okuri-strictly
4449                                skk-henkan-strict-okuri-precedence)
4450                  (null (member word entry2)) (null (member word entry4)))
4451             (setq entry1 (delete word entry1))
4452           ;; \e$B$=$NB>$N>l9g$O2?$b$7$J$$!#\e(B
4453          )))
4454     (if (null entry1)
4455         ;; entry1 \e$B$,\e(B null \e$B$G$"$l$P!"$b$&2?$b$9$k$3$H$O$J$$!#\e(B
4456         nil
4457       (goto-char (if okurigana skk-okuri-ari-min skk-okuri-nasi-min))
4458       (insert "\n" skk-henkan-key " /")
4459       ;; entry1 -- \e$BA4%(%s%H%j\e(B (\e$BAw$j$J$7$N>l9g\e(B) or \e$B4A;zItJ,$NA4%(%s%H%j\e(B (\e$BAw$j$"\e(B
4460       ;; \e$B$j$N>l9g\e(B)
4461       (insert (mapconcat 'skk-quote-char entry1 "/") "/")
4462       (if (not okurigana)
4463           nil
4464         ;; entry2 \e$B0J9_$N%(%s%H%j$r=hM}$9$k$N$O!"Aw$j$"$j$N>l9g$N$_!#\e(B
4465         ;; \e$B@h$KA^F~$9$Y$-%(%s%H%j$r7W;;!"D4@0$9$k!#\e(B
4466         (if entry3
4467             (if (not purge)
4468                 (setq entry3 (cons word (delete word entry3)))
4469               (setq entry3 (delete word entry3))
4470               (if (null entry3)
4471                   ;; entry3 \e$B$H$7$FA^F~$9$k$b$N$,A4$/$J$1$l$P!"\e(B"/[\e$B$/\e(B/]/" \e$B$N$h\e(B
4472                   ;; \e$B$&$JAw$j2>L>$N$_$N%(%s%H%j$r:n$i$J$$$h$&$K$9$k\e(B (\e$BI,MW$G\e(B
4473                   ;; \e$B$"$l$P!"\e(Bentry2 \e$B$N:G8eJ}$H\e(B) entry4 \e$B$N@hF,$N%(%s%H%j\e(B "]"
4474                   ;; \e$B$r:o=|!#\e(B
4475                   (let ((last2 (nthcdr (- (length entry2) 2) entry2)))
4476                     ;; entry2 \e$B$N:G8eJ}$O>o$K\e(B "[\e$BAw$j2>L>\e(B" \e$B$H$O8B$i$J$$!#\e(B
4477                     (and (string= (nth 1 last2) (concat "[" okurigana))
4478                          (setcdr last2 nil))
4479                     ;; entry4 \e$B$N@hF,$O>o$K\e(B "]"\e$B!#\e(B
4480                     (setq entry4 (cdr entry4)))))
4481           ;; entry3 \e$B$,\e(B null \e$B$G$"$l$P\e(B
4482           (if (or skk-process-okuri-early purge)
4483               ;; skk-process-okuri-early \e$B$,\e(B non-nil \e$B$J$iAw$j2>L>$,J,$i$J$$$N$G\e(B
4484               ;; \e$B2?$b$7$J$$!#\e(B-- \e$B:#2s;HMQ$7$?Aw$j2>L>$,$o$+$i$J$$$^$^JQ49$7$F$$\e(B
4485               ;; \e$B$k$N$G!"A4$F$N%(%s%H%j$,\e(B entry2 \e$B$KF~$C$F$$$k\e(B -- entry3,
4486               ;; entry4 \e$B$O\e(B null\e$B!#\e(B
4487               ;; entry3 \e$B$H$7$FA^F~$9$k$b$N$,A4$/$J$1$l$P!"2?$b$7$J$$\e(B -- entry3
4488               ;; \e$B$,\e(B purge \e$BA0$+$i\e(B null \e$B$J$i!"\e(Bentry2 \e$B$NKvHx$O\e(B "[" \e$B$G$J$$$7!"\e(B
4489               ;; entry4 \e$B$O\e(B null \e$B$@$+$i\e(B entry[234] \e$B$NA`:n$OITMW!#\e(B
4490               nil
4491             (setq entry2 (nconc entry2 (list (concat "[" okurigana)))
4492                   entry3 (list word)
4493                   ;; purge \e$BA0$+$i\e(B entry3 \e$B$,\e(B null \e$B$@$C$?$N$@$+$i\e(B entry4 \e$B$b\e(B null\e$B!#\e(B
4494                   entry4 (list "]")))))
4495       (if entry2
4496           ;; entry2 -- \e$B:#2s;HMQ$7$J$+$C$?Aw$j2>L>$r;H$&4A;z$N8uJd72\e(B + "[" + \e$B:#\e(B
4497           ;; \e$B2s;HMQ$7$?Aw$j2>L>\e(B (\e$BAw$j2>L>$N$_!#$=$NAw$j2>L>$r;HMQ$9$k4A;z$N8u\e(B
4498           ;; \e$BJd72$O!"\e(Bentry3 \e$B$K4^$^$l$k\e(B)\e$B!#\e(B
4499           (progn
4500             (insert (mapconcat 'skk-quote-char entry2 "/") "/")
4501             ;; entry2 \e$B$,\e(B null \e$B$J$i\e(B entry3 \e$B$b\e(B null\e$B!#\e(B
4502             (and entry3
4503                  ;; entry3 -- \e$B:#2s;HMQ$7$?Aw$j2>L>$r;H$&A44A;z%(%s%H%j\e(B
4504                  (insert (mapconcat 'skk-quote-char entry3 "/") "/"))
4505             ;; purge \e$B$G\e(B entry3 \e$B$,\e(B null \e$B$K$J$C$?>l9g$O\e(B entry4 \e$B$,;D$C$F$$$k$H$-\e(B
4506             ;; \e$B$,$"$k!#\e(B
4507             (and entry4
4508                  ;; entry4 -- "]" + \e$BB>$NAw$j2>L>$r;H$&A44A;z%(%s%H%j\e(B (entry2 \e$B$N\e(B
4509                  ;; \e$B;D$j\e(B)\e$B!#\e(B
4510                  (insert (mapconcat 'skk-quote-char entry4 "/") "/")))))))
4511
4512 (defun skk-quote-char (word)
4513   ;; \e$B<-=q$N@)8B$+$i<-=q%(%s%H%jFb$K4^$a$F$O$J$i$J$$J8;z$,\e(B WORD \e$B$NCf$K$"$l$P!"\e(B
4514   ;; \e$BI>2A$7$?$H$-$K$=$NJ8;z$H$J$k$h$&$J\e(B Lisp \e$B%3!<%I$rJV$9!#\e(B
4515   (save-match-data
4516     (if (and word
4517              (string-match "[/\n\r\"]" word)
4518              ;; we should not quote WORD if it is a symbolic expression
4519              (not (skk-lisp-prog-p word)))
4520         (concat "(concat \""
4521                 (mapconcat (function (lambda (c)
4522                                        (cond ((eq c ?/) "\\057")
4523                                              ((eq c ?\n) "\\n")
4524                                              ((eq c ?\r) "\\r")
4525                                              ((eq c ?\") "\\\"")
4526                                              ((eq c ?\\) "\\\\")
4527                                              (t (char-to-string c)))))
4528                            ;; \e$BJ8;zNs$rBP1~$9$k\e(B char \e$B$N%j%9%H$KJ,2r$9$k!#\e(B
4529                            (append word nil) "")
4530                 "\")")
4531       word)))
4532
4533 (defun skk-lisp-prog-p (word)
4534   ;; word \e$B$,\e(B Lisp \e$B%W%m%0%i%`$G$"$l$P!"\e(Bt \e$B$rJV$9!#\e(B
4535   (let ((l (skk-str-length word)))
4536     (and (> l 2) (eq (skk-str-ref word 0) ?\() (< (aref word 1) 128)
4537          (eq (skk-str-ref word (1- l)) ?\)))))
4538
4539 (defun skk-public-jisyo-has-entry-p (okurigana word)
4540   ;; \e$B6&M-<-=q$,\e(B MIDASHI \e$B5Z$S$=$l$KBP1~$9$k\e(B WORDS \e$B%(%s%H%j$r;}$C$F$$$l$P!"\e(B
4541   ;; non-nil \e$B$rJV$9!#%W%i%$%Y!<%H<-=q$N%P%C%U%!$G%3!<%k$5$l$k!#\e(B
4542   (let (fn skk-henkan-okuri-strictly skk-henkan-strict-okuri-precedence)
4543     (if okurigana
4544         (setq skk-henkan-okurigana okurigana))
4545     ;; skkserv \e$B$r;H$&@_Dj$K$J$C$F$$$?$i!"\e(Bskk-server.el \e$B$r%m!<%I$9$k!#\e(B
4546     (and (not (featurep 'skk-server))
4547          (or (and (boundp 'skk-servers-list) skk-servers-list)
4548              (or (and (boundp 'skk-server-host) skk-server-host)
4549                  (getenv "SKKSERVER")))
4550          (require 'skk-server))
4551     (setq fn (funcall skk-public-jisyo-to-be-searched-function))
4552     (and fn (member word (eval fn)))))
4553
4554 (defun skk-public-jisyo-to-be-searched-original ()
4555   ;; skk-search-prog-list \e$B$NCf$+$i!"0lHVBg$-$J6&M-<-=q$G%5!<%A$9$k%W%m\e(B
4556   ;; \e$B%0%i%`$rJV$9!#\e(B
4557   (let (fn)
4558     (and (featurep 'skk-server) (or skk-servers-list skk-server-host)
4559          (setq fn (assq 'skk-search-server skk-search-prog-list)))
4560     ;; skk-search-server \e$B$+$i;O$^$k%j%9%H$,$J$1$l$P!"$H$K$+$/Bg$-$$<-=q$r0z?t\e(B
4561     ;; \e$B$K$7$F$$$k\e(B skk-search-jisyo-file \e$B%W%m%0%i%`$rC5$9!#\e(B
4562     (if (and (not fn) (or skk-aux-large-jisyo skk-large-jisyo))
4563         (let ((spl skk-search-prog-list)
4564               cell)
4565           (while (setq cell (car spl))
4566             (if (and (eq (car cell) 'skk-search-jisyo-file)
4567                      (memq (nth 1 cell) '(skk-aux-large-jisyo skk-large-jisyo)))
4568                 (setq fn cell
4569                       spl nil)
4570               (setq spl (cdr spl))))))
4571     fn))
4572
4573 (defun skk-compose-ignore-entry (entry &optional add)
4574   ;; ENTRY \e$B$NCf$K\e(B skk-ignore-dic-word \e$B4X?t$G%/%)!<%H$7$?%(%s%H%j$,$"$l\e(B
4575   ;; \e$B$P!"0l$D$N%(%s%H%j$K$^$H$a$k!#\e(B
4576   ;; \e$B%*%W%7%g%J%k0z?t$N\e(B ADD \e$B$,;XDj$5$l$F$$$?$i!"\e(BADD \e$B$r4^$a$?\e(B
4577   ;; skk-ignore-dic-word \e$B%(%s%H%j$r:n$k!#\e(B
4578   ;; \e$B?7$7$$\e(B skk-ignore-dic-word \e$B%(%s%H%j$r\e(B car \e$B$K!"$=$l0J30$N%(%s%H%j\e(B cdr \e$B$K$7\e(B
4579   ;; \e$B$?%j%9%H$rJV$9!#\e(B
4580   (let (l arg e)
4581     (and add (setq entry (delete add entry)))
4582     (setq l entry)
4583     (save-match-data
4584       (while l
4585         (setq e (car l)
4586               l (cdr l))
4587         (and (string-match "(skk-ignore-dic-word +\\([^\)]+\\))" e)
4588              (setq arg (concat arg
4589                                (substring e (1+ (match-beginning 1))
4590                                           (1- (match-end 1)))
4591                                "\" \"")
4592                    entry (delq e entry))))
4593       (if add
4594           (setq arg (if arg (concat arg add) add))
4595         ;; \e$BKvHx$N\e(B " \"" \e$B$r@Z$jMn$H$9!#\e(B
4596         (setq arg (substring arg 0 -2)))
4597       (cons (concat "(skk-ignore-dic-word \"" arg "\")") entry))))
4598
4599
4600 (defun skk-katakana-region (start end &optional vcontract)
4601   "\e$B%j!<%8%g%s$N$R$i$,$J$r%+%?%+%J$KJQ49$9$k!#\e(B
4602 \e$B%*%W%7%g%J%k0z?t$N\e(B VCONTRACT \e$B$,\e(B non-nil \e$B$G$"$l$P!"\e(B\"\e$B$&!+\e(B\" \e$B$r\e(B \"\e$B%t\e(B\" \e$B$KJQ49$9\e(B
4603 \e$B$k!#\e(B
4604 \e$B0z?t$N\e(B START \e$B$H\e(B END \e$B$O?t;z$G$b%^!<%+!<$G$bNI$$!#\e(B"
4605   (interactive "*r\nP")
4606   (skk-save-point
4607    (let (katakana)
4608      (save-match-data
4609        (goto-char start)
4610        (while (re-search-forward  "[\e$B$!\e(B-\e$B$s\e(B]+" end 'noerror)
4611          (setq katakana
4612                (skk-hiragana-to-katakana
4613                 (buffer-substring-no-properties (match-beginning 0)
4614                                                 (match-end 0))))
4615          (backward-char (skk-str-length katakana))
4616          ;; firstly insert a new string, secondly delete an old string to save
4617          ;; the cursor position.
4618          (insert-and-inherit katakana)
4619          (delete-region (+ (match-beginning 0) (length katakana))
4620                         (+ (match-end 0) (length katakana))))
4621        (if vcontract
4622            (progn
4623              (goto-char start)
4624              (while (re-search-forward  "\e$B%&!+\e(B" end 'noerror)
4625                (backward-char (skk-str-length "\e$B%&!+\e(B"))
4626                (let ((vu-len (length "\e$B%t\e(B")))
4627                  (insert-and-inherit "\e$B%t\e(B")
4628                  (delete-region (+ (match-beginning 0) vu-len)
4629                                 (+ (match-end 0) vu-len))))))))))
4630
4631 (defun skk-hiragana-region (start end &optional vexpand)
4632   "\e$B%j!<%8%g%s$N%+%?%+%J$r$R$i$,$J$KJQ49$9$k!#\e(B
4633 \e$B%*%W%7%g%J%k0z?t$N\e(B VEXPAND \e$B$,\e(B non-nil \e$B$G$"$l$P!"\e(B\"\e$B%t\e(B\" \e$B$r\e(B \"\e$B$&!+\e(B\" \e$B$KJQ49$9$k!#\e(B
4634 \e$B0z?t$N\e(B START \e$B$H\e(B END \e$B$O?t;z$G$b%^!<%+!<$G$bNI$$!#\e(B
4635 \"\e$B%u\e(B\" \e$B$H\e(B \"\e$B%v\e(B\" \e$B$OJQ99$5$l$J$$!#$3$N\e(B 2 \e$B$D$NJ8;z$OBP1~$9$k$R$i$,$J$,$J$$$N$G!"%+\e(B
4636 \e$B%?%+%J$H$7$F$O07$o$l$J$$!#\e(B"
4637   (interactive "*r\nP")
4638   (skk-save-point
4639    (let (hiragana)
4640      (save-match-data
4641        (goto-char start)
4642        (while (re-search-forward  "[\e$B%!\e(B-\e$B%s\e(B]+" end 'noerror)
4643          (setq hiragana
4644                (skk-katakana-to-hiragana
4645                 (buffer-substring-no-properties (match-beginning 0)
4646                                                 (match-end 0))))
4647          (backward-char (skk-str-length hiragana))
4648          ;; firstly insert a new string, secondly delete an old string to save
4649          ;; the cursor position.
4650          (insert-and-inherit hiragana)
4651          (delete-region (+ (match-beginning 0) (length hiragana))
4652                         (+ (match-end 0) (length hiragana))))
4653        (if vexpand
4654            (progn
4655              (goto-char start)
4656              (while (re-search-forward  "\e$B%t\e(B" end 'noerror)
4657                (backward-char (skk-str-length "\e$B%t\e(B"))
4658                (insert-and-inherit "\e$B$&!+\e(B")
4659                (let ((vu-len (length "\e$B$&!+\e(B")))
4660                  (delete-region (+ (match-beginning 0) vu-len)
4661                                 (+ (match-end 0) vu-len))))))))))
4662
4663 (defun skk-jisx0208-latin-region (start end)
4664   "\e$B%j!<%8%g%s$N\e(B ascii \e$BJ8;z$rBP1~$9$kA43Q1QJ8;z$KJQ49$9$k!#\e(B"
4665   (interactive "*r")
4666   (skk-save-point
4667    (save-match-data
4668      (goto-char end)
4669      (while (re-search-backward "[ -~]" start 'noerror)
4670        ;; firstly insert a new char, secondly delete an old char to save
4671        ;; the cursor position.
4672        (let* ((c (aref skk-default-jisx0208-latin-vector (following-char)))
4673               (c-len (length c)))
4674          (insert-and-inherit c)
4675          (delete-region (+ (match-beginning 0) c-len)
4676                         (+ (match-end 0) c-len)))))))
4677
4678 (defun skk-latin-region (start end)
4679   ;; \e$B%j!<%8%g%s$NA43Q1Q?t;z$rBP1~$9$k\e(B ascii \e$BJ8;z$KJQ49$9$k!#\e(B
4680   ;; egg.el 3.09 \e$B$N\e(B hankaku-region \e$B$r;29M$K$7$?!#\e(B
4681   (interactive "*r")
4682   (skk-save-point
4683    (save-match-data
4684      (let (val)
4685        (goto-char end)
4686        (while (re-search-backward "\\cS\\|\\cA" start 'noerror)
4687          (setq val (skk-jisx0208-to-ascii (char-to-string (following-char))))
4688          (if val
4689              (progn
4690                (insert-and-inherit val)
4691                (delete-region (+ (match-beginning 0) 1)
4692                               (+ (match-end 0) 1)))))))))
4693
4694 (defun skk-katakana-henkan (arg)
4695   "\e$B"&%b!<%I$G$"$l$P!"%j!<%8%g%s$N$R$i$,$J$r%+%?%+%J$KJQ49$9$k!#\e(B
4696 \e$B"'%b!<%I$G$O2?$b$7$J$$!#\e(B
4697 \e$B$=$NB>$N%b!<%I$G$O!"%*%j%8%J%k$N%-!<3d$jIU$1$G%P%$%s%I$5$l$F$$$k%3%^%s%I$r<B9T\e(B
4698 \e$B$9$k!#\e(B"
4699   (interactive "*P")
4700   (skk-with-point-move
4701    (if skk-henkan-on
4702        (if skk-henkan-active
4703            nil
4704          (skk-set-marker skk-henkan-end-point (point))
4705          (skk-*-henkan-1 'skk-katakana-region skk-henkan-start-point
4706                          skk-henkan-end-point 'vcontract))
4707      (skk-emulate-original-map arg))))
4708
4709 (defun skk-hiragana-henkan (arg)
4710   "\e$B"&%b!<%I$G$"$l$P!"%j!<%8%g%s$N%+%?%+%J$r$R$i$,$J$KJQ49$9$k!#\e(B
4711 \e$B"'%b!<%I$G$O2?$b$7$J$$!#\e(B
4712 \e$B$=$NB>$N%b!<%I$G$O!"%*%j%8%J%k$N%-!<3d$jIU$1$G%P%$%s%I$5$l$F$$$k%3%^%s%I$r<B9T\e(B
4713 \e$B$9$k!#\e(B"
4714   (interactive "*P")
4715   (skk-with-point-move
4716    (if skk-henkan-on
4717        (if skk-henkan-active
4718            nil
4719          (skk-set-marker skk-henkan-end-point (point))
4720          (skk-*-henkan-1 'skk-hiragana-region skk-henkan-start-point
4721                          skk-henkan-end-point 'vexpand))
4722      (skk-emulate-original-map arg))))
4723
4724 (defun skk-jisx0208-latin-henkan (arg)
4725   "\e$B"&%b!<%I$G$"$l$P!"\e(Bascii \e$BJ8;z$rBP1~$9$kA43Q1QJ8;z$KJQ49$9$k!#\e(B
4726 \e$B"'%b!<%I$G$O2?$b$7$J$$!#\e(B
4727 \e$B$=$NB>$N%b!<%I$G$O!"%*%j%8%J%k$N%-!<3d$jIU$1$G%P%$%s%I$5$l$F$$$k%3%^%s%I$r<B9T\e(B
4728 \e$B$9$k!#\e(B"
4729   (interactive "*P")
4730   (skk-with-point-move
4731    (if skk-henkan-on
4732        (if skk-henkan-active
4733            nil
4734          (skk-set-marker skk-henkan-end-point (point))
4735          (skk-*-henkan-1 'skk-jisx0208-latin-region skk-henkan-start-point
4736                          skk-henkan-end-point))
4737      (skk-emulate-original-map arg))))
4738
4739 (defun skk-latin-henkan (arg)
4740   "\e$B"&%b!<%I$G$"$l$P!"\e(Bascii \e$BJ8;z$rBP1~$9$kA43QJ8;z$KJQ49$9$k!#\e(B
4741 \e$B"'%b!<%I$G$O2?$b$7$J$$!#\e(B
4742 \e$B$=$NB>$N%b!<%I$G$O!"%*%j%8%J%k$N%-!<3d$jIU$1$G%P%$%s%I$5$l$F$$$k%3%^%s%I$r<B9T\e(B
4743 \e$B$9$k!#\e(B"
4744   (interactive "*P")
4745   (skk-with-point-move
4746    (if skk-henkan-on
4747        (if skk-henkan-active
4748            nil
4749          (skk-set-marker skk-henkan-end-point (point))
4750          (skk-*-henkan-1 'skk-latin-region skk-henkan-start-point
4751                          skk-henkan-end-point))
4752      (skk-emulate-original-map arg))))
4753
4754 (defun skk-*-henkan-1 (func &rest args)
4755   ;; \e$BJQ492DG=$+$I$&$+$N%A%'%C%/$r$7$?8e$K\e(B ARGS \e$B$r0z?t$H$7$F\e(B FUNC \e$B$rE,MQ$7!"\e(B
4756   ;; skk-henkan-start-point \e$B$H\e(B skk-henkan-end-point \e$B$N4V$NJ8;zNs$rJQ49$9$k!#\e(B
4757   (cond ((skk-get-prefix skk-current-rule-tree)
4758          (skk-error "\e$B%U%#%C%/%9$5$l$F$$$J$$\e(B skk-prefix \e$B$,$"$j$^$9\e(B"
4759                     "Have unfixed skk-prefix"))
4760         ((< (point) skk-henkan-start-point)
4761          (skk-error "\e$B%+!<%=%k$,JQ493+;OCOE@$h$jA0$K$"$j$^$9\e(B"
4762                     "Henkan end point must be after henkan start point"))
4763         ((and (not skk-allow-spaces-newlines-and-tabs)
4764               (skk-save-point (beginning-of-line)
4765                               (> (point) skk-henkan-start-point)))
4766          (skk-error "\e$BJQ49%-!<$K2~9T$,4^$^$l$F$$$^$9\e(B"
4767                     "Henkan key may not contain a new line character")))
4768   (apply func args)
4769   (skk-kakutei))
4770
4771 (defun skk-hiragana-to-katakana (hiragana)
4772   (let ((diff (- ?\e$B%"\e(B ?\e$B$"\e(B)))
4773     (mapconcat (function (lambda (e) (char-to-string (+ e diff))))
4774                (string-to-int-list hiragana) "")))
4775
4776 (defun skk-katakana-to-hiragana (katakana)
4777   (let ((diff (- ?\e$B%"\e(B ?\e$B$"\e(B)))
4778     (mapconcat (function (lambda (e) (char-to-string (- e diff))))
4779                (string-to-int-list katakana) "")))
4780
4781 (defun skk-splice-in (org offset spliced)
4782   ;; ORG := '(A B C), SPLICED := '(X Y), OFFSET := 1
4783   ;; -> '(A B X Y C)
4784   (let (tmp tail)
4785     (or (> offset 0) (error "Cannot splice in!"))
4786     (setq tmp (nthcdr (1- offset) org)
4787           tail (cdr tmp))
4788     (setcdr tmp nil) ;cut off
4789     (setcdr tmp (if tail (nconc spliced tail) spliced))
4790     org))
4791
4792 ;; (defun skk-chomp (nth list)
4793 ;;   ;; LIST := '(A B C D), NTH := 1
4794 ;;   ;; -> '(A B)
4795 ;;   (and (> nth -1) (setcdr (nthcdr nth list) nil))
4796 ;;   list)
4797
4798 (defun skk-henkan-face-on ()
4799   ;; skk-use-face \e$B$,\e(B non-nil \e$B$N>l9g!"\e(Bskk-henkan-start-point \e$B$H\e(B
4800   ;; skk-henkan-end-point \e$B$N4V$N\e(B face \e$BB0@-$r\e(B skk-henkan-face \e$B$NCM$KJQ99$9$k!#\e(B
4801   ;;
4802   ;; SKK 9.4 \e$B$h$j\e(B Text Properties \e$B$r;HMQ$9$k$N$r;_$a$F!"\e(BOverlays \e$B$r;HMQ$9$k$h\e(B
4803   ;; \e$B$&$K$7$?\e(B (egg.el, canna.el, wnn-egg.el \e$B$r;29M$K$7$?\e(B)\e$B!#\e(B
4804   ;; Overlays \e$B$O!"%F%-%9%H$N0lIt$G$O$J$$$N$G!"%P%C%U%!$+$iJ8;z$r@Z$j=P$7$F$b%3\e(B
4805   ;; \e$B%T!<$NBP>]$K$J$i$J$$$7!"%"%s%I%%;~$bL5;k$5$l$k$N$G!"JQ49$5$l$?8uJd$NI=<(\e(B
4806   ;; \e$B$r0l;~E*$KJQ99$9$k$K$O\e(B Text Properties \e$B$h$j$b9%ET9g$G$"$k!#\e(B
4807   (if (and skk-henkan-face
4808            (marker-position skk-henkan-start-point)
4809            (marker-position skk-henkan-end-point))
4810       (skk-face-on skk-henkan-overlay
4811                    skk-henkan-start-point skk-henkan-end-point
4812                    skk-henkan-face skk-henkan-overlay-priority)))
4813
4814 (defun skk-henkan-face-off ()
4815   ;; skk-henkan-start-point \e$B$H\e(B skk-henkan-end-point \e$B$N4V$NI=<($rJQ99$7$F$$$k\e(B
4816   ;; skk-henkan-overlay \e$B$r>C$9!#\e(B
4817   (and skk-henkan-face (skk-detach-extent skk-henkan-overlay)))
4818
4819 (defun skk-detach-extent (object)
4820   (static-cond
4821    ((eq skk-emacs-type 'xemacs)
4822     (and (extentp object) (detach-extent object)))
4823    (t
4824     (and (overlayp object) (delete-overlay object)))))
4825
4826 (defun skk-make-face (face)
4827   ;; hilit-lookup-face-create \e$B$N%5%V%;%C%H!#\e(Btutorial \e$B$G?'IU$1$r9T$J$&>l9g$G$b\e(B
4828   ;; hilit19 \e$B$K0MB8$;$:$H$j$"$($:\e(B face \e$B$r<+A0$G:n$k$3$H$,$G$-$k$h$&$K!"$H$$$&\e(B
4829   ;; \e$BL\E*$G:n$C$?$b$N$G!"4JC1$J?'IU$1$7$+$G$-$J$$!#$"$^$j8-$/$O$J$$!#J#;($J\e(B
4830   ;; face \e$B$r:n$j$?$$?M$O\e(B hilit-lookup-face-create \e$BEy$r;H$C$F2<$5$$!#\e(B
4831   (or (car (memq face (face-list)))
4832       (let ((face-name (symbol-name face)))
4833         (setq face (make-face face))
4834         (save-match-data
4835           (if (not (string-match "/" face-name))
4836               (set-face-foreground face face-name)
4837             (set-face-foreground
4838              face
4839              (substring face-name 0 (match-beginning 0)))
4840             (set-face-background
4841              face
4842              (substring face-name (1+ (match-beginning 0)))))
4843           face))))
4844
4845 ;; skk-auto.el, skk-rdbms.el \e$B$NN>J}$G;H$&$N$G!"\e(Bskk-auto.el \e$B$h$j0\F0$7$?!#\e(B
4846 (defun skk-remove-common (word)
4847   ;; skk-henkan-key \e$B$H\e(B word \e$B$N4V$K6&DL$NAw$j2>L>$r<h$j=|$-!"Aw$j2>L>0J30$NItJ,\e(B
4848   ;; \e$B$NJ8;zNs$rJV$9!#\e(Bskk-henkan-key \e$B$H\e(B skk-henkan-okurigana \e$B$NCM$r%;%C%H$9$k!#\e(B
4849   ;; \e$BNc$($P!"\e(Bword == \e$B;}$C$F$-$?\e(B \e$B$G$"$l$P!"\e(Bskk-henkan-key := "\e$B$b\e(Bt",
4850   ;; skk-henkan-okurigana := "\e$B$C$F\e(B", word := "\e$B;}\e(B" \e$B$N$h$&$KJ,2r$7!"\e(Bword \e$B$rJV$9!#\e(B
4851   ;; skk-auto-okuri-process \e$B$NCM$,\e(B non-nil \e$B$G$"$k$H$-$K$3$N4X?t$r;HMQ$9$k!#\e(B
4852   (if (and (not (skk-numeric-p)) (not skk-abbrev-mode)
4853            (or skk-henkan-in-minibuff-flag
4854                (and (<= skk-okuri-index-min skk-henkan-count)
4855                     (<= skk-henkan-count skk-okuri-index-max))))
4856       (let ((midasi skk-henkan-key)
4857             (midasi-len (skk-str-length skk-henkan-key))
4858             (word-len (skk-str-length word))
4859             (cont t)
4860             char pos pos2 midasi-tail word-tail new-word okuri-first
4861             new-skk-okuri-char new-skk-henkan-key)
4862         (if (not (and (>= midasi-len 2) (>= word-len 2)))
4863             nil
4864           ;; check if both midasi and word end with the same ascii char.
4865           (if (and (eq (skk-str-ref midasi (1- midasi-len))
4866                        (skk-str-ref word (1- word-len)))
4867                    (skk-ascii-char-p (skk-str-ref midasi (1- midasi-len))))
4868               ;; if so chop off the char from midasi and word.
4869               ;; assume size of an ASCII char is always 1.
4870               (setq midasi (substring midasi 0 -1)
4871                     midasi-len (1- midasi-len)
4872                     word (substring word 0 -1)
4873                     word-len (1- word-len)))
4874           (setq midasi-tail (skk-substring midasi (1- midasi-len)
4875                                            midasi-len)
4876                 word-tail (skk-substring word (1- word-len)
4877                                          word-len))
4878           ;; \e$B$b$&>/$7E83+$G$-$=$&$@$,!"%P%$%H%3%s%Q%$%i!<$,%*%W%F%#%^%$%:$7$d\e(B
4879           ;; \e$B$9$$$h$&$K\e(B not \e$B$rIU$1$k$@$1$K$7$F$*$/!#\e(B
4880           (if (not (and (string= midasi-tail word-tail)
4881                         (or (and (skk-string<= "\e$B$!\e(B" midasi-tail)
4882                                  (skk-string<= midasi-tail "\e$B$s\e(B"))
4883                             (member midasi-tail '("\e$B!"\e(B" "\e$B!#\e(B" "\e$B!$\e(B" "\e$B!%\e(B")))))
4884               nil
4885             (setq pos (1- word-len)
4886                   new-word new-skk-henkan-key)
4887             (while (and cont (> pos 0))
4888               (setq char (skk-substring word (1- pos) pos))
4889               (if (and (skk-string<= "\e$B0!\e(B" char) (skk-string<= char "\e$Bt$\e(B"))
4890                   ;; char is the right-most Kanji
4891                   (setq cont nil)
4892                 (setq pos (1- pos))))
4893             (setq pos2 (- midasi-len (- word-len pos)))
4894             ;; check if midasi and word has the same tail of length
4895             (if (not (string= (skk-substring midasi pos2 midasi-len)
4896                               (skk-substring word pos word-len)))
4897                 nil
4898               (setq okuri-first (skk-substring word pos (1+ pos)))
4899               (setq skk-henkan-okurigana
4900                     (if (and (string= okuri-first "\e$B$C\e(B")
4901                              (<= (+ pos 2) word-len))
4902                         ;; in this case okuriga consits of two
4903                         ;; characters, e.g., \e$B!V;D$C$?!W\e(B
4904                         (skk-substring word pos (+ pos 2))
4905                       okuri-first))
4906               (setq new-word (skk-substring word 0 pos)
4907                     new-skk-okuri-char (skk-okurigana-prefix okuri-first)
4908                     new-skk-henkan-key (concat
4909                                         (skk-substring midasi 0 pos2)
4910                                         new-skk-okuri-char))
4911               (if (not skk-henkan-in-minibuff-flag)
4912                   (setq word new-word
4913                         skk-henkan-key new-skk-henkan-key)
4914                 ;; ask if register as okuri-ari word.
4915                 (let (inhibit-quit)     ; allow keyboard quit
4916                   (if (y-or-n-p
4917                        (format
4918                         (if skk-japanese-message-and-error
4919                             "%s /%s/ \e$B$rAw$j$"$j%(%s%H%j$H$7$FEPO?$7$^$9$+!)\e(B"
4920                           "Shall I register this as okuri-ari entry: %s /%s/ ? ")
4921                         new-skk-henkan-key new-word))
4922                       (setq word new-word
4923                             skk-okuri-char new-skk-okuri-char
4924                             skk-henkan-key new-skk-henkan-key)
4925                     (setq skk-henkan-okurigana nil
4926                           skk-okuri-char nil)
4927                     (message "")))))))))
4928   ;; \e$BJ,2r$7$?\e(B word (\e$BAw$j2>L>ItJ,$r=|$$$?$b$N\e(B) \e$B$rJV$9!#\e(B
4929   word)
4930
4931 (defun skk-okurigana-prefix (okurigana)
4932   (cond ((string= okurigana "\e$B$s\e(B")
4933          "n")
4934         ((string= okurigana "\e$B$C\e(B")
4935          (aref skk-kana-rom-vector
4936                ;; assume the character is hiragana of JIS X 0208.
4937                (- (skk-char-octet
4938                    (string-to-char (skk-substring skk-henkan-okurigana 1 2))
4939                    1)
4940                   33)))
4941         (t (aref skk-kana-rom-vector
4942                  (- (skk-char-octet
4943                      (string-to-char (skk-substring skk-henkan-okurigana 0 1))
4944                      1)
4945                     33)))))
4946
4947 ;; from type-break.el.  Welcome!
4948 (defun skk-time-difference (a b)
4949   ;; Compute the difference, in seconds, between a and b, two structures
4950   ;; similar to those returned by `current-time'.
4951   ;; Use addition rather than logand since that is more robust; the low 16
4952   ;; bits of the seconds might have been incremented, making it more than 16
4953   ;; bits wide.
4954   (+ (lsh (- (car b) (car a)) 16)
4955      (- (nth 1 b) (nth 1 a))))
4956
4957 (defun skk-remove-minibuffer-setup-hook (&rest args)
4958   ;; Remove all args from minibuffer-setup-hook.
4959   (while args
4960     (remove-hook 'minibuffer-setup-hook (car args))
4961     (setq args (cdr args))))
4962
4963 (add-hook 'edit-picture-hook 'skk-misc-for-picture 'append)
4964 ;; add 'skk-save-jisyo only to remove easily.
4965 (add-hook 'skk-before-kill-emacs-hook 'skk-save-jisyo)
4966 (add-hook 'minibuffer-exit-hook
4967           (function
4968            (lambda ()
4969              (remove-hook 'pre-command-hook 'skk-pre-command 'local)
4970              (skk-remove-minibuffer-setup-hook
4971               'skk-j-mode-on 'skk-setup-minibuffer
4972               (function (lambda ()
4973                           (add-hook 'pre-command-hook 'skk-pre-command nil 'local)))))))
4974
4975 (defun skk-setup-modeline ()
4976   "\e$B%b!<%I9T$X$N%9%F!<%?%9I=<($r=`Hw$9$k!#\e(B"
4977   (cond ((eq skk-status-indicator 'left)
4978          (let ((list
4979                 (cond
4980                  ((and (fboundp 'face-proportional-p)
4981                        (face-proportional-p 'modeline))
4982                   '((skk-latin-mode-string . ("--SKK:" . " SKK"))
4983                     (skk-hiragana-mode-string . ("--\e$B$+$J\e(B:" . " \e$B$+$J\e(B"))
4984                     (skk-katakana-mode-string . ("--\e$B%+%J\e(B:" . " \e$B%+%J\e(B"))
4985                     (skk-jisx0208-latin-mode-string . ("--\e$BA41Q\e(B:" . " \e$BA41Q\e(B"))
4986                     (skk-abbrev-mode-string . ("--a\e$B$"\e(B:" . " a\e$B$"\e(B"))))
4987                  (t
4988                   '((skk-latin-mode-string . ("--SKK::" . " SKK"))
4989                     (skk-hiragana-mode-string . ("--\e$B$+$J\e(B:" . " \e$B$+$J\e(B"))
4990                     (skk-katakana-mode-string . ("--\e$B%+%J\e(B:" . " \e$B%+%J\e(B"))
4991                     (skk-jisx0208-latin-mode-string . ("--\e$BA41Q\e(B:" . " \e$BA41Q\e(B"))
4992                     (skk-abbrev-mode-string . ("--a\e$B$"\e(B::" . " a\e$B$"\e(B")))))))
4993            (while list
4994              (let ((sym (caar list))
4995                    (strs (cdar list)))
4996                (if (string= (symbol-value sym) (cdr strs))
4997                    (set sym (car strs))))
4998              (setq list (cdr list))))
4999          (cond ((eq skk-emacs-type 'xemacs)
5000                 (or (memq 'skk-input-mode-string default-mode-line-format)
5001                     (setq-default default-modeline-format
5002                                   (append '("" skk-input-mode-string)
5003                                           default-modeline-format)))
5004                 (mapc
5005                  (function
5006                   (lambda (buf)
5007                     (if (buffer-live-p buf)
5008                         (save-excursion
5009                           (set-buffer buf)
5010                           (or (memq 'skk-input-mode-string modeline-format)
5011                               (setq modeline-format
5012                                     (append '("" skk-input-mode-string)
5013                                             modeline-format)))))))
5014                  (buffer-list)))
5015                (t
5016                 (or (memq 'skk-input-mode-string mode-line-format)
5017                     (setq-default
5018                      mode-line-format
5019                      (append '("" skk-input-mode-string)
5020                              mode-line-format)))))
5021          (setq-default skk-input-mode-string "")
5022          (force-mode-line-update t))
5023         (t
5024          (setq minor-mode-alist
5025                (put-alist 'skk-mode
5026                           ;; each element of minor-mode-alist is not cons cell.
5027                           '(skk-input-mode-string) minor-mode-alist)))))
5028
5029 (run-hooks 'skk-load-hook)
5030
5031 (provide 'skk)
5032 ;;; Local Variables:
5033 ;;; End:
5034 ;;; skk.el ends here