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>
7 ;; 2015 Mitsutoshi NAKANO <bkbin005@rinku.zaq.ne.jp>
9 ;; Author: TOMURA Satoru <tomura@etl.go.jp>
11 ;; Keywords: mule, multilingual, input method
13 ;; This file is part of EGG.
15 ;; EGG is free software; you can redistribute it and/or modify
16 ;; it under the terms of the GNU General Public License as published by
17 ;; the Free Software Foundation; either version 2, or (at your option)
20 ;; EGG is distributed in the hope that it will be useful,
21 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 ;; GNU General Public License for more details.
25 ;; You should have received a copy of the GNU General Public License
26 ;; along with GNU Emacs; see the file COPYING. If not, write to the
27 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
28 ;; Boston, MA 02111-1307, USA.
34 ;;; This code is based on egg-jsymbol.el of Egg V3.
36 ;;; 92.10.18 modified for Mule Ver.0.9.6 by K.Handa <handa@etl.go.jp>
38 ;;; 92.12.26 modified for Mule Ver.0.9.7 by T.Shingu <shingu@cpr.canon.co.jp>
39 ;;; JIS Hojo Kanji support.
45 ;;; modified 2015.01.28 Mitsutoshi NAKANO <bkbin005@rinku.zaq.ne.jp>
46 ;;; ignore-errors in make-char
48 ;;; http://sourceforge.jp/projects/tamago-tsunagi/lists/archive/misc/2015-January/000029.html
49 ;;; http://www.gnu.org/software/emacs/manual/html_node/elisp/Handling-Errors.html
50 (defun make-char-list (charset &optional from to)
52 (chars (charset-chars charset))
54 (setq min (if (= chars 96) 32 33)
55 max (if (= chars 96) 127 126))
56 (setq from (if from (+ min (1- from)) min)
57 to (if to (+ min (1- to)) max))
60 (cond ((= (charset-dimension charset) 1)
62 (setq result (cons (ignore-errors (char-to-string
63 (make-char charset to)))
67 ((= (charset-dimension charset) 2)
71 (setq result (cons (ignore-errors
73 (make-char charset to code)))
79 (defvar egg-sim-ascii-menu
80 `(menu "ASCII:" ,(make-char-list 'ascii)))
82 (defvar egg-sim-latin-1-menu
83 `(menu "ISO 8859-1:" ,(make-char-list 'latin-iso8859-1)))
85 (defvar egg-sim-latin-2-menu
86 `(menu "ISO 8859-2:" ,(make-char-list 'latin-iso8859-2)))
88 (defvar egg-sim-latin-3-menu
89 `(menu "ISO 8859-3:" ,(make-char-list 'latin-iso8859-3)))
91 (defvar egg-sim-latin-4-menu
92 `(menu "ISO 8859-4:" ,(make-char-list 'latin-iso8859-4)))
94 (defvar egg-sim-latin-5-menu
95 `(menu "ISO 8859-9:" ,(make-char-list 'latin-iso8859-9)))
97 (defvar egg-sim-cyrillic-menu
98 `(menu "ISO 8859-5:" ,(make-char-list 'cyrillic-iso8859-5)))
100 (defvar egg-sim-arabic-menu
101 `(menu "ISO 8859-6:" ,(make-char-list 'arabic-iso8859-6)))
103 (defvar egg-sim-greek-menu
104 `(menu "ISO 8859-7:" ,(make-char-list 'greek-iso8859-7)))
106 (defvar egg-sim-hebrew-menu
107 `(menu "ISO 8859-8:" ,(make-char-list 'hebrew-iso8859-8)))
109 (defvar egg-sim-thai-menu
110 `(menu "TIS620.2529:" ,(make-char-list 'thai-tis620)))
112 (defvar egg-sim-lao-menu
113 `(menu "lao:" ,(make-char-list 'lao)))
115 (defvar egg-sim-vietnamese-menu
120 "a" "
\e,1`
\e(B" "
\e,1d
\e(B" "
\e,1c
\e(B" "
\e,1a
\e(B" "
\e,1U
\e(B"
121 "
\e,1e
\e(B" "
\e,1"
\e(B" "
\e,1F
\e(B" "
\e,1G
\e(B" "
\e,1!
\e(B" "
\e,1#
\e(B"
122 "
\e,1b
\e(B" "
\e,1%
\e(B" "
\e,1&
\e(B" "
\e,1g
\e(B" "
\e,1$
\e(B" "
\e,1'
\e(B"
123 "e" "
\e,1i
\e(B" "
\e,1k
\e(B" "
\e,1(
\e(B" "
\e,1h
\e(B" "
\e,1)
\e(B"
124 "
\e,1j
\e(B" "
\e,1*
\e(B" "
\e,1,
\e(B" "
\e,1-
\e(B" "
\e,1+
\e(B" "
\e,1.
\e(B"
125 "i" "
\e,1m
\e(B" "
\e,1o
\e(B" "
\e,1n
\e(B" "
\e,1l
\e(B" "
\e,18
\e(B"
126 "o" "
\e,1s
\e(B" "
\e,1v
\e(B" "
\e,1u
\e(B" "
\e,1r
\e(B" "
\e,1w
\e(B"
127 "
\e,1t
\e(B" "
\e,1/
\e(B" "
\e,11
\e(B" "
\e,12
\e(B" "
\e,10
\e(B" "
\e,15
\e(B"
128 "
\e,1=
\e(B" "
\e,1>
\e(B" "
\e,17
\e(B" "
\e,1^
\e(B" "
\e,16
\e(B" "
\e,1~
\e(B"
129 "u" "
\e,1z
\e(B" "
\e,1|
\e(B" "
\e,1{
\e(B" "
\e,1y
\e(B" "
\e,1x
\e(B"
130 "
\e,1_
\e(B" "
\e,1Q
\e(B" "
\e,1X
\e(B" "
\e,1f
\e(B" "
\e,1W
\e(B" "
\e,1q
\e(B"
131 "y" "
\e,1}
\e(B" "
\e,1V
\e(B" "
\e,1[
\e(B" "
\e,1O
\e(B" "
\e,1\
\e(B"
133 "A" "
\e,2`
\e(B" "
\e,2d
\e(B" "
\e,2c
\e(B" "
\e,2a
\e(B" "
\e,2U
\e(B"
134 "
\e,2e
\e(B" "
\e,2"
\e(B" "
\e,2F
\e(B" "
\e,2G
\e(B" "
\e,2!
\e(B" "
\e,2#
\e(B"
135 "
\e,2b
\e(B" "
\e,2%
\e(B" "
\e,2&
\e(B" "
\e,2g
\e(B" "
\e,2$
\e(B" "
\e,2'
\e(B"
136 "E" "
\e,2h
\e(B" "
\e,2k
\e(B" "
\e,2(
\e(B" "
\e,2i
\e(B" "
\e,2)
\e(B"
137 "
\e,2j
\e(B" "
\e,2+
\e(B" "
\e,2,
\e(B" "
\e,2-
\e(B" "
\e,2*
\e(B" "
\e,2.
\e(B"
138 "I" "
\e,2l
\e(B" "
\e,2o
\e(B" "
\e,2n
\e(B" "
\e,2m
\e(B" "
\e,28
\e(B"
139 "O" "
\e,2r
\e(B" "
\e,2v
\e(B" "
\e,2u
\e(B" "
\e,2s
\e(B" "
\e,2w
\e(B"
140 "
\e,2t
\e(B" "
\e,20
\e(B" "
\e,21
\e(B" "
\e,22
\e(B" "
\e,2/
\e(B" "
\e,25
\e(B"
141 "
\e,2=
\e(B" "
\e,26
\e(B" "
\e,27
\e(B" "
\e,2^
\e(B" "
\e,2>
\e(B" "
\e,2~
\e(B"
142 "U" "
\e,2y
\e(B" "
\e,2|
\e(B" "
\e,2{
\e(B" "
\e,2z
\e(B" "
\e,2x
\e(B"
143 "
\e,2_
\e(B" "
\e,2W
\e(B" "
\e,2X
\e(B" "
\e,2f
\e(B" "
\e,2Q
\e(B" "
\e,2q
\e(B"
144 "Y" "
\e,2O
\e(B" "
\e,2V
\e(B" "
\e,2[
\e(B" "
\e,2}
\e(B" "
\e,2\
\e(B"
146 "
\e,2p
\e(B" "
\e,1p
\e(B"
149 ("VISCII1.1(lower-case)" .
150 (menu "VISCII1.1 lower-case:"
151 ,(make-char-list 'vietnamese-viscii-lower)))
152 ("VISCII1.1(upper-case)" .
153 (menu "VISCII1.1 upper-case:"
154 ,(make-char-list 'vietnamese-viscii-upper))))))
156 (defvar egg-sim-chinese-big5-menu
159 (menu "Big 5 Level1:" , (make-char-list 'chinese-big5-1)))
161 (menu "Big 5 Level2:" , (make-char-list 'chinese-big5-2))))))
163 (defvar egg-sim-chinese-cns-menu
166 (menu "CNS 11643-1:" ,(make-char-list 'chinese-cns11643-1)))
168 (menu "CNS 11643-2:" ,(make-char-list 'chinese-cns11643-2)))
170 (menu "CNS 11643-3:" ,(make-char-list 'chinese-cns11643-3)))
172 (menu "CNS 11643-4:" ,(make-char-list 'chinese-cns11643-4)))
174 (menu "CNS 11643-5:" ,(make-char-list 'chinese-cns11643-5)))
176 (menu "CNS 11643-6:" ,(make-char-list 'chinese-cns11643-6)))
178 (menu "CNS 11643-7:" ,(make-char-list 'chinese-cns11643-7))))))
180 (defvar egg-sim-chinese-gb-menu
183 (menu "GB 2312:" ,(make-char-list 'chinese-gb2312)))
185 (menu "GB2312/1:" ,(make-char-list 'chinese-gb2312 1 1)))
187 (menu "GB2312/2:" ,(make-char-list 'chinese-gb2312 2 2)))
189 (menu "GB2312/3:" ,(make-char-list 'chinese-gb2312 3 3)))
191 (menu "GB2312/4:" ,(make-char-list 'chinese-gb2312 4 4)))
193 (menu "GB2312/5:" ,(make-char-list 'chinese-gb2312 5 5)))
195 (menu "GB2312/6:" ,(make-char-list 'chinese-gb2312 6 6)))
197 (menu "GB2312/7:" ,(make-char-list 'chinese-gb2312 7 7)))
199 (menu "GB2312/8:" ,(make-char-list 'chinese-gb2312 8 8)))
201 (menu "GB2312/9:" ,(make-char-list 'chinese-gb2312 9 9)))
204 (defvar egg-sim-chinese-menu
206 (("GB2312" . , egg-sim-chinese-gb-menu)
207 ("CNS11643" . , egg-sim-chinese-cns-menu)
208 ("Big5" . , egg-sim-chinese-big5-menu))))
210 (defvar egg-sim-korean-menu
213 (menu "KSC 5601:" ,(make-char-list 'korean-ksc5601)))
215 (menu "KSC 5601/1-2:" ,(make-char-list 'korean-ksc5601 1 2)))
217 (menu "KSC 5601/3:" , (make-char-list 'korean-ksc5601 3 3)))
219 (menu "KSC 5601/4:" , (make-char-list 'korean-ksc5601 4 4)))
220 ("Roman Number/Greek" .
221 (menu "KSC 5601/5:" , (make-char-list 'korean-ksc5601 5 5)))
223 (menu "KSC 5601/6:" , (make-char-list 'korean-ksc5601 6 6)))
225 (menu "KSC 5601/7:" , (make-char-list 'korean-ksc5601 7 7)))
227 (menu "KSC 5601/8-9:" , (make-char-list 'korean-ksc5601 8 9)))
229 (menu "KSC 5601/10:" , (make-char-list 'korean-ksc5601 10 10)))
231 (menu "KSC 5601/11:" , (make-char-list 'korean-ksc5601 11 11)))
233 (menu "KSC 5601/12:" , (make-char-list 'korean-ksc5601 12 12)))
235 (menu "KSC 5601/16-40:" , (make-char-list 'korean-ksc5601 16 40)))
237 (menu "KSC 5601/42-93:" , (make-char-list 'korean-ksc5601 42 93))))))
239 (defvar egg-sim-japanese-menu
243 ,(append (make-char-list 'latin-jisx0201)
244 (make-char-list 'katakana-jisx0201))))
246 (menu "JIS X 0208:" ,(make-char-list 'japanese-jisx0208)))
248 (menu "JIS X 0212:" ,(make-char-list 'japanese-jisx0212)))
250 (menu "
\e$B5-9fF~NO
\e(B:"
251 (("JIS
\e$BF~NO
\e(B" . japanese-jisx0208)
253 (menu "
\e$B5-9f
\e(B:" , (make-char-list 'japanese-jisx0208 1 2)))
255 (menu "
\e$B1Q?t;z
\e(B:" , (make-char-list 'japanese-jisx0208 3 3)))
256 ("
\e$B$R$i$,$J
\e(B" .
257 (menu "
\e$B$R$i$,$J
\e(B:" , (make-char-list 'japanese-jisx0208 4 4)))
258 ("
\e$B%+%?%+%J
\e(B" .
259 (menu "
\e$B%+%?%+%J
\e(B:" , (make-char-list 'japanese-jisx0208 5 5)))
260 ("
\e$B%.%j%7%cJ8;z
\e(B" .
261 (menu "
\e$B%.%j%7%cJ8;z
\e(B:" , (make-char-list 'japanese-jisx0208 6 6)))
262 ("
\e$B%-%j%kJ8;z
\e(B" .
263 (menu "
\e$B%-%j%kJ8;z
\e(B:" , (make-char-list 'japanese-jisx0208 7 7)))
265 (menu "
\e$B7S@~
\e(B:" , (make-char-list 'japanese-jisx0208 8 8)))
266 ;;;"
\e$BIt<sF~NO
\e(B" (bushyu-input)
267 ;;; "
\e$B2h?tF~NO
\e(B" (kakusuu-input)
268 ("
\e$BBh0l?e=`
\e(B" .
269 (menu "
\e$BBh0l?e=`
\e(B:" , (make-char-list 'japanese-jisx0208 16 47)))
270 ("
\e$BBhFs?e=`
\e(B" .
271 (menu "
\e$BBhFs?e=`
\e(B:" , (make-char-list 'japanese-jisx0208 48 84)))
272 ("
\e$BJd=u4A;z
\e(B" .
273 (menu "
\e$BJd=u4A;z
\e(B:" , (make-char-list 'japanese-jisx0212 2 77)))))))))
275 (defvar egg-sim-ipa-menu
276 `(menu "IPA:" ,(make-char-list 'ipa)))
278 (defvar egg-sisheng-menu
279 `(menu "SiSheng characters" ,(make-char-list 'chinese-sisheng)))
281 (defvar egg-sim-code-input-menu
283 (("JISX0208" . japanese-jisx0208)
284 ("JISX0212" . japanese-jisx0212)
285 ("CNS11643-1" . chinese-cns11634-1)
286 ("CNS11643-2" . chinese-cns11634-2)
287 ("CNS11643-3" . chinese-cns11634-3)
288 ("CNS11643-4" . chinese-cns11634-4)
289 ("CNS11643-5" . chinese-cns11634-5)
290 ("CNS11643-6" . chinese-cns11634-6)
291 ("CNS11643-7" . chinese-cns11634-7)
292 ("Big5-1" . chinese-big5-1)
293 ("Big5-2" . chinese-big5-2)
294 ("GB2312" . chinese-gb2312)
295 ("KSC5601" . korean-ksc5601))))
297 (defvar egg-simple-input-method-menu-item-list
298 `(("Code Input" . ,egg-sim-code-input-menu)
299 ("Arabic" . , egg-sim-arabic-menu)
300 ("ASCII" . , egg-sim-ascii-menu)
301 ("Chinese" . , egg-sim-chinese-menu)
302 ("Cyrillic" . , egg-sim-cyrillic-menu)
303 ("Greek" . , egg-sim-greek-menu)
304 ("Hebrew" . , egg-sim-hebrew-menu)
305 ("Japanese" . , egg-sim-japanese-menu)
306 ("Korean" . , egg-sim-korean-menu)
309 (("Latin-1" . , egg-sim-latin-1-menu)
310 ("Latin-2" . , egg-sim-latin-2-menu)
311 ("Latin-3" . , egg-sim-latin-3-menu)
312 ("Latin-4" . , egg-sim-latin-4-menu)
313 ("Latin-5" . , egg-sim-latin-5-menu))))
316 (("Thai" . , egg-sim-thai-menu)
317 ("Lao" . , egg-sim-lao-menu))))
318 ("Vietnamese" . , egg-sim-vietnamese-menu)
320 (menu "Phonetic code:"
321 (("SISHENG" . , egg-sisheng-menu)
322 ("IPA" . , egg-sim-ipa-menu))))
325 (defvar egg-language-environment-alist
326 `(("ASCII" . , egg-sim-ascii-menu)
327 ("Chinese-BIG5" . , egg-sim-chinese-big5-menu)
328 ("Chinese-CNS" . , egg-sim-chinese-cns-menu)
329 ("Chinese-GB" . , egg-sim-chinese-gb-menu)
330 ("Cyrillic-ISO" . , egg-sim-cyrillic-menu)
331 ("Cyrillic-KOI8" . , egg-sim-cyrillic-menu)
332 ("Cyrillic-ALT" . , egg-sim-cyrillic-menu)
333 ("Czech" . , egg-sim-latin-2-menu)
335 ("English" . , egg-sim-ascii-menu)
337 ("German" . , egg-sim-latin-1-menu)
338 ("Greek" . , egg-sim-greek-menu)
339 ("Hebrew" . , egg-sim-hebrew-menu)
341 ("IPA" . , egg-sim-ipa-menu)
342 ("Japanese" . , egg-sim-japanese-menu)
343 ("Korean" . , egg-sim-korean-menu)
344 ("Lao" . , egg-sim-lao-menu)
345 ("Latin-1" . , egg-sim-latin-1-menu)
346 ("Latin-2" . , egg-sim-latin-2-menu)
347 ("Latin-3" . , egg-sim-latin-3-menu)
348 ("Latin-4" . , egg-sim-latin-4-menu)
349 ("Latin-5" . , egg-sim-latin-5-menu)
350 ("Romaian" . , egg-sim-latin-2-menu)
351 ("Slovenian" . , egg-sim-latin-2-menu)
352 ("Slovak" . , egg-sim-latin-2-menu)
353 ("Thai" . , egg-sim-thai-menu)
355 ("Turkish" . , egg-sim-latin-5-menu)
356 ("Vietnamese" . , egg-sim-vietnamese-menu)))
358 (defvar egg-simple-input-method-menu
359 `(menu "Character set:" , egg-simple-input-method-menu-item-list))
362 (defun egg-simple-input-method ()
364 (let ((result (egg-simple-input-menu)))
365 (cond((stringp result)
368 (egg-character-code-input result
369 (format "%s/Character Code in Hexadecimal:"
370 (charset-description result)))))))
372 (defun egg-simple-input-menu ()
373 (let ((menu (cdr-safe (assoc current-language-environment
374 egg-language-environment-alist))))
377 `(menu "Character set:" ,(cons (cons current-language-environment
379 egg-simple-input-method-menu-item-list)))
380 (menudiag-select egg-simple-input-method-menu))))
382 (defun egg-character-code-input (charset prompt)
383 (egg-insert-character-code-from-minibuffer charset prompt))
385 (defun egg-insert-character-code-from-minibuffer (charset prompt)
386 (let ((str (read-from-minibuffer prompt)) val)
387 (while (null (setq val (egg-read-character-code-from-string str charset)))
389 (setq str (read-from-minibuffer prompt str)))
390 (insert (make-char charset (car val) (cdr val)))))
392 (defun egg-hexadigit-value (ch)
393 (cond((and (<= ?0 ch) (<= ch ?9))
395 ((and (<= ?a ch) (<= ch ?f))
397 ((and (<= ?A ch) (<= ch ?F))
400 (defun egg-read-character-code-from-string (str charset)
401 (if (and (= (length str) 4)
402 (<= 2 (egg-hexadigit-value (aref str 0)))
403 (egg-hexadigit-value (aref str 1))
404 (<= 2 (egg-hexadigit-value (aref str 2)))
405 (egg-hexadigit-value (aref str 3)))
406 (let ((code1 (+ (* 16 (egg-hexadigit-value (aref str 0)))
407 (egg-hexadigit-value (aref str 1))))
408 (code2 (+ (* 16 (egg-hexadigit-value (aref str 2)))
409 (egg-hexadigit-value (aref str 3))))
410 (min (if (= (charset-chars charset) 94)
412 (max (if (= (charset-chars charset) 94)
418 (cons code1 code2)))))
424 (defun make-non-iso2022-code-table-file (name)
426 (set-buffer-multibyte nil)
427 (insert ";;; -*- coding: -*-\n\n")
432 (insert (format " %X " i))
439 (insert (format "----"))
445 (insert (format "%X|" i))
448 (insert (format " \"%c\"" c))
451 (insert (format "\n")))
454 (defun make-iso2022-94char-code-table-file (name)
456 (set-buffer-multibyte nil)
457 (insert ";;; -*- coding: -*-\n\n")
461 (insert (format " %X " i))
468 (insert (format "----"))
474 (insert (format "%X|" i))
483 (insert (format " \"%c\"" c)))
486 (insert (format "\n")))
489 (defun make-iso2022-96char-code-table-file (name)
491 (set-buffer-multibyte nil)
492 (insert ";;; -*- coding: -*-\n\n")
496 (insert (format " %X " i))
503 (insert (format "----"))
509 (insert (format "%X|" i))
517 (insert (format " \"%c\"" c)))
520 (insert (format "\n")))
523 (defun make-euc-code-table-file (name)
525 (set-buffer-multibyte nil)
526 (insert ";;; -*- coding: -*-\n\n")
531 (insert (format " %02d " i))
538 (insert (format "-----"))
544 (insert (format "%02d|" i))
547 (insert (format " \"%c%c\""
551 (insert (format "\n")))