1 ;;; skk-kcode.el ---
\e$B4A;z%3!<%I$r;H$C$?JQ49$N$?$a$N%W%m%0%i%`
\e(B
2 ;; Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4 ;; Masahiko Sato <masahiko@kuis.kyoto-u.ac.jp>
6 ;; Author: Masahiko Sato <masahiko@kuis.kyoto-u.ac.jp>
7 ;; Maintainer: Mikio Nakajima <minakaji@osaka.email.ne.jp>
8 ;; Version: $Id: skk-kcode.el,v 1.2 2000-07-10 04:34:00 yoshiki Exp $
10 ;; Last Modified: $Date: 2000-07-10 04:34:00 $
12 ;; This file is part of SKK.
14 ;; SKK is free software; you can redistribute it and/or modify
15 ;; it under the terms of the GNU General Public License as published by
16 ;; the Free Software Foundation; either versions 2, or (at your option)
19 ;; SKK is distributed in the hope that it will be useful
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 ;; GNU General Public License for more details.
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.
32 (eval-when-compile (require 'skk))
33 (require 'skk-foreword)
36 (defgroup skk-kcode nil "SKK Kanji Code related customization."
40 (defcustom skk-input-by-code-menu-keys1 '(?a ?s ?d ?f ?g ?h ?q ?w ?e ?r ?t ?y)
41 "*
\e$B%a%K%e!<7A<0$G
\e(B JIS
\e$BJ8;z$rF~NO$9$k$H$-$K;HMQ$9$kA*Br%-!<$N%j%9%H!#
\e(B
42 \e$BBh
\e(B 1
\e$BCJ3,$N%a%K%e!<$G;HMQ$9$k!#
\e(B
43 12
\e$B8D$N%-!<
\e(B (char type)
\e$B$r4^$`I,MW$,$"$k!#
\e(B"
44 :type '(repeat character)
47 (defcustom skk-input-by-code-menu-keys2
48 '(?a ?s ?d ?f ?g ?h ?j ?k ?l ?q ?w ?e ?r ?t ?y ?u)
49 "*
\e$B%a%K%e!<7A<0$G
\e(B JIS
\e$BJ8;z$rF~NO$9$k$H$-$K;HMQ$9$kA*Br%-!<$N%j%9%H!#
\e(B
50 \e$BBh
\e(B 2
\e$BCJ3,$N%a%K%e!<$G;HMQ$9$k!#
\e(B
51 16
\e$B8D$N%-!<
\e(B (char type)
\e$B$r4^$`I,MW$,$"$k!#
\e(B"
52 :type '(repeat character)
55 (defcustom skk-kcode-charset
56 (if (memq skk-emacs-type '(xemacs mule4 mule3))
59 "*skk-input-by-code-or-menu
\e$B$G;H$o$l$kJ8;z%;%C%H!#
\e(B"
63 (defcustom skk-kcode-load-hook nil
64 "*skk-kcode.el
\e$B$r%m!<%I$7$?8e$K%3!<%k$5$l$k%U%C%/!#
\e(B"
68 ;; internal constants and variables.
69 (defconst skk-code-n1-min 161)
70 (defconst skk-code-n1-max 244)
71 (defconst skk-code-n2-min 161)
72 (defconst skk-code-n2-max 254)
73 (defconst skk-code-null 128)
74 (defconst skk-kcode-charset-list
75 (if (memq skk-emacs-type '(xemacs mule4 mule3))
76 (mapcar '(lambda (x) (list (symbol-name x))) (charset-list)) ))
77 (defvar skk-input-by-code-or-menu-jump-default skk-code-n1-min)
80 (defun skk-input-by-code-or-menu (&optional arg)
81 "7bit
\e$B$b$7$/$O
\e(B 8bit
\e$B$b$7$/$O
\e(B
\e$B6hE@%3!<%I$KBP1~$9$k
\e(B 2byte
\e$BJ8;z$rA^F~$9$k!#
\e(B"
85 (intern (completing-read (format "CHARSET(%s): " skk-kcode-charset)
86 skk-kcode-charset-list nil t ))))
87 (cond ((eq charset (intern "")))
88 ((not (skk-charsetp charset))
89 (skk-error "
\e$BL58z$J%-%c%i%/%?!<%;%C%H$G$9
\e(B" "Invalid charset"))
90 (t (setq skk-kcode-charset charset)) )))
94 "7/8 bits or KUTEN code for %s (00nn or CR for Jump Menu): "
96 (enable-recursive-minibuffer t)
98 (if (string-match "\\(.+\\)-\\(.+\\)" str)
99 (setq n1 (+ (string-to-number (match-string 1 str)) 32 128)
100 n2 (+ (string-to-number (match-string 2 str)) 32 128) )
101 (setq n1 (if (string= str "") 128
102 (+ (* 16 (skk-char-to-hex (aref str 0) 'jis))
103 (skk-char-to-hex (aref str 1)) ))
104 n2 (if (string= str "") 128
105 (+ (* 16 (skk-char-to-hex (aref str 2) 'jis))
106 (skk-char-to-hex (aref str 3)) ))))
107 (if (or (> n1 256) (> n2 256))
108 (skk-error "
\e$BL58z$J%3!<%I$G$9
\e(B" "Invalid code") )
109 (insert (if (> n1 160)
110 (skk-make-string n1 n2)
111 (skk-input-by-code-or-menu-0 n1 n2) ))
112 (if skk-henkan-active (skk-kakutei)) ))
114 (defun skk-char-to-hex (char &optional jischar)
115 (cond ((and (<= char 102) (> char 96)) (- char 87)) ; a-f
116 ((and (<= char 70) (> char 64)) (- char 55)) ; A-F
117 ((and (<= char 57) (> char 47)) ; 0-9
118 (cond (jischar (- char 40)) (t (- char 48)) ))
119 (t (skk-error "%c
\e$B$r
\e(B 16
\e$B?J?t$KJQ49$G$-$^$;$s
\e(B"
120 "Cannot convert %c to hexadecimal number" char))))
122 (defun skk-make-string (n1 n2)
123 (char-to-string (skk-make-char skk-kcode-charset n1 n2)) )
125 (defun skk-next-n2-code (n)
126 (if (<= (setq n (1+ n)) skk-code-n2-max) n skk-code-n2-min))
128 (defun skk-previous-n2-code (n)
129 (if (<= skk-code-n2-min (setq n (1- n))) n skk-code-n2-max))
131 (defun skk-next-n1-code (n)
132 (if (<= (setq n (1+ n)) skk-code-n1-max) n skk-code-n1-min))
134 (defun skk-previous-n1-code (n)
135 (if (<= skk-code-n1-min (setq n (1- n))) n skk-code-n1-max))
137 (defun skk-input-by-code-or-menu-0 (n1 n2)
138 (if (= n1 skk-code-null)
139 (skk-input-by-code-or-menu-jump n2)
140 (skk-input-by-code-or-menu-1 n1 n2)))
142 (defun skk-input-by-code-or-menu-jump (n)
143 (let ((menu-keys1 ;
\e$BI=<(MQ$N%-!<%j%9%H$rAH$_N)$F$k!#
\e(B
144 (mapcar (function (lambda (char) (char-to-string (upcase char))))
145 skk-input-by-code-menu-keys1 ))
147 (if (< n skk-code-n1-min) (setq n skk-input-by-code-or-menu-jump-default))
148 (while (not kanji-char)
152 (list (skk-make-string n skk-code-n1-min) n skk-code-n1-min)
153 (list (skk-make-string n 177) n 177)
154 (list (skk-make-string n 193) n 193)
155 (list (skk-make-string n 209) n 209)
156 (list (skk-make-string n 225) n 225)
157 (list (skk-make-string n 241) n 241)
159 (setq n (skk-next-n1-code n))
160 (list (skk-make-string n skk-code-n1-min) n
162 (list (skk-make-string n 177) n 177)
163 (list (skk-make-string n 193) n 193)
164 (list (skk-make-string n 209) n 209)
165 (list (skk-make-string n 225) n 225)
166 (list (skk-make-string n 241) n 241))))
168 (let ((i 0) message-log-max str )
170 (setq str (concat str (nth i menu-keys1) ":" (car (nth i chars))
174 (let ((char (event-to-character (skk-read-event)))
176 (if (not (characterp char))
178 (skk-message "\"%s\"
\e$B$OM-8z$J%-!<$G$O$"$j$^$;$s!*
\e(B"
179 "\"%s\" is not valid here!" (prin1 char) )
183 (setq rest (or (memq char skk-input-by-code-menu-keys1)
184 (if (skk-lower-case-p char)
185 (memq (upcase char) skk-input-by-code-menu-keys1)
186 (memq (downcase char) skk-input-by-code-menu-keys1) ))
188 ;; 12 == (length skk-input-by-code-menu-keys1)
189 (nth (- 12 (length rest)) chars)
195 (if (< (setq n (- n-org 2)) skk-code-n1-min)
196 (setq n skk-code-n1-max))
199 (setq n (skk-next-n1-code n))
203 (concat "
\e$B!X
\e(B%s
\e$B!Y
\e(B EUC: %2x%2x (%3d, %3d), JIS: %2x%2x (%3d, %3d) "
204 "[
\e$B2?$+%-!<$r2!$7$F$/$@$5$$
\e(B]" )
205 (concat "
\e$B!X
\e(B%s
\e$B!Y
\e(B EUC: %2x%2x (%3d, %3d), JIS: %2x%2x (%3d, %3d) "
206 "[Hit any key to continue]" )
208 n-org skk-code-n1-min n-org skk-code-n1-min
209 (- n-org 128) (- skk-code-n1-min 128)
210 (- n-org 128) (- skk-code-n1-min 128) )
215 (skk-message "\"%c\"
\e$B$OM-8z$J%-!<$G$O$"$j$^$;$s!*
\e(B"
216 "\"%c\" is not valid here!" char )
221 (setq skk-input-by-code-or-menu-jump-default (car (cdr kanji-char)))
222 (skk-input-by-code-or-menu-1
223 (car (cdr kanji-char)) (car (cdr (cdr kanji-char))) )))
225 (defun skk-input-by-code-or-menu-1 (n1 n2)
226 (let ((menu-keys2 ;
\e$BI=<(MQ$N%-!<%j%9%H$rAH$_N)$F$k!#
\e(B
227 (mapcar (function (lambda (char) (char-to-string (upcase char))))
228 skk-input-by-code-menu-keys2 ))
230 (while (not kanji-char)
231 (let ((n1-org n1) (n2-org n2) (i 0)
232 (chars (list (skk-make-string n1 n2))))
233 ;; 16 == (length skk-input-by-code-menu-keys2)
236 (progn (setq n2 (skk-next-n2-code n2))
237 (if (= n2 skk-code-n2-min)
238 (setq n1 (skk-next-n1-code n1)))
239 (skk-make-string n1 n2))))
242 (let ((i 0) message-log-max str )
244 (setq str (concat str (nth i menu-keys2) ":" (nth i chars) " "))
247 (let ((char (event-to-character (skk-read-event)))
249 (if (not (characterp char))
251 (skk-message "\"%s\"
\e$B$OM-8z$J%-!<$G$O$"$j$^$;$s!*
\e(B"
252 "\"%s\" is not valid here!" (prin1 char) )
255 (setq n1 n1-org n2 n2-org) )
257 (or (memq char skk-input-by-code-menu-keys2)
258 (if (skk-lower-case-p char)
259 (memq (upcase char) skk-input-by-code-menu-keys2)
260 (memq (downcase char) skk-input-by-code-menu-keys2) ))
262 ;; 16 == (length skk-input-by-code-menu-keys2)
263 (nth (- 16 (length rest)) chars) )
268 (if (< (setq n2 (- n2 31)) skk-code-n2-min)
270 n1 (skk-previous-n1-code n1)))
272 ((eq char ?\040) ; space
273 (if (= (setq n2 (skk-next-n2-code n2))
275 (setq n1 (skk-next-n1-code n1)))
279 (concat "
\e$B!X
\e(B%s
\e$B!Y
\e(B EUC: %2x%2x (%3d, %3d), JIS: %2x%2x (%3d, %3d) "
280 "[
\e$B2?$+%-!<$r2!$7$F$/$@$5$$
\e(B]" )
281 (concat "
\e$B!X
\e(B%s
\e$B!Y
\e(B EUC: %2x%2x (%3d, %3d), JIS: %2x%2x (%3d, %3d) "
282 "[Hit any key to continue]" )
283 (car chars) n1-org n2-org n1-org n2-org
284 (- n1-org 128) (- n2-org 128)
285 (- n1-org 128) (- n2-org 128) )
287 (setq n1 n1-org n2 n2-org)
290 (if (= (setq n2 (skk-next-n2-code n2-org))
292 (setq n1 (skk-next-n1-code n1-org))
296 (if (= (setq n2 (skk-previous-n2-code n2-org))
298 (setq n1 (skk-previous-n1-code n1-org))
302 (skk-message "\"%c\"
\e$B$OM-8z$J%-!<$G$O$"$j$^$;$s!*
\e(B"
303 "\"%c\" is not valid here!" char )
306 (setq n1 n1-org n2 n2-org)
311 (defun skk-display-code-for-char-at-point (&optional arg)
312 "
\e$B%]%$%s%H$K$"$kJ8;z$N
\e(B EUC
\e$B%3!<%I$H
\e(B JIS
\e$B%3!<%I$rI=<($9$k!#
\e(B"
315 (skk-error "
\e$B%+!<%=%k$,%P%C%U%!$N=*C<$K$"$j$^$9
\e(B"
316 "Cursor is at the end of the buffer" )
317 (skk-display-code (buffer-substring-no-properties
318 (point) (skk-save-point (forward-char 1) (point)) ))
319 ;;
\e$B%(%3!<$7$?J8;zNs$r%+%l%s%H%P%C%U%!$KA^F~$7$J$$$h$&$K!#
\e(B
322 (defun skk-display-code (str)
324 ((memq skk-emacs-type '(xemacs mule4 mule3))
325 (let* ((char (string-to-char str))
326 (charset (char-charset char)))
328 ((memq charset '(japanese-jisx0208 japanese-jisx0208-1978))
329 (let* ((char1-j (skk-char-octet char 0))
330 (char1-k (- char1-j 32))
331 (char1-e (+ char1-j 128))
332 (char2-j (skk-char-octet char 1))
333 (char2-k (- char2-j 32))
334 (char2-e (+ char2-j 128)))
336 "
\e$B!X
\e(B%s
\e$B!Y
\e(B EUC: %2x%2x (%3d, %3d), JIS: %2x%2x (%3d, %3d), KUTEN: (%2d, %2d)"
337 str char1-e char2-e char1-e char2-e
338 char1-j char2-j char1-j char2-j char1-k char2-k)))
339 ((memq charset '(ascii latin-jisx0201))
340 (message "\"%s\" %2x (%3d)"
341 str (skk-char-octet char 0) (skk-char-octet char 0)))
343 (skk-error "
\e$BH=JL$G$-$J$$J8;z$G$9
\e(B"
344 "Cannot understand this character" )))))
347 (let (;;
\e$BJ8;zNs$r
\e(B char
\e$B$KJ,2r!#
\e(B
348 ;; (mapcar '+ str) == (append str nil)
349 (char-list (mapcar (function +) str)))
351 ((and (= (length char-list) 3)
352 (memq (car char-list) (list lc-jp lc-jpold)))
353 (let* ((char1-e (car (cdr char-list)))
354 (char1-j (- char1-e 128))
355 (char1-k (- char1-j 32))
356 (char2-e (car (cdr (cdr char-list))))
357 (char2-j (- char2-e 128))
358 (char2-k (- char2-j 32)))
360 "
\e$B!X
\e(B%s
\e$B!Y
\e(B EUC: %2x%2x (%3d, %3d), JIS: %2x%2x (%3d, %3d), KUTEN: (%2d, %2d)"
361 str char1-e char2-e char1-e char2-e
362 char1-j char2-j char1-j char2-j char1-k char2-k)))
363 ((or (= (length char-list) 1) ; ascii character
364 (memq (car char-list) (list lc-ascii lc-roman)))
365 (let ((char (car char-list)))
366 (message "\"%c\" %2x (%3d)" char char char) ))
368 (skk-error "
\e$BH=JL$G$-$J$$J8;z$G$9
\e(B"
369 "Cannot understand this character" )))))))
371 (run-hooks 'skk-kcode-load-hook)
374 ;;; skk-kcode.el ends here