Remove non-free old and crusty clearcase pkg
[packages] / mule-packages / mule-base / canna.el
1 ;;; canna.el --- Interface to the Canna input method.
2
3 ;; Copyright (C) 1994 Akira Kon, NEC Corporation.
4 ;; Copyright (C) 1996,1997,1998 MORIOKA Tomohiko
5 ;; Copyright (C) 1997 Stephen Turnbull
6
7 ;; Author: Akira Kon <kon@d1.bs2.mt.nec.co.jp>
8 ;;         MORIOKA Tomohiko <morioka@jaist.ac.jp>
9 ;;         Stephen Turnbull <turnbull@sk.tsukuba.ac.jp>
10 ;; Keywords: Canna, Japanese, input method, mule, multilingual
11
12 ;; This file is part of XEmacs.
13
14 ;; XEmacs is free software; you can redistribute it and/or modify it
15 ;; 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 ;; XEmacs is distributed in the hope that it will be useful, but
20 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22 ;; General Public License for more details.
23
24 ;; You should have received a copy of the GNU General Public License
25 ;; along with XEmacs; see the file COPYING.  If not, write to the Free
26 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27 ;; 02111-1307, USA.
28
29 ;;; Commentary:
30
31 ;; Egg offered some influences to the implementation of Canna on
32 ;; Nemacs/Mule, and this file contains a few part of Egg which is
33 ;; written by S.Tomura, Electrotechnical Lab.  (tomura@etl.go.jp)
34
35 ;; This program is rewritten for Emacs/mule and XEmacs/mule by MORIOKA
36 ;; Tomohiko.
37
38 ;;; Code:
39
40 (require 'poem)
41
42 (defvar canna-dl-module
43   (expand-file-name "canna.so" exec-directory))
44
45 (defvar canna-dl-handle
46   (and (not (boundp 'CANNA))
47        (fboundp 'dynamic-link)
48        (dynamic-link canna-dl-module)))
49
50 (and canna-dl-handle
51      (dynamic-call "emacs_canna_init" canna-dl-handle))
52  
53 ;; This defeats the bytecompiler -sb
54 ;;(or (boundp 'CANNA)
55 ;;    (featurep 'CANNA)
56 ;;    (error "Canna is not built into this Emacs"))
57
58 (defvar self-insert-after-hook nil)
59 ;; (defalias 'self-insert-internal 'self-insert-command)
60 ;; end
61
62 (defconst canna-rcs-version
63   "!Id: canna.el,v 1.9 1997/04/05 06:19:19 morioka Exp !")
64
65 (defun canna-version ()
66   "Display version of canna.el in mini-buffer."
67   (interactive)
68   (message (concat
69             (substring canna-rcs-version
70                        5
71                        (if (string-match "[0-9] [a-z]" canna-rcs-version)
72                            (1+ (match-beginning 0))
73                          ))
74             " ...")))
75
76 (if (featurep 'xemacs)
77     (defun canna-self-insert-string (string)
78       (let ((len (length string))
79             (i 0)
80             ;; \e$BA^F~$NESCf$G\e(B blink \e$B$,5/$-$k$H$&$C$H$*$7$$$N$G!"\e(B
81             ;; \e$B0l;~E*$K\e(B blink \e$B$rM^;_$9$k!#\e(B
82             (blink-matching-paren nil))
83         (while (< i len)
84           (self-insert-internal (aref canna-kakutei-string i))
85           (setq i (1+ i))
86           )))
87   (defalias 'canna-self-insert-string 'insert)
88   )
89
90
91 ;;; \e$B$+$s$J$NJQ?t\e(B
92
93 (defvar canna-save-undo-text-predicate nil)
94 (defvar canna-undo-hook nil)
95
96 (defvar canna-do-keybind-for-functionkeys t)
97 (defvar canna-use-functional-numbers nil)
98 (defvar canna-use-space-key-as-henkan-region t)
99
100 (defvar canna-server nil)
101 (defvar canna-file   nil)
102
103 (defvar canna-underline nil)
104 (defvar canna-with-fences (not canna-underline))
105
106 (defvar canna-initialize-minibuffer-state-when-exit nil
107   "*Non-nil \e$B$N$H$-$O\e(B, \e$B%_%K%P%C%U%!$rH4$1$k;~F|K\8l>uBV$r=i4|2=$9$k\e(B.")
108
109 (defvar canna-inhibit-hankakukana nil
110   "*Non-nil \e$B$N;~!";z<oJQ49$GH>3Q$+$J$KJQ49$7$J$$\e(B")
111
112 ;;;
113 ;;; \e$B%b!<%I%i%$%s$N=$@0\e(B
114 ;;;
115
116 (defvar canna:*kanji-mode-string* "[ \e$B$"\e(B ]")
117 (defvar canna:*alpha-mode-string* "\e$B$+$s$J\e(B")
118 (defvar canna:*saved-mode-string* "[ \e$B$"\e(B ]")
119
120 (defvar mode-line-canna-mode canna:*alpha-mode-string*)
121 (defvar mode-line-canna-mode-in-minibuffer canna:*alpha-mode-string*)
122
123 (defvar display-minibuffer-mode-in-minibuffer nil) ; same name as TAKANA
124\e$B$?$+$J$G$O\e(B t \e$B$,%G%U%)%k%H$@$1$I!"\e(Bnil \e$B$r%G%U%)%k%H$K$7$F$*$3$&$+$J!#\e(B
125
126 (make-variable-buffer-local 'mode-line-canna-mode)
127
128 ; select-window-hook \e$B$O\e(B mule \e$B$+$iF~$C$?$s$@$H;W$&$1$I!"\e(B
129\e$B$3$l$,L5$$$H\e(B preprompt \e$B$,$"$C$F$b$I$&$7$h$&$b$J$$$N$G$J$$$H$-$O\e(B
130 ; display-minibuffer-mode-in-minibuffer \e$B$r\e(B nil \e$B$K$9$k!#\e(B
131
132 (if (not (boundp 'select-window-hook))
133     (setq display-minibuffer-mode-in-minibuffer nil))
134
135 (defun canna:select-window-hook (old new)
136   (if (and (eq old (minibuffer-window))
137            (not (eq new (minibuffer-window))))
138       (save-excursion
139         (set-buffer (window-buffer (minibuffer-window)))
140         ;; minibuffer\e$B$N%G%U%)%k%H$O%"%k%U%!%Y%C%H%b!<%I\e(B
141         (setq mode-line-canna-mode-in-minibuffer canna:*alpha-mode-string*
142               canna:*japanese-mode-in-minibuffer* nil   
143               minibuffer-preprompt nil)))
144   (if (eq new (minibuffer-window))
145       (setq minibuffer-window-selected t)
146     (setq minibuffer-window-selected nil)))
147
148 ; egg:select-window-hook \e$B$G$b==J,$J$N$G!"\e(Begg:select-window-hook \e$B$,\e(B
149\e$B@_Dj$5$l$F$$$J$$>l9g$N$_Dj5A$9$k!#\e(B
150
151\e$BNI$/9M$($F$_$k$H\e(B display-minibuffer-mode-in-minibuffer \e$B$,\e(B t \e$B$N;~$O\e(B
152\e$B$d$O$j>e5-$N\e(B canna:select-window-hook \e$B$,I,MW$@$J$"!#$I$&$7$h$&!#\e(B
153
154 (if (and (boundp 'select-window-hook)
155          (not (eq select-window-hook 'egg:select-window-hook)))
156     (setq select-window-hook 'canna:select-window-hook))
157
158 (defun mode-line-canna-mode-update (str)
159   (if (eq (current-buffer) (window-buffer (minibuffer-window)))
160       (if (and display-minibuffer-mode-in-minibuffer
161                (boundp 'minibuffer-preprompt))
162           (setq minibuffer-preprompt str)
163         ;else
164         (setq mode-line-canna-mode-in-minibuffer str))
165     (setq mode-line-canna-mode str) )
166   (set-buffer-modified-p (buffer-modified-p)) )
167
168 ;; memq \e$B$r6/D4$9$k$J$i!"0J2<$@$,!"\e(B
169 ;(defun canna:memq-recursive (a l)
170 ;  (or (eq a l)
171 ;      (and (consp l)
172 ;          (or (canna:memq-recursive a (car l))
173 ;              (canna:memq-recursive a (cdr l)) ))))
174 ;; \e$B<!$NDj5A$r;H$*$&\e(B...
175 (defun canna:memq-recursive (a l)
176   (if (atom l) (eq a l)
177     (or (canna:memq-recursive a (car l))
178         (canna:memq-recursive a (cdr l)) )))
179
180 (defun canna:create-mode-line ()
181   "Add Canna status string into mode-line."
182   (cond ((featurep 'xemacs)
183          (or (canna:memq-recursive 'mode-line-canna-mode
184                                    default-modeline-format)
185              (setq-default default-modeline-format
186                            (append '("" mode-line-canna-mode)
187                                    default-modeline-format))
188              )
189          (mapcar (function
190                   (lambda (buffer)
191                     (save-excursion
192                       (set-buffer buffer)
193                       (or (canna:memq-recursive 'mode-line-canna-mode
194                                                 modeline-format)
195                           (setq modeline-format
196                                 (append '("" mode-line-canna-mode)
197                                         modeline-format))
198                           )
199                       )))
200                  (buffer-list))
201          )
202         (t
203          (or (canna:memq-recursive 'mode-line-canna-mode mode-line-format)
204              (setq-default
205               mode-line-format
206               (append (list (list 'minibuffer-window-selected
207                                   (list 'display-minibuffer-mode-in-minibuffer
208                                         "-" "m") "-")
209                             (list 'minibuffer-window-selected
210                                   (list 'display-minibuffer-mode-in-minibuffer
211                                         'mode-line-canna-mode
212                                         'mode-line-canna-mode-in-minibuffer)
213                                   'mode-line-canna-mode))
214                       mode-line-format))
215              )))
216   (mode-line-canna-mode-update mode-line-canna-mode))
217
218 (defun canna:mode-line-display ()
219   (mode-line-canna-mode-update mode-line-canna-mode))
220
221 ;;;
222 ;;; Canna local variables
223 ;;;
224
225 (defvar canna:*japanese-mode* nil "T if canna mode is ``japanese''.")
226 (make-variable-buffer-local 'canna:*japanese-mode*)
227 (set-default 'canna:*japanese-mode* nil)
228
229 (defvar canna:*japanese-mode-in-minibuffer* nil
230   "T if canna mode is ``japanese'' in minibuffer.")
231
232 (defvar canna:*exit-japanese-mode* nil)
233 (defvar canna:*fence-mode* nil)
234 ;(make-variable-buffer-local 'canna:*fence-mode*)
235 ;(setq-default canna:*fence-mode* nil)
236
237 ;;;
238 ;;; global variables
239 ;;;
240
241 (defvar canna-sys:*global-map* (copy-keymap global-map))
242 (defvar canna:*region-start* (make-marker))
243 (defvar canna:*region-end*   (make-marker))
244 (defvar canna:*spos-undo-text* (make-marker))
245 (defvar canna:*epos-undo-text* (make-marker))
246 (defvar canna:*undo-text-yomi* nil)
247 (defvar canna:*local-map-backup*  nil)
248 (defvar canna:*last-kouho* 0)
249 (defvar canna:*initialized* nil)
250 (defvar canna:*previous-window* nil)
251 (defvar canna:*minibuffer-local-map-backup* nil)
252 (defvar canna:*cursor-was-in-minibuffer* nil)
253 (defvar canna:*menu-buffer* " *menu*")
254 (defvar canna:*saved-minibuffer*)
255 (defvar canna:*saved-redirection* nil)
256 (defvar canna:*use-region-as-henkan-region* nil)
257 (make-variable-buffer-local 'canna:*use-region-as-henkan-region*)
258 (setq-default canna:*use-region-as-henkan-region* nil)
259
260 ;;;
261 ;;; \e$B?'$N@_Dj\e(B
262 ;;;
263 (defvar canna-use-color nil
264   "*Non-nil \e$B$G%+%i!<%G%#%9%W%l%$$G?'$rIU$1$k\e(B.
265\e$B$N;~$O%G%U%)%k%H$N?'$r;HMQ$9$k!#\e(B
266 \e$B?'$r;XDj$7$?$$;~$O\e(B, \"\e$BFI$_$N?'\e(B\", \"\e$BJQ49BP>]$N?'\e(B\", \"\e$BA*BrBP>]$N?'\e(B\" \e$B$N\e(B
267 \e$B%j%9%H$r@_Dj$9$k\e(B")
268 (defvar canna:color-p nil "\e$B?'$,;H$($k$+\e(B")
269 (defvar canna:attr-mode nil "\e$B8=:_$N%G%#%9%W%l%$%b!<%I\e(B")
270 (defvar canna:attr-yomi nil "\e$BFI$_$N?'B0@-\e(B")
271 (defvar canna:attr-taishou nil "\e$BJQ49BP>]ItJ,$N?'B0@-\e(B")
272 (defvar canna:attr-select nil
273   "\e$B%_%K%P%C%U%!J,N%;~$N%a%K%e!<$NA*BrBP>]HV9f$N?'B0@-\e(B")
274 (defvar canna:attribute-alist           ;colored by tagu@ae.keio.ac.jp
275   '((yomi (normal . "red") 
276           (reverse . "moccasin"))
277     (taishou (normal . "blue/lavender") 
278              (reverse . "yellow/cadet blue"))
279     (select (normal . "DarkOliveGreen1/cadet blue")
280             (reverse . "light sea green/burlywood1")))
281   "\e$B$+$s$JJQ49;~$NG[?'$N\e(Balist")
282
283 (make-variable-buffer-local (defvar canna:*yomi-overlay* nil))
284 (make-variable-buffer-local (defvar canna:*henkan-overlay* nil))
285 (make-variable-buffer-local (defvar canna:*select-overlay* nil))
286
287 ;;;
288 ;;; Keymap table
289 ;;;
290
291 ;; Fence mode local map
292 (defvar canna-mode-map (make-sparse-keymap))
293
294 (let ((ch 0))
295   (while (<= ch 127)
296     (unless (= ch 27)
297       (define-key canna-mode-map (make-string 1 ch) 'canna-functional-insert-command))
298     (setq ch (1+ ch))))
299
300 (cond ((featurep 'xemacs)
301        (define-key canna-mode-map [up]              "\C-p")
302        (define-key canna-mode-map [(shift up)]      "\C-p")
303        (define-key canna-mode-map [(control up)]    "\C-p")
304        (define-key canna-mode-map [escape O A]      "\C-p")
305        (define-key canna-mode-map [down]            "\C-n")
306        (define-key canna-mode-map [(shift down)]    "\C-n")
307        (define-key canna-mode-map [(control down)]  "\C-n")
308        (define-key canna-mode-map [escape O B]      "\C-n")
309        (define-key canna-mode-map [right]           "\C-f")
310        (define-key canna-mode-map [(shift right)]   "\C-f")
311        (define-key canna-mode-map [(control right)] "\C-f")
312        (define-key canna-mode-map [left]            "\C-b")
313        (define-key canna-mode-map [(shift left)]    "\C-b")
314        (define-key canna-mode-map [(control left)]  "\C-b")
315        (define-key canna-mode-map [kanji]           " ")
316        (define-key canna-mode-map [(control space)] [(control @)])
317        )
318       (t
319        (define-key canna-mode-map [up]      [?\C-p])
320        (define-key canna-mode-map [S-up]    [?\C-p])
321        (define-key canna-mode-map [C-up]    [?\C-p])
322        (define-key canna-mode-map [down]    [?\C-n])
323        (define-key canna-mode-map [S-down]  [?\C-n])
324        (define-key canna-mode-map [C-down]  [?\C-n])
325        (define-key canna-mode-map [right]   [?\C-f])
326        (define-key canna-mode-map [S-right] [?\C-f])
327        (define-key canna-mode-map [C-right] [?\C-f])
328        (define-key canna-mode-map [left]    [?\C-b])
329        (define-key canna-mode-map [S-left]  [?\C-b])
330        (define-key canna-mode-map [C-left]  [?\C-b])
331        (define-key canna-mode-map [kanji]   [? ])
332        (define-key canna-mode-map [?\C- ]   [?\C-@])
333        ))
334
335 ;; \e$B%_%K%P%C%U%!$K2?$+$rI=<($7$F$$$k;~$N%m!<%+%k%^%C%W\e(B
336 (defvar canna-minibuffer-mode-map (make-sparse-keymap))
337
338 (let ((ch 0))
339   (while (<= ch 127)
340     (unless (= ch 27)
341       (define-key canna-minibuffer-mode-map (make-string 1 ch) 'canna-minibuffer-insert-command))
342     (setq ch (1+ ch))))
343
344 (cond ((featurep 'xemacs)
345        (define-key canna-minibuffer-mode-map [up]              "\C-p")
346        (define-key canna-minibuffer-mode-map [(shift up)]      "\C-p")
347        (define-key canna-minibuffer-mode-map [(control up)]    "\C-p")
348        (define-key canna-minibuffer-mode-map [escape O A]      "\C-p")
349        (define-key canna-minibuffer-mode-map [down]            "\C-n")
350        (define-key canna-minibuffer-mode-map [(shift down)]    "\C-n")
351        (define-key canna-minibuffer-mode-map [(control down)]  "\C-n")
352        (define-key canna-minibuffer-mode-map [escape O B]      "\C-n")
353        (define-key canna-minibuffer-mode-map [right]           "\C-f")
354        (define-key canna-minibuffer-mode-map [(shift right)]   "\C-f")
355        (define-key canna-minibuffer-mode-map [(control right)] "\C-f")
356        (define-key canna-minibuffer-mode-map [left]            "\C-b")
357        (define-key canna-minibuffer-mode-map [(shift left)]    "\C-b")
358        (define-key canna-minibuffer-mode-map [(control left)]  "\C-b")
359        (define-key canna-minibuffer-mode-map [kanji]           " ")
360        (define-key canna-minibuffer-mode-map [(control space)] [(control @)])
361        )
362       (t
363        (define-key canna-minibuffer-mode-map [up]      [?\C-p])
364        (define-key canna-minibuffer-mode-map [S-up]    [?\C-p])
365        (define-key canna-minibuffer-mode-map [C-up]    [?\C-p])
366        (define-key canna-minibuffer-mode-map [down]    [?\C-n])
367        (define-key canna-minibuffer-mode-map [S-down]  [?\C-n])
368        (define-key canna-minibuffer-mode-map [C-down]  [?\C-n])
369        (define-key canna-minibuffer-mode-map [right]   [?\C-f])
370        (define-key canna-minibuffer-mode-map [S-right] [?\C-f])
371        (define-key canna-minibuffer-mode-map [C-right] [?\C-f])
372        (define-key canna-minibuffer-mode-map [left]    [?\C-b])
373        (define-key canna-minibuffer-mode-map [S-left]  [?\C-b])
374        (define-key canna-minibuffer-mode-map [C-left]  [?\C-b])
375        (define-key canna-minibuffer-mode-map [kanji]   [? ])
376        (define-key canna-minibuffer-mode-map [?\C- ]   [?\C-@])
377        ))
378
379 ;;;
380 ;;; \e$B%0%m!<%P%k4X?t$N=q$-BX$(\e(B
381 ;;;
382
383
384 ;; Keyboard quit
385
386 ;(if (not (fboundp 'canna-sys:keyboard-quit))
387 ;    (fset 'canna-sys:keyboard-quit (symbol-function 'keyboard-quit)) )
388
389 ;(defun canna:keyboard-quit ()
390 ;  "See documents for canna-sys:keyboard-quit"
391 ;  (interactive)
392 ;  (if canna:*japanese-mode*
393 ;      (progn
394 ;;      (setq canna:*japanese-mode* nil)
395 ;       (setq canna:*fence-mode* nil)
396 ;       (if (boundp 'disable-undo)
397 ;           (setq disable-undo canna:*fence-mode*))
398 ;       (canna:mode-line-display) ))
399 ;  (canna-sys:keyboard-quit) )
400
401 ;; Abort recursive edit
402
403 ;(if (not (fboundp 'canna-sys:abort-recursive-edit))
404 ;    (fset 'canna-sys:abort-recursive-edit 
405 ;         (symbol-function 'abort-recursive-edit)) )
406
407 ;(defun canna:abort-recursive-edit ()
408 ;  "see documents for canna-sys:abort-recursive-edit"
409 ;  (interactive)
410 ;  (if canna:*japanese-mode*
411 ;      (progn
412 ;       (setq canna:*japanese-mode* nil)
413 ;       (setq canna:*fence-mode* nil)
414 ;       (if (boundp 'disable-undo)
415 ;           (setq disable-undo canna:*fence-mode*))
416 ;       (canna:mode-line-display) ))
417 ;  (canna-sys:abort-recursive-edit) )
418
419 ;; Exit-minibuffer
420
421 (defun canna:exit-minibuffer ()
422   "Exit minibuffer turning off canna Japanese mode.
423 See also document for canna:saved-exit-minibuffer."
424   (interactive)
425   (if canna-initialize-minibuffer-state-when-exit
426       (setq canna:*japanese-mode-in-minibuffer* nil
427             mode-line-canna-mode-in-minibuffer canna:*alpha-mode-string*))
428   )
429
430 (add-hook 'minibuffer-exit-hook 'canna:exit-minibuffer)
431
432 ;; kill-emacs
433
434 (add-hook 'kill-emacs-hook 'canna:finalize)
435
436 ;;;
437 ;;; function for mini-buffer
438 ;;;
439
440 (defun adjust-minibuffer-mode ()
441   (if (eq (current-buffer) (window-buffer (minibuffer-window)))
442       (progn
443         (setq canna:*japanese-mode* canna:*japanese-mode-in-minibuffer*)
444         t)
445     nil))
446
447 ;;;
448 ;;; keyboard input for japanese language
449 ;;;
450
451 (defun canna-functional-insert-command (arg)
452   "Use input character as a key of complex translation input such as
453 kana-to-kanji translation."
454   (interactive "*p")
455   (let ((ch))
456     (cond ((and (char-or-char-int-p arg)
457                 (not (null last-command-char)))
458            (setq ch last-command-char))
459           ((eq (event-key last-command-event) 'backspace)
460            (setq ch ?\010))
461           ((eq (event-key last-command-event) 'delete)
462            (setq ch ?\177))
463           (t
464            (setq ch (event-to-character last-command-event))))
465     (canna:functional-insert-command2 ch arg)))
466
467 (defun canna:functional-insert-command2 (ch arg)
468   "This function actually inserts a converted Japanese string."
469   ;; \e$B$3$N4X?t$OM?$($i$l$?J8;z$rF|K\8lF~NO$N$?$a$N%-!<F~NO$H$7$F<h$j07\e(B
470   ;; \e$B$$!"F|K\8lF~NO$NCf4V7k2L$r4^$a$?=hM}$r\e(BEmacs\e$B$N%P%C%U%!$KH?1G$5$;$k\e(B
471   ;; \e$B4X?t$G$"$k!#\e(B
472   (canna:display-candidates (canna-key-proc ch)) )
473
474 (defun canna:delete-last-preedit ()
475   (let ((buffer-undo-list t))
476     (if (not (zerop canna:*last-kouho*))
477         (progn
478           (if canna-underline
479               ;; \e$B$^$:!"B0@-$r>C$9!#\e(B
480               (progn
481                 (canna:henkan-attr-off canna:*region-start* canna:*region-end*)
482                 (canna:yomi-attr-off canna:*region-start* canna:*region-end*)))
483           (delete-region canna:*region-start* canna:*region-end*)
484           (setq canna:*last-kouho* 0) ))))
485
486 (defun canna:insert-fixed (strs)
487   (cond ((> strs 0)
488          (cond ((and canna-kakutei-yomi
489                      (or (null canna-save-undo-text-predicate)
490                          (funcall canna-save-undo-text-predicate
491                                   (cons canna-kakutei-yomi
492                                         canna-kakutei-romaji) )))
493                 (setq canna:*undo-text-yomi*
494                       (cons canna-kakutei-yomi canna-kakutei-romaji))
495                 (set-marker canna:*spos-undo-text* (point))
496 ;;
497 ;; update kbnes
498                 (canna-self-insert-string canna-kakutei-string)
499                 ;; \e$BL$3NDj$NJ8;z$,$J$/!"3NDjJ8;zNs$N:G8e$,JD$83g8L$N\e(B
500                 ;; \e$BN`$@$C$?$H$-$O\e(B blink \e$B$5$;$k!#\e(B
501                 (if (and canna-empty-info
502                          (eq (char-syntax (char-before (point))) ?\)) )
503                     (blink-matching-open))
504
505 ;               (if overwrite-mode
506 ;                   (let ((num strs)
507 ;                         (kanji-compare 128))
508 ;                     (catch 'delete-loop 
509 ;                       (while (> num 0)
510 ;                         (if (eolp)
511 ;                             (throw 'delete-loop nil))
512 ;                         (if (>= (following-char) kanji-compare)
513 ;                             (setq num (1- num)))
514 ;                         (delete-char 1)
515 ;                         (setq num (1- num))))))
516 ;; end kbnes
517 ;               (insert canna-kakutei-string)
518                 (if self-insert-after-hook
519                     (funcall self-insert-after-hook
520                              canna:*region-start* canna:*region-end*))
521                 (canna:do-auto-fill)
522                 (set-marker canna:*epos-undo-text* (point)) )
523                (t
524 ;;
525 ;; update kbnes
526                 (canna-self-insert-string canna-kakutei-string)
527                 ;; \e$BL$3NDj$NJ8;z$,$J$/!"3NDjJ8;zNs$N:G8e$,JD$83g8L$N\e(B
528                 ;; \e$BN`$@$C$?$H$-$O\e(B blink \e$B$5$;$k!#\e(B
529                 (if (and canna-empty-info
530                          (eq (char-syntax (char-before (point))) ?\)) )
531                     (blink-matching-open))
532
533 ;               (if overwrite-mode
534 ;                   (let ((num strs)
535 ;                         (kanji-compare 128))
536 ;                     (catch 'delete-loop 
537 ;                       (while (> num 0)
538 ;                         (if (eolp) 
539 ;                             (throw 'delete-loop nil))
540 ;                         (if (>= (following-char) kanji-compare)
541 ;                             (setq num (1- num)))
542 ;                         (delete-char 1)
543 ;                         (setq num (1- num))))))
544 ;; end kbnes
545 ;               (insert canna-kakutei-string)
546                 (if self-insert-after-hook
547                     (funcall self-insert-after-hook
548                              canna:*region-start* canna:*region-end*))
549                 (canna:do-auto-fill) ))
550          ) ))
551
552 (defun canna:insert-preedit ()
553   (let ((buffer-undo-list t))
554     (cond ((> canna-henkan-length 0)
555            (set-marker canna:*region-start* (point))
556            (if canna-with-fences
557                (progn
558                  (insert "||")
559                  (set-marker canna:*region-end* (point))
560                  (backward-char 1)
561                  ))
562            (insert canna-henkan-string)
563            (if (not canna-with-fences)
564                (set-marker canna:*region-end* (point)) )
565            (if canna-underline
566                (canna:yomi-attr-on canna:*region-start* canna:*region-end*))
567            (setq canna:*last-kouho* canna-henkan-length)
568            ))
569     
570     ;; \e$B8uJdNN0h$G$O6/D4$7$?$$J8;zNs$,B8:_$9$k$b$N$H9M$($i\e(B
571     ;; \e$B$l$k!#6/D4$7$?$$J8;z$O\e(BEmacs\e$B$G$O%+!<%=%k%]%8%7%g%s$K$FI=<(\e(B
572     ;; \e$B$9$k$3$H$H$9$k!#6/D4$7$?$$J8;z$,$J$$$N$G$"$l$P!"%+!<%=%k\e(B
573     ;; \e$B$O0lHV8e$NItJ,\e(B(\e$BF~NO$,9T$o$l$k%]%$%s%H\e(B)\e$B$KCV$$$F$*$/!#\e(B
574   
575     ;; \e$B%+!<%=%k$r0\F0$9$k!#\e(B
576     (if (not canna-underline)
577         (backward-char 
578          (- canna:*last-kouho*
579             ;; \e$B%+!<%=%k0LCV$O!"H?E>I=<(ItJ,$,B8:_$7$J$$$N$G$"$l$P!"\e(B
580             ;; \e$B8uJdJ8;zNs$N:G8e$NItJ,$H$7!"H?E>I=<(ItJ,$,B8:_$9$k$N\e(B
581             ;; \e$B$G$"$l$P!"$=$NItJ,$N;O$a$H$9$k!#\e(B
582             (cond ((zerop canna-henkan-revlen)
583                    canna:*last-kouho*)
584                   (t canna-henkan-revpos) )) )
585       (if (and (> canna-henkan-revlen 0)
586                (> canna-henkan-length 0))
587                                         ; \e$B8uJd$ND9$5$,\e(B0\e$B$G$J$/!"\e(B
588                                         ; \e$BH?E>I=<($ND9$5$,\e(B0\e$B$G$J$1$l$P!"\e(B
589                                         ; \e$B$=$NItJ,$rJQE>I=<($9$k!#\e(B
590           (let ((start (+ canna:*region-start*
591                           (if canna-with-fences 1 0)
592                           canna-henkan-revpos) ))
593             (if canna-underline
594                 (canna:henkan-attr-on start 
595                                       (+ start canna-henkan-revlen)))))
596       ) ) )
597
598 (defun canna:display-candidates (strs)
599   (cond ((stringp strs) ; \e$B%(%i!<$,5/$3$C$?>l9g\e(B
600          (beep)
601          (message strs) )
602         (canna-henkan-string
603          ;; \e$B$b$78uJdI=<($,A0$N7k2L$+$iJQ$o$C$F$$$J$/$J$$$H$-$O\e(B......
604
605          ;; \e$B<h$j9g$($::G=i$OA0$K=q$$$F$*$$$?Cf4V7k2L$r>C$9!#\e(B
606          (canna:delete-last-preedit)
607
608          ;; \e$B3NDj$7$?J8;zNs$,$"$l$P$=$l$rA^F~$9$k!#\e(B
609          (canna:insert-fixed strs)
610
611          ;; \e$B<!$O8uJd$K$D$$$F$N:n6H$G$"$k!#\e(B
612
613          ;; \e$B8uJd$rA^F~$9$k!#8uJd$O=DK@FsK\$K$F64$^$l$k!#\e(B
614          (canna:insert-preedit)
615          ))
616
617   ;; \e$B%b!<%I$rI=$9J8;zNs$,B8:_$9$l$P$=$l$r%b!<%I$H$7$F<h$j07$&!#\e(B
618   (if (stringp canna-mode-string)
619       (mode-line-canna-mode-update canna-mode-string))
620
621   ;; \e$B8uJdI=<($,$J$1$l$P%U%'%s%9%b!<%I$+$iH4$1$k!#\e(B
622   (cond (canna-empty-info (canna:quit-canna-mode)))
623
624   ;; \e$B%_%K%P%C%U%!$K=q$/$3$H$,B8:_$9$k$N$G$"$l$P!"$=$l$r%_%K%P%C%U%!\e(B
625   ;; \e$B$KI=<($9$k!#\e(B
626   (cond (canna-ichiran-string
627          (canna:minibuffer-input canna-ichiran-string
628                                  canna-ichiran-length
629                                  canna-ichiran-revpos
630                                  canna-ichiran-revlen
631                                  strs) )
632         (canna:*cursor-was-in-minibuffer*
633 ;        (select-frame (window-frame (minibuffer-window)))
634          (select-window (minibuffer-window))
635          (set-window-buffer (minibuffer-window)
636                             (get-buffer-create canna:*menu-buffer*))
637          (use-local-map canna-minibuffer-mode-map) ))
638   )
639
640 (defun canna:minibuffer-input (str len revpos revlen nfixed)
641   "Displaying misc informations for kana-to-kanji input."
642
643   ;; \e$B:n6H$r%_%K%P%C%U%!$K0\$9$N$K:]$7$F!"8=:_$N%&%#%s%I%&$N>pJs$rJ]B8\e(B
644   ;; \e$B$7$F$*$/!#\e(B
645   (setq canna:*previous-window* (selected-window))
646 ;  (select-frame (window-frame (minibuffer-window)))
647
648 ;; \e$B<+J,$KMh$kA0$,%_%K%P%C%U%!$+$I$&$+$rJQ?t$K$G$b$$$l$F$*$$$?J}$,$$$$$J$"!#\e(B
649
650   (if (not canna:*cursor-was-in-minibuffer*)
651       (progn
652         ;; \e$B%_%K%P%C%U%!$r%/%j%"$9$k!#\e(B
653 ;       (if (eq canna:*previous-window* (selected-window))
654 ;           (progn
655 ;             (canna:henkan-attr-off (point-min) (point-max))
656 ;             (canna:delete-last-preedit) ))
657
658         ;; \e$B%_%K%P%C%U%!%&%#%s%I%&$K8uJd0lMwMQ$N%P%C%U%!$r3d$jEv$F$k!#\e(B
659         (setq canna:*saved-minibuffer* (window-buffer (minibuffer-window)))
660 ;       (set-window-buffer (minibuffer-window)
661 ;                          (get-buffer-create canna:*menu-buffer*))
662         ;; modified by \e$B<i2,\e(B \e$BCNI'\e(B <morioka@jaist.ac.jp>, 1996/6/7
663         (unless (featurep 'xemacs)
664           ;; \e$B$H$j$"$($:\e(B XEmacs \e$B$G$OF0$+$5$J$$$3$H$K$7$F$*$3$&\e(B (^_^;
665           (setq canna:*saved-redirection* (frame-focus (selected-frame)))
666           (redirect-frame-focus (selected-frame) 
667                                 (window-frame (minibuffer-window)))
668           )
669         ;; \e$B%_%K%P%C%U%!$N%-!<%^%C%W$rJ]B8$7$F$*$/!#\e(B
670         (setq canna:*minibuffer-local-map-backup* (current-local-map))
671         ))
672   (select-window (minibuffer-window))
673   (set-window-buffer (minibuffer-window)
674                      (get-buffer-create canna:*menu-buffer*))
675
676   (use-local-map canna-minibuffer-mode-map)
677
678 ;  (canna:yomi-attr-off (point-min) (point-max) )
679 ;  (canna:henkan-attr-off (point-min) (point-max) )
680   (canna:select-attr-off (point-min) (point-max) )
681   (setq canna:*cursor-was-in-minibuffer* t)
682   (delete-region (point-min) (point-max))
683   (if (not (eq canna:*previous-window* (selected-window)))
684       (setq minibuffer-window-selected nil))
685
686   (insert str)
687
688   ;; \e$B%_%K%P%C%U%!$GH?E>I=<($9$k$Y$-J8;z$N$H$3$m$K%+!<%=%k$r0\F0$9$k!#\e(B
689   (cond ((> revlen 0)
690          (backward-char (- len revpos)) ))
691   ;;(message "%s" (selected-frame)) (sit-for 3)
692   (raise-frame (window-frame (minibuffer-window)))
693 ;  (select-frame (window-frame (minibuffer-window)))
694   (and canna:color-p (not (eobp)) 
695        (canna:select-attr-on (point) 
696                              (save-excursion (forward-char 1) (point))))
697   
698   ;; \e$B%_%K%P%C%U%!$KI=<($9$k$Y$-J8;zNs$,%L%kJ8;zNs$J$N$G$"$l$P!"A0$N%&%#\e(B
699   ;; \e$B%s%I%&$KLa$k!#\e(B
700   (if (or (zerop len) canna-empty-info)
701       (progn
702         (setq canna:*cursor-was-in-minibuffer* nil)
703         (use-local-map canna:*minibuffer-local-map-backup*)
704
705         ;; \e$B%_%K%P%C%U%!%&%#%s%I%&$N%P%C%U%!$r85$KLa$9!#\e(B
706         (set-window-buffer (minibuffer-window) canna:*saved-minibuffer*)
707 ;       (setq canna:*saved-minibuffer* nil)
708         ;; modified by \e$B<i2,\e(B \e$BCNI'\e(B <morioka@jaist.ac.jp>, 1996/6/7
709         (unless (featurep 'xemacs)
710           ;; \e$B$H$j$"$($:\e(B XEmacs \e$B$G$OF0$+$5$J$$$h$&$K$7$F$*$3$&\e(B (^_^;
711           (redirect-frame-focus (window-frame canna:*previous-window*)
712                                 canna:*saved-redirection*)
713           )
714         ; \e$B%_%K%P%C%U%!$GF~NO$7$F$$$?$N$J$i0J2<$b$9$k!#\e(B
715 ;       (if (eq canna:*previous-window* (selected-window))
716 ;           (progn
717 ;             (canna:insert-fixed nfixed)
718 ;             (canna:insert-preedit) ))
719
720         (if (and canna-empty-info (> len 0))
721             (progn
722 ;             (delete-region (point-min) (point-max))
723               (message str) ))
724         (select-window canna:*previous-window*) ))
725   )
726
727 (defun canna-minibuffer-insert-command (arg)
728   "Use input character as a key of complex translation input such as\n\
729 kana-to-kanji translation, even if you are in the minibuffer."
730   (interactive "p")
731   (use-local-map canna:*minibuffer-local-map-backup*)
732   (set-window-buffer (minibuffer-window) canna:*saved-minibuffer*)
733   (select-window canna:*previous-window*)
734   (let ((ch))
735     (cond ((and (char-or-char-int-p arg)
736                 (not (null last-command-char)))
737            (setq ch last-command-char))
738           ((eq (event-key last-command-event) 'backspace)
739            (setq ch ?\010))
740           ((eq (event-key last-command-event) 'delete)
741            (setq ch ?\177))
742           (t
743            (setq ch (event-to-character last-command-event))))
744     (canna:functional-insert-command2 ch arg)))
745
746 ;;;
747 ;;; \e$B$+$s$J%b!<%I$N<gLr$O!"<!$N\e(B canna-self-insert-command \e$B$G$"$k!#$3$N\e(B
748 ;;; \e$B%3%^%s%I$OA4$F$N%0%i%U%#%C%/%-!<$K%P%$%s%I$5$l$k!#\e(B
749 ;;;
750 ;;; \e$B$3$N4X?t$G$O!"8=:_$N%b!<%I$,F|K\8lF~NO%b!<%I$+$I$&$+$r%A%'%C%/$7$F!"\e(B
751 ;;; \e$BF|K\8lF~NO%b!<%I$G$J$$$N$G$"$l$P!"%7%9%F%`$N\e(B self-insert-command 
752 ;;; \e$B$r8F$V!#F|K\8lF~NO%b!<%I$G$"$l$P!"%U%'%s%9%b!<%I$KF~$j!"\e(B
753 ;;; canna-functional-insert-command \e$B$r8F$V!#\e(B
754 ;;;
755
756 (defun canna-self-insert-command (arg)
757   "Self insert pressed key and use it to assemble Romaji character."
758   (interactive "*p")
759   (adjust-minibuffer-mode)
760   (if (and canna:*japanese-mode*
761            ;; \e$B%U%'%s%9%b!<%I$@$C$?$i$b$&0lEY%U%'%s%9%b!<%I$KF~$C$?$j$7\e(B
762            ;; \e$B$J$$!#\e(B
763            (not canna:*fence-mode*) )
764       (canna:enter-canna-mode-and-functional-insert)
765     (progn
766       ;; \e$B0J2<$NItJ,$O\e(B egg.el \e$B$N\e(B 3.09 \e$B$N\e(B egg-self-insert-command \e$B$NItJ,$+$i\e(B
767       ;; \e$B%3%T!<$7!"<j$rF~$l$F$$$^$9!#\e(B93.11.5 kon
768       ;; treat continuous 20 self insert as a single undo chunk.
769       ;; `20' is a magic number copied from keyboard.c
770 ;      (if (or                          ;92.12.20 by T.Enami
771 ;          (not (eq last-command 'canna-self-insert-command))
772 ;          (>= canna:*self-insert-non-undo-count* 20))
773 ;         (setq canna:*self-insert-non-undo-count* 1)
774 ;       (cancel-undo-boundary)
775 ;       (setq canna:*self-insert-non-undo-count*
776 ;             (1+ canna:*self-insert-non-undo-count*)))
777       (if (and (eq last-command 'canna-self-insert-command)
778                (> last-command-char ? ))
779           (cancel-undo-boundary))
780       (self-insert-command arg)
781 ;      (if canna-insert-after-hook
782 ;         (run-hooks 'canna-insert-after-hook))
783       (if self-insert-after-hook
784           (if (<= 1 arg)
785               (funcall self-insert-after-hook
786                        (- (point) arg) (point)))
787         (if (= last-command-char ? ) (canna:do-auto-fill))))))
788
789 ;; wire us into pending-delete
790 (put 'canna-self-insert-command 'pending-delete t)
791
792 (defun canna-toggle-japanese-mode ()
793   "Toggle canna japanese mode."
794   (interactive)
795   (let ((in-minibuffer (adjust-minibuffer-mode)))
796     (cond (canna:*japanese-mode*
797            (setq canna:*japanese-mode* nil) 
798            (canna-abandon-undo-info)
799            (setq canna:*use-region-as-henkan-region* nil)
800            (setq canna:*saved-mode-string* mode-line-canna-mode)
801            (mode-line-canna-mode-update canna:*alpha-mode-string*) )
802           (t
803            (setq canna:*japanese-mode* t)
804            (if (fboundp 'canna-query-mode)
805                (let ((new-mode (canna-query-mode)))
806                  (if (string-equal new-mode "")
807                      (setq canna:*kanji-mode-string* canna:*saved-mode-string*)
808                    (setq canna:*kanji-mode-string* new-mode)
809                    )) )
810            (mode-line-canna-mode-update canna:*kanji-mode-string*) ) )
811     (if in-minibuffer
812         (setq canna:*japanese-mode-in-minibuffer* canna:*japanese-mode*)) ))
813
814 (defun canna:initialize ()
815   (let ((init-val nil))
816     (cond (canna:*initialized*) ; initialize \e$B$5$l$F$$$?$i2?$b$7$J$$\e(B
817           (t
818            (setq canna:*initialized* t)
819            (setq init-val (canna-initialize 
820                            (if canna-underline 0 1)
821                            canna-server canna-file))
822            (cond ((car (cdr (cdr init-val)))
823                   (canna:output-warnings (car (cdr (cdr init-val)))) ))
824            (cond ((car (cdr init-val))
825                   (error (car (cdr init-val))) ))
826            ) )
827
828     (if (fboundp 'canna-query-mode)
829         (progn
830           (canna-change-mode canna-mode-alpha-mode)
831           (setq canna:*alpha-mode-string* (canna-query-mode)) ))
832
833     (canna-do-function canna-func-japanese-mode)
834
835     (if (fboundp 'canna-query-mode)
836         (setq canna:*kanji-mode-string* (canna-query-mode)))
837
838     init-val))
839
840 (defun canna:finalize ()
841   (cond ((null canna:*initialized*)) ; initialize \e$B$5$l$F$$$J$+$C$?$i2?$b$7$J$$\e(B
842         (t
843          (setq canna:*initialized* nil)
844          (let ((init-val (canna-finalize)))
845            (cond ((car (cdr (cdr init-val)))
846                   (canna:output-warnings (car (cdr (cdr init-val)))) ))
847            (cond ((car (cdr init-val))
848                   (error (car (cdr init-val))) ))
849            )
850          (message "\e$B!X$+$s$J!Y$N<-=q$r%;!<%V$7$^$9!#\e(B")
851          )))
852
853 (defun canna:enter-canna-mode ()
854   (if (not canna:*initialized*)
855       (progn 
856         (message "\e$B!X$+$s$J!Y$N=i4|2=$r9T$C$F$$$^$9\e(B....")
857         (canna:initialize)
858         (message "\e$B!X$+$s$J!Y$N=i4|2=$r9T$C$F$$$^$9\e(B....done")
859         ))
860   (canna-set-width (- (window-width (minibuffer-window))
861                       ;; Inline expansion of `minibuffer-prompt-width'
862                       (save-excursion
863                         (set-buffer (window-buffer (minibuffer-window)))
864                         (current-column))
865                       (if (and display-minibuffer-mode-in-minibuffer
866                                (eq (selected-window) (minibuffer-window)))
867                           (string-width
868                            (let ((new-mode (canna-query-mode)))
869                              (if (string-equal new-mode "")
870                                  canna:*saved-mode-string*
871                                new-mode)))
872                         0)))
873   (setq canna:*local-map-backup* (current-local-map))
874   (setq canna:*fence-mode* t)
875   ;; XEmacs change:
876   ;; (buffer-disable-undo (current-buffer))
877   ;; Original:
878   ;; (if (boundp 'disable-undo)
879   ;;     (setq disable-undo canna:*fence-mode*))
880   (use-local-map canna-mode-map))
881
882 (defun canna:enter-canna-mode-and-functional-insert ()
883   (canna:enter-canna-mode)
884   (setq canna:*use-region-as-henkan-region* nil)
885   (setq unread-command-events (list last-command-event)))
886
887 (defun canna:quit-canna-mode ()
888   (cond (canna:*fence-mode*
889          (use-local-map canna:*local-map-backup*)
890          (setq canna:*fence-mode* nil)
891          (if canna:*exit-japanese-mode*
892              (progn
893                (setq canna:*exit-japanese-mode* nil)
894                (setq canna-mode-string canna:*alpha-mode-string*)
895                (if canna:*japanese-mode*
896                    (canna-toggle-japanese-mode)
897                  (mode-line-canna-mode-update canna:*alpha-mode-string*) )))
898          ;; XEmacs change:
899          ;; (buffer-enable-undo (current-buffer))
900          ;; Original:
901          ;; (if (boundp 'disable-undo)
902          ;;     (setq disable-undo canna:*fence-mode*))
903          ))
904   (set-marker canna:*region-start* nil)
905   (set-marker canna:*region-end* nil)
906   )
907
908 (defun canna-touroku ()
909   "Register a word into a kana-to-kanji dictionary."
910   (interactive)
911 ;  (if canna:*japanese-mode*
912   (if (not canna:*fence-mode*)
913       (progn
914         (setq canna:*exit-japanese-mode* (not canna:*japanese-mode*))
915         (canna:enter-canna-mode)
916         (canna:display-candidates (canna-touroku-string "")) )
917     (beep)
918   ))
919
920 (defun canna-without-newline (start end)
921   (and (not (eq start end))
922        (or 
923         (and (<= end (point))
924              (save-excursion
925                (beginning-of-line)
926                (<= (point) start) ))
927         (and (<= (point) start)
928              (save-excursion 
929                (end-of-line) 
930                (<= end (point)) ))
931         )))
932
933 (defun canna-touroku-region (start end)
934   "Register a word in the selected region into a kana-to-kanji dictionary."
935   (interactive "r")
936   (if (canna-without-newline start end)
937 ;      (if canna:*japanese-mode*
938       (if (not canna:*fence-mode*)
939           (progn
940             (setq canna:*use-region-as-henkan-region* nil)
941             (setq canna:*exit-japanese-mode* (not canna:*japanese-mode*))
942             (canna:enter-canna-mode)
943             (canna:display-candidates
944              (canna-touroku-string (buffer-substring start end))) ))
945     (message "\e$B%j!<%8%g%s$,IT@5$G$9!#%L%k%j!<%8%g%s$+!"2~9T$,4^$^$l$F$$$^$9!#\e(B")
946     ))
947
948 (defun canna-extend-mode ()
949   "To enter an extend-mode of Canna."
950   (interactive "*")
951 ;  (if (and (not (eq (window-frame (minibuffer-window)) (selected-frame)))
952 ;          (not canna:*fence-mode*))
953            ;; \e$B%_%K%P%C%U%!$rJ,N%$7$F$$$k;~$O0l;~E*$K%U%'%s%9%b!<%I$KF~$k\e(B
954            ;; \e$B$=$&$7$J$$$H%a%K%e!<$rA*$Y$J$$\e(B
955            ;; (focus\e$B$,%_%K%P%C%U%!$K9T$+$J$$$+$i\e(B)
956   (if (not canna:*fence-mode*)
957       (progn
958         (setq canna:*exit-japanese-mode* (not canna:*japanese-mode*))
959         (canna:enter-canna-mode)
960         (canna:display-candidates
961          (canna-do-function canna-func-extend-mode) ))
962     (beep)))
963
964 (defun canna-kigou-mode ()
965   "Enter symbol choosing mode."
966   (interactive "*")
967 ;  (if canna:*japanese-mode*
968   (if (not canna:*fence-mode*)
969       (progn
970         (setq canna:*exit-japanese-mode* (not canna:*japanese-mode*))
971         (canna:enter-canna-mode)
972         (canna:display-candidates (canna-change-mode canna-mode-kigo-mode)) )
973     (beep)
974     ))
975
976 (defun canna-hex-mode ()
977   "Enter hex code entering mode."
978   (interactive "*")
979 ;  (if canna:*japanese-mode*
980   (if (not canna:*fence-mode*)
981       (progn
982         (setq canna:*exit-japanese-mode* (not canna:*japanese-mode*))
983         (canna:enter-canna-mode)
984         (canna:display-candidates (canna-change-mode canna-mode-hex-mode)) )
985     (beep)
986     ))
987
988 (defun canna-bushu-mode ()
989   "Enter special mode to convert by BUSHU name."
990   (interactive "*")
991 ;  (if canna:*japanese-mode*
992   (if (not canna:*fence-mode*)
993       (progn
994         (setq canna:*exit-japanese-mode* (not canna:*japanese-mode*))
995         (canna:enter-canna-mode)
996         (canna:display-candidates (canna-change-mode canna-mode-bushu-mode)) )
997     (beep)
998     ))
999
1000 (defun canna-reset ()
1001   (interactive)
1002   (message "\e$B!X$+$s$J!Y$N<-=q$r%;!<%V$7$^$9!#\e(B");
1003   (canna:finalize)
1004   (message "\e$B!X$+$s$J!Y$N:F=i4|2=$r9T$C$F$$$^$9\e(B....")
1005   (canna:initialize)
1006   (message "\e$B!X$+$s$J!Y$N:F=i4|2=$r9T$C$F$$$^$9\e(B....done")
1007   )
1008   
1009
1010 (defun canna ()
1011   (interactive)
1012   (message "\e$B!X$+$s$J!Y$r=i4|2=$7$F$$$^$9\e(B....")
1013   (let (init-val)
1014     (cond ((and (fboundp 'canna-initialize) (fboundp 'canna-change-mode) )
1015            
1016            ;; canna \e$B$,;H$($k;~$O<!$N=hM}$r$9$k!#\e(B
1017            
1018            ;; \e$BG[?'@_Dj\e(B (by yuuji@ae.keio.ac.jp)
1019            (setq canna:color-p (and canna-use-color 
1020                                     window-system 
1021                                     (x-display-color-p)))
1022            ;;\e$B%+%i!<$N;~\e(Bunderline\e$B%b!<%I$HF1$8>uBV$G=i4|2=$9$kI,MW$,$"$k\e(B
1023            (setq canna-underline (or canna:color-p canna-underline))
1024            (cond 
1025             (canna:color-p
1026              (setq canna:attr-mode
1027                    (cond
1028                     ((or (and (boundp 'hilit-background-mode)
1029                               (eq hilit-background-mode 'dark))
1030                          (string-match
1031                           "on\\|t"
1032                           (or (if running-xemacs
1033                                   (x-get-resource "ReverseVideo"
1034                                                   "reverseVideo" 'string)
1035                                 (x-get-resource "ReverseVideo" "reverseVideo"))
1036                               "")))
1037                      'reverse)  ;\e$BH?E>$7$F$$$k$J$i\e(B 'reverse
1038                     (t 'normal)))
1039              (setq canna:attr-yomi
1040                    (if (listp canna-use-color)
1041                        (car canna-use-color)
1042                      (cdr (assq canna:attr-mode 
1043                                 (assq 'yomi canna:attribute-alist)))))
1044              (setq canna:attr-taishou
1045                    (if (listp canna-use-color)
1046                        (car (cdr canna-use-color))
1047                      (setq canna:attr-taishou
1048                            (cdr (assq 
1049                                  canna:attr-mode
1050                                  (assq 'taishou canna:attribute-alist))))))
1051              (setq canna:attr-select
1052                    (if (listp canna-use-color)
1053                        (car (cdr (cdr canna-use-color)))
1054                      (setq canna:attr-select
1055                            (cdr (assq canna:attr-mode
1056                                       (assq 'select canna:attribute-alist))))))
1057              ;;\e$B?'$E$1MQ\e(Bface\e$B$N:n@.\e(B
1058              (mapcar
1059               (function
1060                (lambda (face)
1061                  (let* ((color (symbol-value
1062                                 (intern (concat "canna:" (symbol-name face)))))
1063                         backp)
1064                    (make-face face)
1065                    (if (stringp color)
1066                        (progn
1067                          (setq backp (string-match "/" color))
1068                          (set-face-foreground
1069                           face (substring color 0 backp))
1070                          (if backp 
1071                              (set-face-background
1072                               face (substring color (1+ backp)))))
1073                      (copy-face color face)))))
1074               '(attr-yomi attr-taishou attr-select))
1075              ))
1076            ;;\e$BG[?'@_Dj=*N;\e(B
1077            
1078            ;; \e$B!X$+$s$J!Y%7%9%F%`$N=i4|2=\e(B
1079            
1080            (setq init-val (canna:initialize))
1081            
1082            ;; \e$B%-!<$N%P%$%s%G%#%s%0\e(B
1083            
1084            (let ((ch 32))
1085              (while (< ch 127)
1086                (define-key global-map (make-string 1 ch) 'canna-self-insert-command)
1087                (setq ch (1+ ch)) ))
1088
1089            (cond
1090             ;; #### I'm just guessing that this should come before the
1091             ;;      init-val setting
1092             ;; if registered with LEIM, no-op
1093             ((featurep 'canna-leim) t)
1094             ;; check to see if an X resource or the like is available in
1095             ;; init-val
1096             ((let ((keys (car init-val)) (ok nil))
1097                     (while keys
1098                       (cond ((< (car keys) 128)
1099                              (global-set-key
1100                               (make-string 1 (car keys))
1101                               'canna-toggle-japanese-mode)
1102                              (setq ok t) ))
1103                       (setq keys (cdr keys))
1104                       ) ok))
1105             ;; \e$B%G%U%)%k%H$N@_Dj\e(B
1106             ;; Since XEmacs provides canna-leim.el, we should leave this
1107             ;; as is.
1108             (t (global-set-key "\C-o" 'canna-toggle-japanese-mode) ))
1109
1110            ;; #### should these global bindings be conditional on LEIM?
1111            ;;      LEIM doesn't use kanji key yet AFAIK, so leave them.
1112            (if (not (keymapp (global-key-binding "\e[")))
1113                (global-unset-key "\e[") )
1114            (global-set-key "\e[210z" 'canna-toggle-japanese-mode) ; XFER
1115            (define-key global-map [kanji] 'canna-toggle-japanese-mode)
1116            (if canna-do-keybind-for-functionkeys
1117                (progn
1118                  (global-set-key "\e[28~" 'canna-extend-mode) ; HELP on EWS4800
1119                  (global-set-key "\e[2~"  'canna-kigou-mode)  ; INS  on EWS4800
1120                  (global-set-key "\e[11~" 'canna-kigou-mode)
1121                  (global-set-key "\e[12~" 'canna-hex-mode)
1122                  (global-set-key "\e[13~" 'canna-bushu-mode)
1123                  (define-key global-map [help] 'canna-extend-mode)
1124                  (define-key global-map [insert] 'canna-kigou-mode)
1125                  (define-key global-map [f1] 'canna-kigou-mode)
1126                  (define-key global-map [f2] 'canna-hex-mode)
1127                  (define-key global-map [f3] 'canna-bushu-mode)
1128                  ))
1129
1130            (if canna-use-space-key-as-henkan-region
1131                (progn
1132                  (global-set-key "\C-@" 'canna-set-mark-command)
1133                  ;; X Window \e$B$O\e(B C-@ \e$B$H\e(B C-SPC \e$B$r6hJL$9$k$N$G!"$3$l$,I,MW!#\e(B
1134                  (global-set-key [?\C-\ ] 'canna-set-mark-command)
1135                  (global-set-key " " 'canna-henkan-region-or-self-insert) ))
1136
1137          ;; \e$B%b!<%I9T$N:n@.\e(B
1138
1139            (canna:create-mode-line)
1140            (mode-line-canna-mode-update canna:*alpha-mode-string*)
1141
1142          ;; \e$B%7%9%F%`4X?t$N=q$-BX$(\e(B
1143
1144 ;          (fset 'abort-recursive-edit 
1145 ;                (symbol-function 'canna:abort-recursive-edit))
1146 ;          (fset 'keyboard-quit 
1147 ;                (symbol-function 'canna:keyboard-quit))
1148
1149            )
1150
1151           ((fboundp 'canna-initialize)
1152            (beep)
1153            (with-output-to-temp-buffer "*canna-warning*"
1154              (princ "\e$B$3$N\e(B Mule \e$B$G$O\e(B new-canna \e$B$,;H$($^$;$s\e(B")
1155              (terpri)
1156              (print-help-return-message)) )
1157
1158           (t ; \e$B!X$+$s$J!Y%7%9%F%`$,;H$($J$+$C$?;~$N=hM}\e(B
1159            (beep)
1160            (with-output-to-temp-buffer "*canna-warning*"
1161              (princ "\e$B$3$N\e(B Mule \e$B$G$O\e(B canna \e$B$,;H$($^$;$s\e(B")
1162              (terpri)
1163              (print-help-return-message))
1164            ))
1165     (message "\e$B!X$+$s$J!Y$r=i4|2=$7$F$$$^$9\e(B....done")
1166     ) )
1167
1168 ;;;
1169 ;;; auto fill controll (from egg)
1170 ;;;
1171
1172 (defun canna:do-auto-fill ()
1173   (if (and auto-fill-function (not buffer-read-only)
1174            (> (current-column) fill-column))
1175       (let ((ocolumn (current-column)))
1176         (funcall auto-fill-function)
1177         (while (and (< fill-column (current-column))
1178                     (< (current-column) ocolumn))
1179           (setq ocolumn (current-column))
1180           (funcall auto-fill-function)))))
1181
1182 (defun canna:output-warnings (mesg)
1183   (with-output-to-temp-buffer "*canna-warning*"
1184     (while mesg
1185       (princ (car mesg))
1186       (terpri)
1187       (setq mesg (cdr mesg)) )
1188     (print-help-return-message)))
1189
1190 (defun canna-undo (&optional arg)
1191   (interactive "*p")
1192   (if (and canna:*undo-text-yomi*
1193            (eq (current-buffer) (marker-buffer canna:*spos-undo-text*))
1194 ;          (canna-without-newline canna:*spos-undo-text*
1195 ;                                 canna:*epos-undo-text*)
1196            )
1197       (progn
1198         (message "\e$BFI$_$KLa$7$^$9!*\e(B")
1199 ;       (switch-to-buffer (marker-buffer canna:*spos-undo-text*))
1200         (goto-char canna:*spos-undo-text*)
1201         (delete-region canna:*spos-undo-text*
1202                        canna:*epos-undo-text*)
1203
1204         (if (null canna:*japanese-mode*)
1205             (progn
1206               (setq canna:*exit-japanese-mode* t) ))
1207 ;             (canna-toggle-japanese-mode) ))
1208         (if (not canna:*fence-mode*)
1209             ;; \e$B%U%'%s%9%b!<%I$@$C$?$i$b$&0lEY%U%'%s%9%b!<%I$KF~$C$?$j$7\e(B
1210             ;; \e$B$J$$!#\e(B
1211             (canna:enter-canna-mode) )
1212         (canna:display-candidates 
1213          (let ((texts (canna-store-yomi (car canna:*undo-text-yomi*)
1214                                         (cdr canna:*undo-text-yomi*) )) )
1215            (cond (canna-undo-hook
1216                   (funcall canna-undo-hook))
1217                  (t texts) )))
1218         (canna-abandon-undo-info)
1219         )
1220     (canna-abandon-undo-info)
1221     (undo arg) ))
1222
1223 (defun canna-abandon-undo-info ()
1224   (interactive)
1225   (setq canna:*undo-text-yomi* nil)
1226   (set-marker canna:*spos-undo-text* nil)
1227   (set-marker canna:*epos-undo-text* nil) )
1228
1229 (defun canna-henkan-region (start end)
1230   "Convert a text which is indicated by region into a kanji text."
1231   (interactive "*r")
1232   (if (null canna:*japanese-mode*)
1233       (progn
1234         (setq canna:*exit-japanese-mode* t) ))
1235 ;       (canna-toggle-japanese-mode) ))
1236   (let ((res nil))
1237     (setq res (canna-store-yomi (buffer-substring start end)))
1238     (delete-region start end)
1239     (canna:enter-canna-mode)
1240     (if (fboundp 'canna-do-function)
1241         (setq res (canna-do-function canna-func-henkan)))
1242     (canna:display-candidates res) ))
1243
1244 ;;;
1245 ;;; \e$B%^!<%/%3%^%s%I!$\e(Bcanna-henkan-region-or-self-insert \e$B$G;H$&$+$b\e(B
1246 ;;;
1247
1248 (defun canna-set-mark-command (arg)
1249   "Set mark, also set mark as HENKAN region if in Japanese mode."
1250   (interactive "P")
1251   (set-mark-command arg)
1252   (if canna:*japanese-mode*
1253       (progn
1254         (setq canna:*use-region-as-henkan-region* t)
1255         (message "Mark set(\e$BJQ49NN0h3+;O\e(B)") )))
1256
1257 (defun canna-henkan-region-or-self-insert (arg)
1258   "Do kana-to-kanji convert region if HENKAN region is defined, else insert."
1259   (interactive "*p")
1260   (if (and canna:*use-region-as-henkan-region*
1261 ;          (< (mark) (point))
1262 ;          (not (save-excursion (beginning-of-line) (< (mark) (point)))) )
1263            (canna-without-newline (region-beginning) (region-end)))
1264       (progn
1265         (setq canna:*use-region-as-henkan-region* nil)
1266         (canna-henkan-region (region-beginning) (region-end)))
1267     (canna-self-insert-command arg) ))
1268
1269 ;;
1270 ;; for C-mode
1271 ;;
1272
1273 (defun canna-electric-c-terminator (arg)
1274   (interactive "P")
1275   (if canna:*japanese-mode*
1276       (canna-self-insert-command arg)
1277     (electric-c-terminator arg) ))
1278
1279 (defun canna-electric-c-semi (arg)
1280   (interactive "P")
1281   (if canna:*japanese-mode*
1282       (canna-self-insert-command arg)
1283     (electric-c-semi arg) ))
1284
1285 (defun canna-electric-c-brace (arg)
1286   (interactive "P")
1287   (if canna:*japanese-mode*
1288       (canna-self-insert-command arg)
1289     (electric-c-brace arg) ))
1290
1291 (defun canna-c-mode-hook ()
1292   (define-key c-mode-map "{" 'canna-electric-c-brace)
1293   (define-key c-mode-map "}" 'canna-electric-c-brace)
1294   (define-key c-mode-map ";" 'canna-electric-c-semi)
1295   (define-key c-mode-map ":" 'canna-electric-c-terminator) )
1296
1297 (defun canna-set-fence-mode-format (fence sep underline)
1298   (setq canna-with-fences fence)
1299   (canna-set-bunsetsu-kugiri sep)
1300   (setq canna-underline underline)
1301 )
1302
1303 ;; \e$B%j!<%8%g%s$K$"$k%m!<%^;z$r!X$+$s$J!Y$K?)$o$9!#\e(B
1304 ;; \e$B7k2L$H$7$F!"!X$+$s$J!Y$NFI$_%b!<%I$K$J$k!#\e(B
1305 ;; \e$B%j!<%8%g%s$KB8:_$7$F$$$k6uGrJ8;z$H@)8fJ8;z$O<N$F$i$l$k!#\e(B
1306
1307 (defun canna-rk-region (start end)
1308   "Convert region into kana."
1309   (interactive "*r")
1310   (let ((str nil) (len 0) (i 0) (res 0))
1311     (setq str (buffer-substring start end))
1312     (setq len (length str))
1313     (while (< i len)
1314       (let ((ch (elt str i)))
1315         (if (> ch ? )
1316             (setq res (canna-do-function canna-func-functional-insert ch)) ))
1317       (setq i (1+ i)) )
1318     res))
1319
1320 (defun canna-rk-trans-region (start end)
1321   "Insert alpha-numeric string as it is sent from keyboard."
1322   (interactive "*r")
1323   (let ((res))
1324     (setq res (canna-rk-region start end))
1325     (delete-region start end)
1326     (if (null canna:*japanese-mode*)
1327         (progn
1328           (setq canna:*exit-japanese-mode* t) ))
1329     (setq res (canna-do-function canna-func-henkan))
1330     (canna:enter-canna-mode)
1331     (canna:display-candidates res) ))
1332
1333 ;; \e$B%+!<%=%k$N:8$K$"$k\e(B arg \e$B%o!<%I$N%m!<%^;z$r!X$+$s$J!Y$K?)$o$9!#\e(B
1334
1335 (defun canna-rk-trans (arg)
1336   (interactive "*p")
1337   (let ((po (point)))
1338     (skip-chars-backward "-a-zA-Z.,?!~")
1339     (if (not (eq (point) po))
1340         (canna-rk-trans-region (point) po) )))
1341
1342 (defun canna-henkan-kakutei-and-self-insert (arg)
1343   (interactive "*p")
1344   (if canna:*japanese-mode*
1345       (canna-functional-insert-command arg)
1346     (progn
1347       (setq unread-command-events (list last-command-event))
1348       (canna-kakutei-to-basic-stat)) ))
1349
1350 (defun canna-kakutei-to-basic-stat ()
1351   (let ((res 0)
1352         (kakutei canna-henkan-string))
1353     (while (not canna-empty-info)
1354 ;      (setq res (canna-key-proc ?\C-m)))
1355       (setq res (canna-do-function canna-func-kakutei)))
1356     (setq canna-kakutei-string kakutei)
1357     (canna:display-candidates (length canna-kakutei-string))
1358     (if (not canna:*japanese-mode*)
1359         (mode-line-canna-mode-update canna:*alpha-mode-string*))
1360     ))
1361
1362 (defun canna-minibuffer-henkan-kakutei-and-self-insert (arg)
1363   (interactive "p")
1364   (set-window-buffer (minibuffer-window) canna:*saved-minibuffer*)
1365   (select-window canna:*previous-window*)
1366   (if canna:*japanese-mode*
1367       (canna:functional-insert-command2 last-command-event arg)
1368     (progn
1369       (setq unread-command-events (list last-command-event))
1370       (canna-kakutei-to-basic-stat)) ))
1371
1372 (defun canna-setup-for-being-boiled ()
1373   (let ((ch (1+ ? )))
1374     (while (< ch 127)
1375       (define-key canna-mode-map (make-string 1 ch) 'canna-henkan-kakutei-and-self-insert)
1376       (define-key canna-minibuffer-mode-map (make-string 1 ch) 'canna-minibuffer-henkan-kakutei-and-self-insert)
1377       (setq ch (1+ ch)))))
1378
1379 (defvar rK-trans-key "\C-j" "for `boil' only")
1380 (make-variable-buffer-local 'rK-trans-key)
1381
1382 (defun canna-boil ()
1383   "`canna-boil' cooks `canna' as if `boil' does for `egg'."
1384   (interactive)
1385   (canna-setup-for-being-boiled)
1386   (local-set-key rK-trans-key 'canna-rk-trans)
1387   (message "boiled"))
1388
1389 ;;
1390 ;; \e$B?'$E$1$N$?$a$N4X?t\e(B
1391 ;;
1392 (defun canna:yomi-attr-on (start end)
1393   (if (overlayp canna:*yomi-overlay*)
1394       (move-overlay canna:*yomi-overlay* start end)
1395     (overlay-put (setq canna:*yomi-overlay* (make-overlay start end nil nil t))
1396                  'face 
1397                  (if canna:color-p 'attr-yomi 'underline))
1398     )
1399   )
1400
1401 (defun canna:yomi-attr-off (start end);
1402   (and (overlayp canna:*yomi-overlay*) 
1403        (delete-overlay canna:*yomi-overlay*)
1404        )
1405   )
1406
1407 (defun canna:henkan-attr-on (start end)
1408   (if (overlayp canna:*henkan-overlay*)
1409       (move-overlay canna:*henkan-overlay* start end)
1410     (overlay-put (setq canna:*henkan-overlay*
1411                        (make-overlay start end nil nil t))
1412                  'face 
1413                  (if canna:color-p 'attr-taishou 'region))
1414     ;; (overlay-put canna:*henkan-overlay*
1415     ;;              'before-string
1416     ;;              "|")
1417     ;; (overlay-put canna:*henkan-overlay*
1418     ;;              'after-string
1419     ;;              "|")
1420     )
1421   )
1422
1423 (defun canna:henkan-attr-off (start end)
1424   (and (overlayp canna:*henkan-overlay*)
1425        (delete-overlay canna:*henkan-overlay*)
1426        )
1427   )
1428
1429 (defun canna:select-attr-on (start end)
1430   (if (overlayp canna:*select-overlay*)
1431       (move-overlay canna:*select-overlay* start end)
1432     (overlay-put (setq canna:*select-overlay*
1433                        (make-overlay start end nil nil t))
1434                  'face 
1435                  'attr-select))
1436   )
1437
1438 (defun canna:select-attr-off (start end)
1439   (and (overlayp canna:*select-overlay*)
1440        (delete-overlay canna:*select-overlay*)
1441        )
1442   )
1443
1444
1445 (provide 'canna)
1446
1447 ;;; canna.el ends here