1 ;;; -*- coding: iso-2022-7bit -*-
2 ;;; egg-sim.el --- EGG Simple Input Method
4 ;; Copyright (C) 2000 Electrotechnical Laboratory, JAPAN.
5 ;; Licensed to the Free Software Foundation.
6 ;; Copyright (C) 2000 TOMURA Satoru <tomura@etl.go.jp>
9 ;; Author: TOMURA Satoru <tomura@etl.go.jp>
11 ;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
13 ;; Keywords: mule, multilingual, input method
15 ;; This file is part of EGG.
17 ;; EGG is free software; you can redistribute it and/or modify
18 ;; it under the terms of the GNU General Public License as published by
19 ;; the Free Software Foundation; either version 2, or (at your option)
22 ;; EGG is distributed in the hope that it will be useful,
23 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
24 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 ;; GNU General Public License for more details.
27 ;; You should have received a copy of the GNU General Public License
28 ;; along with GNU Emacs; see the file COPYING. If not, write to the
29 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
30 ;; Boston, MA 02111-1307, USA.
36 ;;; This code is based on egg-jsymbol.el of Egg V3.
38 ;;; 92.10.18 modified for Mule Ver.0.9.6 by K.Handa <handa@etl.go.jp>
40 ;;; 92.12.26 modified for Mule Ver.0.9.7 by T.Shingu <shingu@cpr.canon.co.jp>
41 ;;; JIS Hojo Kanji support.
47 (defun make-char-list (charset &optional from to)
49 (chars (charset-chars charset))
51 (setq min (if (= chars 96) 32 33)
52 max (if (= chars 96) 127 126))
53 (setq from (if from (+ min (1- from)) min)
54 to (if to (+ min (1- to)) max))
57 (cond ((= (charset-dimension charset) 1)
59 (setq result (cons (char-to-string
60 (make-char charset to))
64 ((= (charset-dimension charset) 2)
68 (setq result (cons (char-to-string
69 (make-char charset to code))
75 (defvar egg-sim-ascii-menu
76 '(menu "ASCII:" ,(make-char-list 'ascii)))
78 (defvar egg-sim-latin-1-menu
79 `(menu "ISO 8859-1:" ,(make-char-list 'latin-iso8859-1)))
81 (defvar egg-sim-latin-2-menu
82 `(menu "ISO 8859-2:" ,(make-char-list 'latin-iso8859-2)))
84 (defvar egg-sim-latin-3-menu
85 `(menu "ISO 8859-3:" ,(make-char-list 'latin-iso8859-3)))
87 (defvar egg-sim-latin-4-menu
88 `(menu "ISO 8859-4:" ,(make-char-list 'latin-iso8859-4)))
90 (defvar egg-sim-latin-5-menu
91 `(menu "ISO 8859-9:" ,(make-char-list 'latin-iso8859-9)))
93 (defvar egg-sim-cyrillic-menu
94 `(menu "ISO 8859-5:" ,(make-char-list 'cyrillic-iso8859-5)))
96 (defvar egg-sim-arabic-menu
97 `(menu "ISO 8859-6:" ,(make-char-list 'arabic-iso8859-6)))
99 (defvar egg-sim-greek-menu
100 `(menu "ISO 8859-7:" ,(make-char-list 'greek-iso8859-7)))
102 (defvar egg-sim-hebrew-menu
103 `(menu "ISO 8859-8:" ,(make-char-list 'hebrew-iso8859-8)))
105 (defvar egg-sim-thai-menu
106 `(menu "TIS620.2529:" ,(make-char-list 'thai-tis620)))
108 (defvar egg-sim-lao-menu
109 `(menu "lao:" ,(make-char-list 'lao)))
111 (defvar egg-sim-vietnamese-menu
116 "a" "
\e,1`
\e(B" "
\e,1d
\e(B" "
\e,1c
\e(B" "
\e,1a
\e(B" "
\e,1U
\e(B"
117 "
\e,1e
\e(B" "
\e,1"
\e(B" "
\e,1F
\e(B" "
\e,1G
\e(B" "
\e,1!
\e(B" "
\e,1#
\e(B"
118 "
\e,1b
\e(B" "
\e,1%
\e(B" "
\e,1&
\e(B" "
\e,1g
\e(B" "
\e,1$
\e(B" "
\e,1'
\e(B"
119 "e" "
\e,1i
\e(B" "
\e,1k
\e(B" "
\e,1(
\e(B" "
\e,1h
\e(B" "
\e,1)
\e(B"
120 "
\e,1j
\e(B" "
\e,1*
\e(B" "
\e,1,
\e(B" "
\e,1-
\e(B" "
\e,1+
\e(B" "
\e,1.
\e(B"
121 "i" "
\e,1m
\e(B" "
\e,1o
\e(B" "
\e,1n
\e(B" "
\e,1l
\e(B" "
\e,18
\e(B"
122 "o" "
\e,1s
\e(B" "
\e,1v
\e(B" "
\e,1u
\e(B" "
\e,1r
\e(B" "
\e,1w
\e(B"
123 "
\e,1t
\e(B" "
\e,1/
\e(B" "
\e,11
\e(B" "
\e,12
\e(B" "
\e,10
\e(B" "
\e,15
\e(B"
124 "
\e,1=
\e(B" "
\e,1>
\e(B" "
\e,17
\e(B" "
\e,1^
\e(B" "
\e,16
\e(B" "
\e,1~
\e(B"
125 "u" "
\e,1z
\e(B" "
\e,1|
\e(B" "
\e,1{
\e(B" "
\e,1y
\e(B" "
\e,1x
\e(B"
126 "
\e,1_
\e(B" "
\e,1Q
\e(B" "
\e,1X
\e(B" "
\e,1f
\e(B" "
\e,1W
\e(B" "
\e,1q
\e(B"
127 "y" "
\e,1}
\e(B" "
\e,1V
\e(B" "
\e,1[
\e(B" "
\e,1O
\e(B" "
\e,1\
\e(B"
129 "A" "
\e,2`
\e(B" "
\e,2d
\e(B" "
\e,2c
\e(B" "
\e,2a
\e(B" "
\e,2U
\e(B"
130 "
\e,2e
\e(B" "
\e,2"
\e(B" "
\e,2F
\e(B" "
\e,2G
\e(B" "
\e,2!
\e(B" "
\e,2#
\e(B"
131 "
\e,2b
\e(B" "
\e,2%
\e(B" "
\e,2&
\e(B" "
\e,2g
\e(B" "
\e,2$
\e(B" "
\e,2'
\e(B"
132 "E" "
\e,2h
\e(B" "
\e,2k
\e(B" "
\e,2(
\e(B" "
\e,2i
\e(B" "
\e,2)
\e(B"
133 "
\e,2j
\e(B" "
\e,2+
\e(B" "
\e,2,
\e(B" "
\e,2-
\e(B" "
\e,2*
\e(B" "
\e,2.
\e(B"
134 "I" "
\e,2l
\e(B" "
\e,2o
\e(B" "
\e,2n
\e(B" "
\e,2m
\e(B" "
\e,28
\e(B"
135 "O" "
\e,2r
\e(B" "
\e,2v
\e(B" "
\e,2u
\e(B" "
\e,2s
\e(B" "
\e,2w
\e(B"
136 "
\e,2t
\e(B" "
\e,20
\e(B" "
\e,21
\e(B" "
\e,22
\e(B" "
\e,2/
\e(B" "
\e,25
\e(B"
137 "
\e,2=
\e(B" "
\e,26
\e(B" "
\e,27
\e(B" "
\e,2^
\e(B" "
\e,2>
\e(B" "
\e,2~
\e(B"
138 "U" "
\e,2y
\e(B" "
\e,2|
\e(B" "
\e,2{
\e(B" "
\e,2z
\e(B" "
\e,2x
\e(B"
139 "
\e,2_
\e(B" "
\e,2W
\e(B" "
\e,2X
\e(B" "
\e,2f
\e(B" "
\e,2Q
\e(B" "
\e,2q
\e(B"
140 "Y" "
\e,2O
\e(B" "
\e,2V
\e(B" "
\e,2[
\e(B" "
\e,2}
\e(B" "
\e,2\
\e(B"
142 "
\e,2p
\e(B" "
\e,1p
\e(B"
145 ("VISCII1.1(lower-case)" .
146 (menu "VISCII1.1 lower-case:"
147 ,(make-char-list 'vietnamese-viscii-lower)))
148 ("VISCII1.1(upper-case)" .
149 (menu "VISCII1.1 upper-case:"
150 ,(make-char-list 'vietnamese-viscii-upper))))))
152 (defvar egg-sim-chinese-big5-menu
155 (menu "Big 5 Level1:" , (make-char-list 'chinese-big5-1)))
157 (menu "Big 5 Level2:" , (make-char-list 'chinese-big5-2))))))
159 (defvar egg-sim-chinese-cns-menu
162 (menu "CNS 11643-1:" ,(make-char-list 'chinese-cns11643-1)))
164 (menu "CNS 11643-2:" ,(make-char-list 'chinese-cns11643-2)))
166 (menu "CNS 11643-3:" ,(make-char-list 'chinese-cns11643-3)))
168 (menu "CNS 11643-4:" ,(make-char-list 'chinese-cns11643-4)))
170 (menu "CNS 11643-5:" ,(make-char-list 'chinese-cns11643-5)))
172 (menu "CNS 11643-6:" ,(make-char-list 'chinese-cns11643-6)))
174 (menu "CNS 11643-7:" ,(make-char-list 'chinese-cns11643-7))))))
176 (defvar egg-sim-chinese-gb-menu
179 (menu "GB 2312:" ,(make-char-list 'chinese-gb2312)))
181 (menu "GB2312/1:" ,(make-char-list 'chinese-gb2312 1 1)))
183 (menu "GB2312/2:" ,(make-char-list 'chinese-gb2312 2 2)))
185 (menu "GB2312/3:" ,(make-char-list 'chinese-gb2312 3 3)))
187 (menu "GB2312/4:" ,(make-char-list 'chinese-gb2312 4 4)))
189 (menu "GB2312/5:" ,(make-char-list 'chinese-gb2312 5 5)))
191 (menu "GB2312/6:" ,(make-char-list 'chinese-gb2312 6 6)))
193 (menu "GB2312/7:" ,(make-char-list 'chinese-gb2312 7 7)))
195 (menu "GB2312/8:" ,(make-char-list 'chinese-gb2312 8 8)))
197 (menu "GB2312/9:" ,(make-char-list 'chinese-gb2312 9 9)))
200 (defvar egg-sim-chinese-menu
202 (("GB2312" . , egg-sim-chinese-gb-menu)
203 ("CNS11643" . , egg-sim-chinese-cns-menu)
204 ("Big5" . , egg-sim-chinese-big5-menu))))
206 (defvar egg-sim-korean-menu
209 (menu "KSC 5601:" ,(make-char-list 'korean-ksc5601)))
211 (menu "KSC 5601/1-2:" ,(make-char-list 'korean-ksc5601 1 2)))
213 (menu "KSC 5601/3:" , (make-char-list 'korean-ksc5601 3 3)))
215 (menu "KSC 5601/4:" , (make-char-list 'korean-ksc5601 4 4)))
216 ("Roman Number/Greek" .
217 (menu "KSC 5601/5:" , (make-char-list 'korean-ksc5601 5 5)))
219 (menu "KSC 5601/6:" , (make-char-list 'korean-ksc5601 6 6)))
221 (menu "KSC 5601/7:" , (make-char-list 'korean-ksc5601 7 7)))
223 (menu "KSC 5601/8-9:" , (make-char-list 'korean-ksc5601 8 9)))
225 (menu "KSC 5601/10:" , (make-char-list 'korean-ksc5601 10 10)))
227 (menu "KSC 5601/11:" , (make-char-list 'korean-ksc5601 11 11)))
229 (menu "KSC 5601/12:" , (make-char-list 'korean-ksc5601 12 12)))
231 (menu "KSC 5601/16-40:" , (make-char-list 'korean-ksc5601 16 40)))
233 (menu "KSC 5601/42-93:" , (make-char-list 'korean-ksc5601 42 93))))))
235 (defvar egg-sim-japanese-menu
239 ,(append (make-char-list 'latin-jisx0201)
240 (make-char-list 'katakana-jisx0201))))
242 (menu "JIS X 0208:" ,(make-char-list 'japanese-jisx0208)))
244 (menu "JIS X 0212:" ,(make-char-list 'japanese-jisx0212)))
246 (menu "
\e$B5-9fF~NO
\e(B:"
247 (("JIS
\e$BF~NO
\e(B" . japanese-jisx0208)
249 (menu "
\e$B5-9f
\e(B:" , (make-char-list 'japanese-jisx0208 1 2)))
251 (menu "
\e$B1Q?t;z
\e(B:" , (make-char-list 'japanese-jisx0208 3 3)))
252 ("
\e$B$R$i$,$J
\e(B" .
253 (menu "
\e$B$R$i$,$J
\e(B:" , (make-char-list 'japanese-jisx0208 4 4)))
254 ("
\e$B%+%?%+%J
\e(B" .
255 (menu "
\e$B%+%?%+%J
\e(B:" , (make-char-list 'japanese-jisx0208 5 5)))
256 ("
\e$B%.%j%7%cJ8;z
\e(B" .
257 (menu "
\e$B%.%j%7%cJ8;z
\e(B:" , (make-char-list 'japanese-jisx0208 6 6)))
258 ("
\e$B%-%j%kJ8;z
\e(B" .
259 (menu "
\e$B%-%j%kJ8;z
\e(B:" , (make-char-list 'japanese-jisx0208 7 7)))
261 (menu "
\e$B7S@~
\e(B:" , (make-char-list 'japanese-jisx0208 8 8)))
262 ;;;"
\e$BIt<sF~NO
\e(B" (bushyu-input)
263 ;;; "
\e$B2h?tF~NO
\e(B" (kakusuu-input)
264 ("
\e$BBh0l?e=`
\e(B" .
265 (menu "
\e$BBh0l?e=`
\e(B:" , (make-char-list 'japanese-jisx0208 16 47)))
266 ("
\e$BBhFs?e=`
\e(B" .
267 (menu "
\e$BBhFs?e=`
\e(B:" , (make-char-list 'japanese-jisx0208 48 84)))
268 ("
\e$BJd=u4A;z
\e(B" .
269 (menu "
\e$BJd=u4A;z
\e(B:" , (make-char-list 'japanese-jisx0212 2 77)))))))))
271 (defvar egg-sim-ipa-menu
272 `(menu "IPA:" ,(make-char-list 'ipa)))
274 (defvar egg-sisheng-menu
275 `(menu "SiSheng characters" ,(make-char-list 'chinese-sisheng)))
277 (defvar egg-sim-code-input-menu
279 (("JISX0208" . japanese-jisx0208)
280 ("JISX0212" . japanese-jisx0212)
281 ("CNS11643-1" . chinese-cns11634-1)
282 ("CNS11643-2" . chinese-cns11634-2)
283 ("CNS11643-3" . chinese-cns11634-3)
284 ("CNS11643-4" . chinese-cns11634-4)
285 ("CNS11643-5" . chinese-cns11634-5)
286 ("CNS11643-6" . chinese-cns11634-6)
287 ("CNS11643-7" . chinese-cns11634-7)
288 ("Big5-1" . chinese-big5-1)
289 ("Big5-2" . chinese-big5-2)
290 ("GB2312" . chinese-gb2312)
291 ("KSC5601" . korean-ksc5601))))
293 (defvar egg-simple-input-method-menu-item-list
294 `(("Code Input" . ,egg-sim-code-input-menu)
295 ("Arabic" . , egg-sim-arabic-menu)
296 ("ASCII" . , egg-sim-ascii-menu)
297 ("Chinese" . , egg-sim-chinese-menu)
298 ("Cyrillic" . , egg-sim-cyrillic-menu)
299 ("Greek" . , egg-sim-greek-menu)
300 ("Hebrew" . , egg-sim-hebrew-menu)
301 ("Japanese" . , egg-sim-japanese-menu)
302 ("Korean" . , egg-sim-korean-menu)
305 (("Latin-1" . , egg-sim-latin-1-menu)
306 ("Latin-2" . , egg-sim-latin-2-menu)
307 ("Latin-3" . , egg-sim-latin-3-menu)
308 ("Latin-4" . , egg-sim-latin-4-menu)
309 ("Latin-5" . , egg-sim-latin-5-menu))))
312 (("Thai" . , egg-sim-thai-menu)
313 ("Lao" . , egg-sim-lao-menu))))
314 ("Vietnamese" . , egg-sim-vietnamese-menu)
316 (menu "Phonetic code:"
317 (("SISHENG" . , egg-sisheng-menu)
318 ("IPA" . , egg-sim-ipa-menu))))
321 (defvar egg-language-environment-alist
322 `(("ASCII" . , egg-sim-ascii-menu)
323 ("Chinese-BIG5" . , egg-sim-chinese-big5-menu)
324 ("Chinese-CNS" . , egg-sim-chinese-cns-menu)
325 ("Chinese-GB" . , egg-sim-chinese-gb-menu)
326 ("Cyrillic-ISO" . , egg-sim-cyrillic-menu)
327 ("Cyrillic-KOI8" . , egg-sim-cyrillic-menu)
328 ("Cyrillic-ALT" . , egg-sim-cyrillic-menu)
329 ("Czech" . , egg-sim-latin-2-menu)
331 ("English" . , egg-sim-ascii-menu)
333 ("German" . , egg-sim-latin-1-menu)
334 ("Greek" . , egg-sim-greek-menu)
335 ("Hebrew" . , egg-sim-hebrew-menu)
337 ("IPA" . , egg-sim-ipa-menu)
338 ("Japanese" . , egg-sim-japanese-menu)
339 ("Korean" . , egg-sim-korean-menu)
340 ("Lao" . , egg-sim-lao-menu)
341 ("Latin-1" . , egg-sim-latin-1-menu)
342 ("Latin-2" . , egg-sim-latin-2-menu)
343 ("Latin-3" . , egg-sim-latin-3-menu)
344 ("Latin-4" . , egg-sim-latin-4-menu)
345 ("Latin-5" . , egg-sim-latin-5-menu)
346 ("Romaian" . , egg-sim-latin-2-menu)
347 ("Slovenian" . , egg-sim-latin-2-menu)
348 ("Slovak" . , egg-sim-latin-2-menu)
349 ("Thai" . , egg-sim-thai-menu)
351 ("Turkish" . , egg-sim-latin-5-menu)
352 ("Vietnamese" . , egg-sim-vietnamese-menu)))
354 (defvar egg-simple-input-method-menu
355 `(menu "Character set:" , egg-simple-input-method-menu-item-list))
358 (defun egg-simple-input-method()
360 (let ((result (egg-simple-input-menu)))
361 (cond((stringp result)
364 (egg-character-code-input result
365 (format "%s/Character Code in Hexadecimal:"
366 (charset-description result)))))))
368 (defun egg-simple-input-menu ()
369 (let ((menu (cdr-safe (assoc current-language-environment
370 egg-language-environment-alist))))
373 `(menu "Character set:" ,(cons (cons current-language-environment
375 egg-simple-input-method-menu-item-list)))
376 (menudiag-select egg-simple-input-method-menu))))
378 (defun egg-character-code-input (charset prompt)
379 (egg-insert-character-code-from-minibuffer charset prompt))
381 (defun egg-insert-character-code-from-minibuffer (charset prompt)
382 (let ((str (read-from-minibuffer prompt)) val)
383 (while (null (setq val (egg-read-character-code-from-string str charset)))
385 (setq str (read-from-minibuffer prompt str)))
386 (insert (make-char charset (car val) (cdr val)))))
388 (defun egg-hexadigit-value (ch)
389 (cond((and (<= ?0 ch) (<= ch ?9))
391 ((and (<= ?a ch) (<= ch ?f))
393 ((and (<= ?A ch) (<= ch ?F))
396 (defun egg-read-character-code-from-string (str charset)
397 (if (and (= (length str) 4)
398 (<= 2 (egg-hexadigit-value (aref str 0)))
399 (egg-hexadigit-value (aref str 1))
400 (<= 2 (egg-hexadigit-value (aref str 2)))
401 (egg-hexadigit-value (aref str 3)))
402 (let ((code1 (+ (* 16 (egg-hexadigit-value (aref str 0)))
403 (egg-hexadigit-value (aref str 1))))
404 (code2 (+ (* 16 (egg-hexadigit-value (aref str 2)))
405 (egg-hexadigit-value (aref str 3))))
406 (min (if (= (charset-chars charset) 94)
408 (max (if (= (charset-chars charset) 94)
414 (cons code1 code2)))))
420 (defun make-non-iso2022-code-table-file (name)
422 (set-buffer-multibyte nil)
423 (insert ";;; -*- coding: -*-\n\n")
428 (insert (format " %X " i))
435 (insert (format "----" i))
441 (insert (format "%X|" i))
444 (insert (format " \"%c\"" c))
447 (insert (format "\n")))
450 (defun make-iso2022-94char-code-table-file (name)
452 (set-buffer-multibyte nil)
453 (insert ";;; -*- coding: -*-\n\n")
457 (insert (format " %X " i))
464 (insert (format "----" i))
470 (insert (format "%X|" i))
479 (insert (format " \"%c\"" c)))
482 (insert (format "\n")))
485 (defun make-iso2022-96char-code-table-file (name)
487 (set-buffer-multibyte nil)
488 (insert ";;; -*- coding: -*-\n\n")
492 (insert (format " %X " i))
499 (insert (format "----" i))
505 (insert (format "%X|" i))
513 (insert (format " \"%c\"" c)))
516 (insert (format "\n")))
519 (defun make-euc-code-table-file (name)
521 (set-buffer-multibyte nil)
522 (insert ";;; -*- coding: -*-\n\n")
527 (insert (format " %02d " i))
534 (insert (format "-----" i))
540 (insert (format "%02d|" i))
543 (insert (format " \"%c%c\""
547 (insert (format "\n")))