(sj3): New group.
[elisp/egg.git] / egg.el
1 ;;; egg.el --- EGG Input Method Architecture
2
3 ;; Copyright (C) 1997, 1998 Mule Project, Powered by Electrotechnical
4 ;; Laboratory, JAPAN.
5 ;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
6
7 ;; Author: NIIBE Yutaka <gniibe@mri.co.jp>
8 ;;         KATAYAMA Yoshio <kate@pfu.co.jp>
9 ;; Maintainer: NIIBE Yutaka <gniibe@mri.co.jp>
10 ;; Keywords: mule, multilingual, input method
11
12 ;; This file will be part of GNU Emacs (in future).
13
14 ;; EGG 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 version 2, or (at your option)
17 ;; any later version.
18
19 ;; EGG 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.
23
24 ;; You should have received a copy of the GNU General Public License
25 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
26 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
27 ;; Boston, MA 02111-1307, USA.
28
29 ;;; Commentary:
30
31 ;;; Code:
32 (defvar egg-mode-preference t
33   "Non-nil if modefull.")
34
35 (defvar egg-default-language "Japanese")
36 (defvar egg-last-method-name)
37 (make-variable-buffer-local 'egg-last-method-name)
38 (defvar egg-mode-line-title)
39 (make-variable-buffer-local 'egg-mode-line-title)
40
41 ;;;###autoload
42 (defun egg-mode (&rest arg)
43   "Toggle EGG  mode.
44 \\[describe-bindings]
45 "
46   (interactive "P")
47   (if (null arg)
48       ;; Turn off
49       (progn
50         (cond
51          ((its-in-fence-p)
52           (its-exit-mode))
53          ((egg-get-bunsetsu-info (point))
54           (egg-exit-conversion)))
55         (setq describe-current-input-method-function nil)
56         (setq current-input-method nil)
57         (let ((orig-local-map (keymap-parent (current-local-map))))
58           (use-local-map orig-local-map))
59         (run-hooks 'input-method-inactivate-hook))
60     ;; Turn on
61     (if (null (string= (car arg) egg-last-method-name))
62         (progn
63           (funcall (nth 1 arg))
64          (setq egg-default-language its-current-language)))
65     (setq egg-last-method-name (car arg))
66     (use-local-map (if egg-mode-preference
67                        (egg-modefull-map)
68                      (egg-modeless-map)))
69     (setq inactivate-current-input-method-function 'egg-mode)
70     (setq describe-current-input-method-function 'egg-help)
71     (run-hooks 'input-method-activate-hook))
72   (force-mode-line-update))
73
74 (defun egg-set-mode-line-title (title)
75   (setq egg-mode-line-title title)
76   (force-mode-line-update))
77
78 (defun egg-check-language (lang)
79   (if (null (member lang egg-support-languages))
80       (error "%S is not supported" lang)))
81
82 (defun egg-modefull-map ()
83   "Generate modefull keymap for EGG mode."  
84   (let ((map (make-sparse-keymap))
85         (i 33))
86     (define-key map "\C-_" 'egg-jis-code-input)
87     (while (< i 127)
88       (define-key map (vector i) 'egg-self-insert-char)
89       (setq i (1+ i)))
90     (set-keymap-parent map (current-local-map))
91     map))
92
93 (defun egg-modeless-map ()
94   "Generate modeless keymap for EGG mode."
95   (let ((map (make-sparse-keymap)))
96     (define-key map " " 'mlh-space-bar-backward-henkan)
97     (define-key map "\C-_" 'egg-jis-code-input)
98     (set-keymap-parent map (current-local-map))
99     map))
100
101 (defun egg-self-insert-char ()
102   (interactive)
103   (its-start last-command-char))
104 \f
105 (defun egg-hinshi-select ()
106  (menudiag-select ; Should generate at initialization time
107   '(menu  "\e$BIJ;lL>\e(B:"
108           (("\e$BIaDLL>;l\e(B" .
109             (menu  "\e$BIJ;lL>\e(B[\e$BIaDLL>;l\e(B]:"
110                    ("\e$BL>;l\e(B" "\e$B%59T\e(B(\e$B$9$k\e(B)&\e$BL>;l\e(B" "\e$B0lCJ\e(B&\e$BL>;l\e(B"
111                     "\e$B7AMFF0;l\e(B&\e$BL>;l\e(B" "\e$B?t;l\e(B")))
112            ("\e$B8GM-L>;l\e(B" .
113             (menu  "\e$BIJ;lL>\e(B[\e$B8GM-L>;l\e(B]:"
114                    ("\e$B?ML>\e(B" "\e$BCOL>\e(B" "\e$B?ML>\e(B&\e$BCOL>\e(B" "\e$B8GM-L>;l\e(B")))
115            ("\e$BF0;l\e(B" .
116             (menu  "\e$BIJ;lL>\e(B[\e$BF0;l\e(B]:"
117                    ("\e$B0lCJ\e(B" "\e$B0lCJ\e(B&\e$BL>;l\e(B" "\e$B%+9T8^CJ\e(B" "\e$B%,9T8^CJ\e(B"
118                     "\e$B%59T8^CJ\e(B" "\e$B%?9T8^CJ\e(B")))
119            ("\e$BFC<l$JF0;l\e(B" .
120             (menu  "\e$BIJ;lL>\e(B[\e$BFC<l$JF0;l\e(B]:"
121                    ("\e$B%+9T\e(B(\e$B9T$/\e(B)" "\e$B%i9T\e(B(\e$B2<$5$$\e(B)" "\e$BMh\e(B(\e$B$3\e(B)"
122                     "\e$BMh\e(B(\e$B$-\e(B)" "\e$BMh\e(B(\e$B$/\e(B)" "\e$B0Y\e(B(\e$B$7\e(B)")))
123            ("\e$BF0;l0J30$NMQ8@\e(B" .
124             (menu  "\e$BIJ;lL>\e(B[\e$BF0;l0J30$NMQ8@\e(B]:"
125                    ("\e$B7AMF;l\e(B" "\e$B7AMFF0;l\e(B" "\e$B7AMFF0;l\e(B&\e$BL>;l\e(B"
126                     "\e$B7AMFF0;l\e(B(\e$B$?$k\e(B)")))))))
127
128 ;; XXX: Should use backend interface
129 (defun egg-toroku-region (start end)
130   (interactive "r")
131   (let* ((env (wnn-get-environment wnn-dictionary-specification)) ; XXX
132          (kanji (buffer-substring start end))
133          (yomi (read-multilingual-string 
134                 (format "\e$B<-=qEPO?!X\e(B%s\e$B!Y\e(B  \e$BFI$_\e(B:" kanji)))
135          (dic (menudiag-select (list 'menu "\e$BEPO?<-=qL>\e(B:"
136                                  ;; XXX
137                                  (wnn-list-writable-dictionaries-byname env))))
138          (dic-name (wnn-dict-name dic))
139          (hinshi (egg-hinshi-select))
140          (hinshi-id (wnn-hinshi-number env hinshi)))
141     (if (y-or-n-p
142          (format "\e$B<-=q9`L\!X\e(B%s\e$B!Y\e(B(%s: %s)\e$B$r\e(B %s \e$B$KEPO?$7$^$9\e(B"
143                  kanji yomi hinshi dic-name))
144         (let ((r (wnn-add-word env dic yomi kanji "" hinshi-id 0)))
145           (if (< r 0)
146             (error "\e$B<-=qEPO?!X\e(B%s\e$B!Y\e(B(%s: %s) %s \e$B$K<:GT$7$^$7$?\e(B: %s"
147                    kanji yomi hinshi dic-name
148                    (wnnrpc-get-error-message (- r)))
149             (message 
150              "\e$B<-=q9`L\!X\e(B%s\e$B!Y\e(B(%s: %s)\e$B$r\e(B %s \e$B$KEPO?$7$^$7$?\e(B" 
151              kanji yomi hinshi dic-name))))))
152 \f
153 ;;;
154 ;;; auto fill controll
155 ;;;
156
157 (defun egg-do-auto-fill ()
158   (if (and auto-fill-function (> (current-column) fill-column))
159       (let ((ocolumn (current-column)))
160         (funcall auto-fill-function)
161         (while (and (< fill-column (current-column))
162                     (< (current-column) ocolumn))
163           (setq ocolumn (current-column))
164           (funcall auto-fill-function)))))
165
166 (require 'its)
167 (require 'menudiag)
168 (require 'egg-mlh)
169 (require 'egg-cnv)
170 (require 'egg-com)
171 (require 'custom)
172
173 (defgroup egg nil
174   "Tamagotchy --- EGG Versio 4.0")
175
176 ;;(load-library "its/hira")
177 ;;(setq-default its-current-map its-hira-map)
178
179 ;;(load-library "egg/wnn")
180 ;;(load-library "egg/wnnrpc")
181 ;;(setq egg-conversion-backend wnn-conversion-backend)
182
183 ;;(load-library "egg/sj3rpc")
184 ;;(load-library "egg/sj3")
185 ;;(setq egg-conversion-backend sj3-conversion-backend)
186
187 (defvar egg-support-languages nil)
188
189 (defun egg-set-support-languages (langs)
190   (while langs
191     (if (null (member (car langs) egg-support-languages))
192         (setq egg-support-languages (cons (car langs) egg-support-languages)))
193     (setq langs (cdr langs))))
194
195 (add-hook 'kill-emacs-hook 'egg-kill-emacs-function)
196 (defun egg-kill-emacs-function ()
197   (egg-finalize-backend))
198
199 (provide 'egg)
200
201 ;;; egg.el ends here