comparison lisp/international/kkc.el @ 22766:a83818674920

(kkc-show-conversion-list-index-chars): Default value changed. (kkc-keymap): Renamed from kkc-mode-map. Key binding for kkc-non-kkc-command are deleted. (kkc-mode): This function deleted. (kkc-canceled): This variable deleted. (kkc-converting): New variable. (kkc-region): 3rd optional arg is deleted. Completely rewritten to adjust for the change in quail.el. (kkc-terminate, kkc-cancel): Adjusted for the change of kkc-region. (kkc-non-kkc-command): This function deleted. (kkc-select-from-list): Use last-input-event instead of last-input-char. Put an unknown event back to unread-input-method-events.
author Kenichi Handa <handa@m17n.org>
date Thu, 16 Jul 1998 00:14:44 +0000
parents c3360a392ae4
children 9c3f4ae0d7ed
comparison
equal deleted inserted replaced
22765:7cf2c3800e8f 22766:a83818674920
64 kkc-init-file-name)))) 64 kkc-init-file-name))))
65 65
66 ;; Sequence of characters to be used for indexes for shown list. The 66 ;; Sequence of characters to be used for indexes for shown list. The
67 ;; Nth character is for the Nth conversion in the list currently shown. 67 ;; Nth character is for the Nth conversion in the list currently shown.
68 (defvar kkc-show-conversion-list-index-chars 68 (defvar kkc-show-conversion-list-index-chars
69 "1234567890abcdefghijklmnopqrsuvwxyz") 69 "1234567890")
70 70
71 (defvar kkc-mode-map 71 (defvar kkc-keymap
72 (let ((map (make-keymap)) 72 (let ((map (make-keymap))
73 (len (length kkc-show-conversion-list-index-chars))
73 (i 0)) 74 (i 0))
74 (while (< i 128) 75 (while (< i len)
75 (define-key map (char-to-string i) 'kkc-non-kkc-command) 76 (define-key map
77 (char-to-string (aref kkc-show-conversion-list-index-chars i))
78 'kkc-select-from-list)
76 (setq i (1+ i))) 79 (setq i (1+ i)))
77 (setq i 0)
78 (let ((len (length kkc-show-conversion-list-index-chars)))
79 (while (< i len)
80 (define-key map
81 (char-to-string (aref kkc-show-conversion-list-index-chars i))
82 'kkc-select-from-list)
83 (setq i (1+ i))))
84 (define-key map " " 'kkc-next) 80 (define-key map " " 'kkc-next)
85 (define-key map (char-to-string help-char) 'help-command)
86 (define-key map "\r" 'kkc-terminate) 81 (define-key map "\r" 'kkc-terminate)
87 (define-key map "\C-@" 'kkc-first-char-only) 82 (define-key map "\C-@" 'kkc-first-char-only)
88 (define-key map "\C-n" 'kkc-next) 83 (define-key map "\C-n" 'kkc-next)
89 (define-key map "\C-p" 'kkc-prev) 84 (define-key map "\C-p" 'kkc-prev)
90 (define-key map "\C-i" 'kkc-shorter) 85 (define-key map "\C-i" 'kkc-shorter)
97 (define-key map "l" 'kkc-show-conversion-list-or-next-group) 92 (define-key map "l" 'kkc-show-conversion-list-or-next-group)
98 (define-key map "L" 'kkc-show-conversion-list-or-prev-group) 93 (define-key map "L" 'kkc-show-conversion-list-or-prev-group)
99 (define-key map [?\C- ] 'kkc-first-char-only) 94 (define-key map [?\C- ] 'kkc-first-char-only)
100 (define-key map [delete] 'kkc-cancel) 95 (define-key map [delete] 'kkc-cancel)
101 (define-key map [return] 'kkc-terminate) 96 (define-key map [return] 'kkc-terminate)
102 (let ((meta-map (make-sparse-keymap)))
103 (define-key map (char-to-string meta-prefix-char) meta-map)
104 (define-key map [escape] meta-map))
105 (define-key map (vector meta-prefix-char t) 'kkc-non-kkc-command)
106 ;; At last, define default key binding.
107 (define-key map [t] 'kkc-non-kkc-command)
108 map) 97 map)
109 "Keymap for KKC (Kana Kanji Conversion) mode.") 98 "Keymap for KKC (Kana Kanji Converter).")
110
111 (defun kkc-mode ()
112 "Major mode for converting Kana string to Kanji-Kana mixed string.
113 Commands:
114 \\{kkc-mode-map}"
115 (setq major-mode 'kkc-mode)
116 (setq mode-name "KKC")
117 (use-local-map kkc-mode-map)
118 (run-hooks 'kkc-mode-hook))
119 99
120 ;;; Internal variables used in KKC. 100 ;;; Internal variables used in KKC.
121 101
122 ;; The current Kana string to be converted. 102 ;; The current Kana string to be converted.
123 (defvar kkc-original-kana nil) 103 (defvar kkc-original-kana nil)
141 121
142 (defvar kkc-show-conversion-list-count 4 122 (defvar kkc-show-conversion-list-count 4
143 "Count of successive `kkc-next' or `kkc-prev' to show conversion list.") 123 "Count of successive `kkc-next' or `kkc-prev' to show conversion list.")
144 124
145 ;; Provided that `kkc-current-key' is [A B C D E F G H I], the current 125 ;; Provided that `kkc-current-key' is [A B C D E F G H I], the current
146 ;; conversion target is [A B C D E F], the sequence of which 126 ;; conversion target is [A B C D E F], and the sequence of which
147 ;; conversion is found is [A B C D]: 127 ;; conversion is found is [A B C D]:
148 ;; 128 ;;
149 ;; A B C D E F G H I 129 ;; A B C D E F G H I
150 ;; kkc-overlay-head (black): |<--------->| 130 ;; kkc-overlay-head (black): |<--------->|
151 ;; kkc-overlay-tail (underline): |<------->| 131 ;; kkc-overlay-tail (underline): |<------->|
157 (defvar kkc-length-head nil) 137 (defvar kkc-length-head nil)
158 (defvar kkc-length-converted nil) 138 (defvar kkc-length-converted nil)
159 139
160 ;; Cursor type (`box' or `bar') of the current frame. 140 ;; Cursor type (`box' or `bar') of the current frame.
161 (defvar kkc-cursor-type nil) 141 (defvar kkc-cursor-type nil)
162
163 ;; Flag to tell if the current conversion is canceled. If non-nil,
164 ;; the value is a buffer position of the head of currently active
165 ;; conversion region.
166 (defvar kkc-canceled nil)
167 142
168 ;; Lookup SKK dictionary to set list of conversions in 143 ;; Lookup SKK dictionary to set list of conversions in
169 ;; kkc-current-conversions for key sequence kkc-current-key of length 144 ;; kkc-current-conversions for key sequence kkc-current-key of length
170 ;; LEN. If no conversion is found in the dictionary, don't change 145 ;; LEN. If no conversion is found in the dictionary, don't change
171 ;; kkc-current-conversions and return nil. 146 ;; kkc-current-conversions and return nil.
202 (if (= len 1) 177 (if (= len 1)
203 (setq kkc-length-converted 1 178 (setq kkc-length-converted 1
204 kkc-current-conversions-width nil 179 kkc-current-conversions-width nil
205 kkc-current-conversions (cons 0 nil))))))) 180 kkc-current-conversions (cons 0 nil)))))))
206 181
182 (defvar kkc-converting nil)
183
207 ;;;###autoload 184 ;;;###autoload
208 (defun kkc-region (from to &optional kkc-mode-exit-function) 185 (defun kkc-region (from to)
209 "Convert Kana string in the current region to Kanji-Kana mixed string. 186 "Convert Kana string in the current region to Kanji-Kana mixed string.
210 After one candidate of conversion is shown in the region, users are 187 Users can select a desirable conversion interactively.
211 put in KKC major mode to select a desirable conversion. 188 When called from a program, expects two arguments,
212 Optional arg KKC-MODE-EXIT-FUNCTION if non-nil is called on exiting KKC mode." 189 positions FROM and TO (integers or markers) specifying the target region.
190 When it returns, the point is at the tail of the selected conversion,
191 and the return value is the length of the conversion."
213 (interactive "r") 192 (interactive "r")
214 (setq kkc-original-kana (buffer-substring from to)) 193 (setq kkc-original-kana (buffer-substring from to))
215 (goto-char from) 194 (goto-char from)
216 195
217 ;; Setup overlays. 196 ;; Setup overlays.
222 (if (overlayp kkc-overlay-tail) 201 (if (overlayp kkc-overlay-tail)
223 (move-overlay kkc-overlay-tail to to) 202 (move-overlay kkc-overlay-tail to to)
224 (setq kkc-overlay-tail (make-overlay to to nil nil t)) 203 (setq kkc-overlay-tail (make-overlay to to nil nil t))
225 (overlay-put kkc-overlay-tail 'face 'underline)) 204 (overlay-put kkc-overlay-tail 'face 'underline))
226 205
227 ;; After updating the conversion region with the first candidate of 206 (setq kkc-current-key (string-to-vector kkc-original-kana))
228 ;; conversion, jump into a recursive editing environment with KKC 207 (setq kkc-length-head (length kkc-current-key))
229 ;; mode. 208 (setq kkc-length-converted 0)
230 (let ((overriding-local-map nil) 209
231 (previous-local-map (current-local-map)) 210 ;; At first convert the region to the first candidate.
232 (minor-mode-alist nil) 211 (let ((first t))
233 (minor-mode-map-alist nil) 212 (while (not (kkc-lookup-key kkc-length-head nil first))
234 (current-input-method-title kkc-input-method-title) 213 (setq kkc-length-head (1- kkc-length-head)
235 major-mode mode-name) 214 first nil))
236 (unwind-protect 215 (goto-char to)
237 (let (len) 216 (kkc-update-conversion 'all))
238 (setq kkc-canceled nil) 217
239 (setq kkc-current-key (string-to-vector kkc-original-kana)) 218 ;; Then, ask users to selecte a desirable conversoin.
240 (setq kkc-length-head (length kkc-current-key)) 219 (let ((current-input-method-title kkc-input-method-title)
241 (setq len kkc-length-head) 220 (input-method-function nil))
242 (setq kkc-length-converted 0) 221 (force-mode-line-update)
243 (while (not (kkc-lookup-key kkc-length-head nil 222 (setq kkc-converting t)
244 (< kkc-length-head len))) 223 (while kkc-converting
245 (setq kkc-length-head (1- kkc-length-head))) 224 (let* ((echo-keystrokes 0)
246 (goto-char to) 225 (keyseq (read-key-sequence nil))
247 (kkc-update-conversion 'all) 226 (cmd (lookup-key kkc-keymap keyseq)))
248 (kkc-mode) 227 (if (commandp cmd)
249 (recursive-edit)) 228 (condition-case err
250 (goto-char (overlay-end kkc-overlay-tail)) 229 (call-interactively cmd)
251 (delete-overlay kkc-overlay-head) 230 (kkc-error (message "%s" (cdr err)) (beep)))
252 (delete-overlay kkc-overlay-tail) 231 ;; KEYSEQ is not defined in KKC keymap.
253 (use-local-map previous-local-map) 232 ;; Let's put the event back.
254 (if (and kkc-mode-exit-function 233 (setq unread-input-method-events
255 (fboundp kkc-mode-exit-function)) 234 (append (string-to-list keyseq) unread-input-method-events))
256 (funcall kkc-mode-exit-function (if kkc-canceled 235 (setq kkc-converting nil)))))
257 (cons kkc-canceled (point)))))))) 236
237 (force-mode-line-update)
238 (goto-char (overlay-end kkc-overlay-tail))
239 (prog1 (- (overlay-start kkc-overlay-head) from)
240 (delete-overlay kkc-overlay-head)
241 (delete-overlay kkc-overlay-tail)))
258 242
259 (defun kkc-terminate () 243 (defun kkc-terminate ()
260 "Exit from KKC mode by fixing the current conversion." 244 "Exit from KKC mode by fixing the current conversion."
261 (interactive) 245 (interactive)
262 (throw 'exit nil)) 246 (setq kkc-converting nil))
263
264 (defun kkc-non-kkc-command ()
265 "Exit from KKC mode by fixing the current conversion.
266 After that, handle the event which invoked this command."
267 (interactive)
268 (let* ((key (this-command-keys))
269 (keylist (listify-key-sequence key)))
270 (setq unread-command-events (append keylist unread-command-events)))
271 (kkc-terminate))
272 247
273 (defun kkc-cancel () 248 (defun kkc-cancel ()
274 "Exit from KKC mode by canceling any conversions." 249 "Exit from KKC mode by canceling any conversions."
275 (interactive) 250 (interactive)
276 (setq kkc-canceled (overlay-start kkc-overlay-head)) 251 (goto-char (overlay-start kkc-overlay-head))
277 (goto-char kkc-canceled)
278 (delete-region (overlay-start kkc-overlay-head) 252 (delete-region (overlay-start kkc-overlay-head)
279 (overlay-end kkc-overlay-tail)) 253 (overlay-end kkc-overlay-tail))
280 (insert kkc-original-kana) 254 (insert kkc-original-kana)
281 (kkc-terminate)) 255 (kkc-terminate))
282 256
347 (i 0)) 321 (i 0))
348 (if (> len maxlen) 322 (if (> len maxlen)
349 (setq len maxlen)) 323 (setq len maxlen))
350 (while (< i len) 324 (while (< i len)
351 (if (= (aref kkc-show-conversion-list-index-chars i) 325 (if (= (aref kkc-show-conversion-list-index-chars i)
352 last-input-char) 326 last-input-event)
353 (setq idx i i len) 327 (setq idx i i len)
354 (setq i (1+ i)))))) 328 (setq i (1+ i))))))
355 (if idx 329 (if idx
356 (progn 330 (progn
357 (setcar kkc-current-conversions 331 (setcar kkc-current-conversions
358 (+ (aref (aref kkc-current-conversions-width 0) 0) idx)) 332 (+ (aref (aref kkc-current-conversions-width 0) 0) idx))
359 (kkc-show-conversion-list-update) 333 (kkc-show-conversion-list-update)
360 (kkc-update-conversion)) 334 (kkc-update-conversion))
361 (setq unread-command-events (list last-input-event)) 335 (setq unread-input-method-events
336 (cons last-input-event unread-input-method-events))
362 (kkc-terminate)))) 337 (kkc-terminate))))
363 338
364 (defun kkc-katakana () 339 (defun kkc-katakana ()
365 "Convert to Katakana." 340 "Convert to Katakana."
366 (interactive) 341 (interactive)