Spelling fixes.
[emacs.git] / lisp / obsolete / iso-acc.el
blob347db281f1a229909f7b95024503caab336b848d
1 ;;; iso-acc.el --- minor mode providing electric accent keys
3 ;; Copyright (C) 1993-1994, 1996, 2001-2011 Free Software Foundation, Inc.
5 ;; Author: Johan Vromans
6 ;; Maintainer: FSF
7 ;; Keywords: i18n
8 ;; Obsolete-since: 22.1
10 ;; This file is part of GNU Emacs.
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
13 ;; it under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation, either version 3 of the License, or
15 ;; (at your option) any later version.
17 ;; GNU Emacs is distributed in the hope that it will be useful,
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ;; GNU General Public License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
25 ;;; Commentary:
27 ;; Function `iso-accents-mode' activates a minor mode in which
28 ;; typewriter "dead keys" are emulated. The purpose of this emulation
29 ;; is to provide a simple means for inserting accented characters
30 ;; according to the ISO-8859-1...3 character sets.
32 ;; In `iso-accents-mode', pseudo accent characters are used to
33 ;; introduce accented keys. The pseudo-accent characters are:
35 ;; ' (minute) -> acute accent
36 ;; ` (backtick) -> grave accent
37 ;; " (second) -> diaeresis
38 ;; ^ (caret) -> circumflex
39 ;; ~ (tilde) -> tilde over the character
40 ;; / (slash) -> slash through the character.
41 ;; Also: /A is A-with-ring and /E is AE ligature.
42 ;; These two are enabled only if you set iso-accents-enable
43 ;; to include them:
44 ;; . (period) -> dot over the character (some languages only)
45 ;; , (cedilla) -> cedilla under the character (some languages only)
47 ;; The action taken depends on the key that follows the pseudo accent.
48 ;; In general:
50 ;; pseudo-accent + appropriate letter -> accented letter
51 ;; pseudo-accent + space -> pseudo-accent (except comma and period)
52 ;; pseudo-accent + pseudo-accent -> accent (if available)
53 ;; pseudo-accent + other -> pseudo-accent + other
55 ;; If the pseudo-accent is followed by anything else than a
56 ;; self-insert-command, the dead-key code is terminated, the
57 ;; pseudo-accent inserted 'as is' and the bell is rung to signal this.
59 ;; Function `iso-accents-mode' can be used to enable the iso accents
60 ;; minor mode, or disable it.
62 ;; If you want only some of these characters to serve as accents,
63 ;; add a language to `iso-languages' which specifies the accent characters
64 ;; that you want, then select the language with `iso-accents-customize'.
66 ;;; Code:
68 (provide 'iso-acc)
70 (defgroup iso-acc nil
71 "Minor mode providing electric accent keys."
72 :prefix "iso-accents-"
73 :group 'i18n)
75 (defcustom iso-accents-insert-offset nonascii-insert-offset
76 "*Offset added by ISO Accents mode to character codes 0200 and above."
77 :type 'integer
78 :group 'iso-acc)
80 (defvar iso-languages
81 '(("catalan"
82 ;; Note this includes some extra characters used in Spanish,
83 ;; on the idea that someone who uses Catalan is likely to use Spanish
84 ;; as well.
85 (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
86 (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363) (?u . ?\372)
87 (?\ . ?'))
88 (?` (?A . ?\300) (?E . ?\310) (?O . ?\322)
89 (?a . ?\340) (?e . ?\350) (?o . ?\362)
90 (?\ . ?`))
91 (?\" (?I . ?\317) (?U . ?\334) (?i . ?\357) (?u . ?\374)
92 (?\ . ?\"))
93 (?~ (?C . ?\307) (?N . ?\321) (?c . ?\347) (?n . ?\361)
94 (?> . ?\273) (?< . ?\253) (?! . ?\241) (?? . ?\277)
95 (?\ . ?\~)))
97 ("esperanto"
98 (?^ (?H . ?\246) (?J . ?\254) (?h . ?\266) (?j . ?\274) (?C . ?\306)
99 (?G . ?\330) (?S . ?\336) (?c . ?\346) (?g . ?\370) (?s . ?\376)
100 (?^ . ?^) (?\ . ?^))
101 (?~ (?U . ?\335) (?u . ?\375) (?\ . ?~)))
103 ("french"
104 (?' (?E . ?\311) (?C . ?\307) (?e . ?\351) (?c . ?\347)
105 (?\ . ?'))
106 (?` (?A . ?\300) (?E . ?\310) (?U . ?\331)
107 (?a . ?\340) (?e . ?\350) (?u . ?\371)
108 (?\ . ?`))
109 (?^ (?A . ?\302) (?E . ?\312) (?I . ?\316) (?O . ?\324) (?U . ?\333)
110 (?a . ?\342) (?e . ?\352) (?i . ?\356) (?o . ?\364) (?u . ?\373)
111 (?\ . ?^))
112 (?\" (?E . ?\313) (?I . ?\317)
113 (?e . ?\353) (?i . ?\357)
114 (?\ . ?\"))
115 (?~ (?< . ?\253) (?> . ?\273) (?C . ?\307) (?c . ?\347)
116 (?\ . ?~))
117 (?, (?C . ?\307) (?c . ?\347) (?\ . ?\,)))
119 ("german"
120 (?\" (?A . ?\304) (?O . ?\326) (?U . ?\334)
121 (?a . ?\344) (?o . ?\366) (?u . ?\374) (?s . ?\337) (?\ . ?\")))
123 ("irish"
124 (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
125 (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363) (?u . ?\372)
126 (?\ . ?')))
128 ("portuguese"
129 (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
130 (?C . ?\307) (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363)
131 (?u . ?\372) (?c . ?\347)
132 (?\ . ?'))
133 (?` (?A . ?\300) (?a . ?\340)
134 (?\ . ?`))
135 (?^ (?A . ?\302) (?E . ?\312) (?O . ?\324)
136 (?a . ?\342) (?e . ?\352) (?o . ?\364)
137 (?\ . ?^))
138 (?\" (?U . ?\334) (?u . ?\374)
139 (?\ . ?\"))
140 (?~ (?A . ?\303) (?O . ?\325) (?a . ?\343) (?o . ?\365)
141 (?C . ?\307) (?N . ?\321) (?c . ?\347) (?n . ?\361)
142 (?\ . ?~))
143 (?, (?c . ?\347) (?C . ?\307) (?, . ?,)))
145 ("spanish"
146 (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
147 (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363) (?u . ?\372)
148 (?\ . ?'))
149 (?\" (?U . ?\334) (?u . ?\374) (?\ . ?\"))
150 (?\~ (?N . ?\321) (?n . ?\361) (?> . ?\273) (?< . ?\253) (?! . ?\241)
151 (?? . ?\277) (?\ . ?\~)))
153 ("latin-1"
154 (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
155 (?Y . ?\335) (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363)
156 (?u . ?\372) (?y . ?\375) (?' . ?\264)
157 (?\ . ?'))
158 (?` (?A . ?\300) (?E . ?\310) (?I . ?\314) (?O . ?\322) (?U . ?\331)
159 (?a . ?\340) (?e . ?\350) (?i . ?\354) (?o . ?\362) (?u . ?\371)
160 (?` . ?`) (?\ . ?`))
161 (?^ (?A . ?\302) (?E . ?\312) (?I . ?\316) (?O . ?\324) (?U . ?\333)
162 (?a . ?\342) (?e . ?\352) (?i . ?\356) (?o . ?\364) (?u . ?\373)
163 (?^ . ?^) (?\ . ?^))
164 (?\" (?A . ?\304) (?E . ?\313) (?I . ?\317) (?O . ?\326) (?U . ?\334)
165 (?a . ?\344) (?e . ?\353) (?i . ?\357) (?o . ?\366) (?s . ?\337)
166 (?u . ?\374) (?y . ?\377)
167 (?\" . ?\250) (?\ . ?\"))
168 (?~ (?A . ?\303) (?C . ?\307) (?D . ?\320) (?N . ?\321) (?O . ?\325)
169 (?T . ?\336) (?a . ?\343) (?c . ?\347) (?d . ?\360) (?n . ?\361)
170 (?o . ?\365) (?t . ?\376)
171 (?> . ?\273) (?< . ?\253) (?! . ?\241) (?? . ?\277)
172 (?\~ . ?\270) (?\ . ?~))
173 (?/ (?A . ?\305) (?E . ?\306) (?O . ?\330) (?a . ?\345) (?e . ?\346)
174 (?o . ?\370)
175 (?/ . ?\260) (?\ . ?/)))
177 ("latin-2" latin-iso8859-2
178 (?' (?A . ?\301) (?C . ?\306) (?D . ?\320) (?E . ?\311) (?I . ?\315)
179 (?L . ?\305) (?N . ?\321) (?O . ?\323) (?R . ?\300) (?S . ?\246)
180 (?U . ?\332) (?Y . ?\335) (?Z . ?\254)
181 (?a . ?\341) (?c . ?\346) (?d . ?\360) (?e . ?\351) (?i . ?\355)
182 (?l . ?\345) (?n . ?\361) (?o . ?\363) (?r . ?\340) (?s . ?\266)
183 (?u . ?\372) (?y . ?\375) (?z . ?\274)
184 (?' . ?\264) (?\ . ?'))
185 (?` (?A . ?\241) (?C . ?\307) (?E . ?\312) (?L . ?\243) (?S . ?\252)
186 (?T . ?\336) (?Z . ?\257)
187 (?a . ?\261) (?l . ?\263) (?c . ?\347) (?e . ?\352) (?s . ?\272)
188 (?t . ?\376) (?z . ?\277)
189 (?` . ?\252)
190 (?. . ?\377) (?\ . ?`))
191 (?^ (?A . ?\302) (?I . ?\316) (?O . ?\324)
192 (?a . ?\342) (?i . ?\356) (?o . ?\364)
193 (?^ . ?^) ; no special code?
194 (?\ . ?^))
195 (?\" (?A . ?\304) (?E . ?\313) (?O . ?\326) (?U . ?\334)
196 (?a . ?\344) (?e . ?\353) (?o . ?\366) (?s . ?\337) (?u . ?\374)
197 (?\" . ?\250)
198 (?\ . ?\"))
199 (?~ (?A . ?\303) (?C . ?\310) (?D . ?\317) (?L . ?\245) (?N . ?\322)
200 (?O . ?\325) (?R . ?\330) (?S . ?\251) (?T . ?\253) (?U . ?\333)
201 (?Z . ?\256)
202 (?a . ?\343) (?c . ?\350) (?d . ?\357) (?l . ?\265) (?n . ?\362)
203 (?o . ?\365) (?r . ?\370) (?s . ?\271) (?t . ?\273) (?u . ?\373)
204 (?z . ?\276)
205 (?v . ?\242) ; v accent
206 (?\~ . ?\242) ; v accent
207 (?\. . ?\270) ; cedilla accent
208 (?\ . ?~)))
210 ("latin-3" latin-iso8859-3
211 (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
212 (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363) (?u . ?\372)
213 (?' . ?\264) (?\ . ?'))
214 (?` (?A . ?\300) (?E . ?\310) (?I . ?\314) (?O . ?\322) (?U . ?\331)
215 (?a . ?\340) (?e . ?\350) (?i . ?\354) (?o . ?\362) (?u . ?\371)
216 (?` . ?`) (?\ . ?`))
217 (?^ (?A . ?\302) (?C . ?\306) (?E . ?\312) (?G . ?\330) (?H . ?\246)
218 (?I . ?\316) (?J . ?\254) (?O . ?\324) (?S . ?\336) (?U . ?\333)
219 (?a . ?\342) (?c . ?\346) (?e . ?\352) (?g . ?\370) (?h . ?\266)
220 (?i . ?\356) (?j . ?\274) (?o . ?\364) (?s . ?\376) (?u . ?\373)
221 (?^ . ?^) (?\ . ?^))
222 (?\" (?A . ?\304) (?E . ?\313) (?I . ?\317) (?O . ?\326) (?U . ?\334)
223 (?a . ?\344) (?e . ?\353) (?i . ?\357) (?o . ?\366) (?u . ?\374)
224 (?s . ?\337)
225 (?\" . ?\250) (?\ . ?\"))
226 (?~ (?A . ?\303) (?C . ?\307) (?D . ?\320) (?N . ?\321) (?O . ?\325)
227 (?a . ?\343) (?c . ?\347) (?d . ?\360) (?n . ?\361) (?o . ?\365)
228 (?$ . ?\245) (?S . ?\252) (?s . ?\272) (?G . ?\253) (?g . ?\273)
229 (?U . ?\335) (?u . ?\375) (?` . ?\242)
230 (?~ . ?\270) (?\ . ?~))
231 (?/ (?C . ?\305) (?G . ?\325) (?H . ?\241) (?I . ?\251) (?Z . ?\257)
232 (?c . ?\345) (?g . ?\365) (?h . ?\261) (?i . ?\271) (?z . ?\277)
233 (?r . ?\256)
234 (?. . ?\377) (?# . ?\243) (?$ . ?\244)
235 (?/ . ?\260) (?\ . ?/))
236 (?. (?C . ?\305) (?G . ?\325) (?I . ?\251) (?Z . ?\257)
237 (?c . ?\345) (?g . ?\365) (?z . ?\277))))
238 "List of language-specific customizations for the ISO Accents mode.
240 Each element of the list is of the form
242 (LANGUAGE [CHARSET]
243 (PSEUDO-ACCENT MAPPINGS)
244 (PSEUDO-ACCENT MAPPINGS)
245 ...)
247 LANGUAGE is a string naming the language.
248 CHARSET (which may be omitted) is the symbol name
249 of the character set used in this language.
250 If CHARSET is omitted, latin-iso8859-1 is the default.
251 PSEUDO-ACCENT is a char specifying an accent key.
252 MAPPINGS are cons cells of the form (CHAR . ISO-CHAR).
254 The net effect is that the key sequence PSEUDO-ACCENT CHAR is mapped
255 to ISO-CHAR on input.")
257 (defvar iso-language nil
258 "Language for which ISO Accents mode is currently customized.
259 Change it with the `iso-accents-customize' function.")
261 (defvar iso-accents-list nil
262 "Association list for ISO accent combinations, for the chosen language.")
264 (defcustom iso-accents-mode nil
265 "*Non-nil enables ISO Accents mode.
266 Setting this variable makes it local to the current buffer.
267 See the function `iso-accents-mode'."
268 :type 'boolean
269 :group 'iso-acc)
270 (make-variable-buffer-local 'iso-accents-mode)
272 (defcustom iso-accents-enable '(?' ?` ?^ ?\" ?~ ?/)
273 "*List of accent keys that become prefixes in ISO Accents mode.
274 The default is (?' ?` ?^ ?\" ?~ ?/), which contains all the supported
275 accent keys. If you set this variable to a list in which some of those
276 characters are missing, the missing ones do not act as accents.
278 Note that if you specify a language with `iso-accents-customize',
279 that can also turn off certain prefixes (whichever ones are not needed in
280 the language you choose)."
281 :type '(repeat character)
282 :group 'iso-acc)
284 (defun iso-accents-accent-key (prompt)
285 "Modify the following character by adding an accent to it."
286 ;; Pick up the accent character.
287 (if (and iso-accents-mode
288 (memq last-input-event iso-accents-enable))
289 (iso-accents-compose prompt)
290 (vector last-input-event)))
293 ;; The iso-accents-compose function is called deep inside Emacs' read
294 ;; key sequence machinery, so the call to read-event below actually
295 ;; recurses into that machinery. Doing that does not cause any
296 ;; problem on its own, but read-event will have marked the window's
297 ;; display matrix to be accurate -- which is broken by the subsequent
298 ;; call to delete-region. Therefore, we must call force-window-update
299 ;; after delete-region to explicitly clear the accurate state of the
300 ;; window's display matrix.
302 (defun iso-accents-compose (prompt)
303 (let* ((first-char last-input-event)
304 (list (assq first-char iso-accents-list))
305 ;; Wait for the second key and look up the combination.
306 (second-char (if (or prompt
307 (not (eq (key-binding "a")
308 'self-insert-command))
309 ;; Not at start of a key sequence.
310 (> (length (this-single-command-keys)) 1)
311 ;; Called from anything but the command loop.
312 this-command)
313 (progn
314 (message "%s%c"
315 (or prompt "Compose with ")
316 first-char)
317 (read-event))
318 (insert first-char)
319 (prog1 (read-event)
320 (delete-region (1- (point)) (point))
321 ;; Display is no longer up-to-date.
322 (force-window-update (selected-window)))))
323 (entry (cdr (assq second-char list))))
324 (if entry
325 ;; Found it: return the mapped char
326 (vector
327 (if (and enable-multibyte-characters
328 (>= entry ?\200))
329 (+ iso-accents-insert-offset entry)
330 entry))
331 ;; Otherwise, advance and schedule the second key for execution.
332 (push second-char unread-command-events)
333 (vector first-char))))
335 ;; It is a matter of taste if you want the minor mode indicated
336 ;; in the mode line...
337 ;; If so, uncomment the next four lines.
338 ;; (or (assq 'iso-accents-mode minor-mode-alist)
339 ;; (setq minor-mode-alist
340 ;; (append minor-mode-alist
341 ;; '((iso-accents-mode " ISO-Acc")))))
343 ;;;###autoload
344 (defun iso-accents-mode (&optional arg)
345 "Toggle ISO Accents mode, in which accents modify the following letter.
346 This permits easy insertion of accented characters according to ISO-8859-1.
347 When Iso-accents mode is enabled, accent character keys
348 \(`, ', \", ^, / and ~) do not self-insert; instead, they modify the following
349 letter key so that it inserts an ISO accented letter.
351 You can customize ISO Accents mode to a particular language
352 with the command `iso-accents-customize'.
354 Special combinations: ~c gives a c with cedilla,
355 ~d gives an Icelandic eth (d with dash).
356 ~t gives an Icelandic thorn.
357 \"s gives German sharp s.
358 /a gives a with ring.
359 /e gives an a-e ligature.
360 ~< and ~> give guillemots.
361 ~! gives an inverted exclamation mark.
362 ~? gives an inverted question mark.
364 With an argument, a positive argument enables ISO Accents mode,
365 and a negative argument disables it."
367 (interactive "P")
369 (if (if arg
370 ;; Negative arg means switch it off.
371 (<= (prefix-numeric-value arg) 0)
372 ;; No arg means toggle.
373 iso-accents-mode)
374 (setq iso-accents-mode nil)
376 ;; Enable electric accents.
377 (setq iso-accents-mode t)))
379 (defun iso-accents-customize (language)
380 "Customize the ISO accents machinery for a particular language.
381 It selects the customization based on the specifications in the
382 `iso-languages' variable."
383 (interactive (list (completing-read "Language: " iso-languages nil t)))
384 (let ((table (cdr (assoc language iso-languages)))
385 all-accents tail)
386 (if (not table)
387 (error "Unknown language `%s'" language)
388 (setq iso-accents-insert-offset (- (make-char (if (symbolp (car table))
389 (car table)
390 'latin-iso8859-1))
391 128))
392 (if (symbolp (car table))
393 (setq table (cdr table)))
394 (setq iso-language language
395 iso-accents-list table)
396 (if key-translation-map
397 (substitute-key-definition
398 'iso-accents-accent-key nil key-translation-map)
399 (setq key-translation-map (make-sparse-keymap)))
400 ;; Set up translations for all the characters that are used as
401 ;; accent prefixes in this language.
402 (setq tail iso-accents-list)
403 (while tail
404 (define-key key-translation-map (vector (car (car tail)))
405 'iso-accents-accent-key)
406 (setq tail (cdr tail))))))
408 (defun iso-accentuate (start end)
409 "Convert two-character sequences in region into accented characters.
410 Noninteractively, this operates on text from START to END.
411 This uses the same conversion that ISO Accents mode uses for type-in."
412 (interactive "r")
413 (save-excursion
414 (save-restriction
415 (narrow-to-region start end)
416 (goto-char start)
417 (forward-char 1)
418 (let (entry)
419 (while (< (point) end)
420 (if (and (memq (preceding-char) iso-accents-enable)
421 (setq entry (cdr (assq (following-char) (assq (preceding-char) iso-accents-list)))))
422 (progn
423 (forward-char -1)
424 (delete-char 2)
425 (insert entry)
426 (setq end (1- end)))
427 (forward-char 1)))))))
429 (defun iso-accent-rassoc-unit (value alist)
430 (let (elt acc)
431 (while (and alist (not elt))
432 (setq acc (car (car alist))
433 elt (car (rassq value (cdr (car alist))))
434 alist (cdr alist)))
435 (if elt
436 (cons acc elt))))
438 (defun iso-unaccentuate (start end)
439 "Convert accented characters in the region into two-character sequences.
440 Noninteractively, this operates on text from START to END.
441 This uses the opposite of the conversion done by ISO Accents mode for type-in."
442 (interactive "r")
443 (save-excursion
444 (save-restriction
445 (narrow-to-region start end)
446 (goto-char start)
447 (let (entry)
448 (while (< (point) end)
449 (if (and (> (following-char) 127)
450 (setq entry (iso-accent-rassoc-unit (following-char)
451 iso-accents-list)))
452 (progn
453 (delete-char 1)
454 (insert (car entry) (cdr entry))
455 (setq end (1+ end)))
456 (forward-char 1)))))))
458 (defun iso-deaccentuate (start end)
459 "Convert accented characters in the region into unaccented characters.
460 Noninteractively, this operates on text from START to END."
461 (interactive "r")
462 (save-excursion
463 (save-restriction
464 (narrow-to-region start end)
465 (goto-char start)
466 (let (entry)
467 (while (< (point) end)
468 (if (and (> (following-char) 127)
469 (setq entry (iso-accent-rassoc-unit (following-char)
470 iso-accents-list)))
471 (progn
472 (delete-char 1)
473 (insert (cdr entry)))
474 (forward-char 1)))))))
476 ;; Set up the default settings.
477 (iso-accents-customize "latin-1")
479 ;; Use Iso-Accents mode in the minibuffer
480 ;; if it was in use in the previous buffer.
481 (defun iso-acc-minibuf-setup ()
482 (setq iso-accents-mode
483 (with-current-buffer (window-buffer minibuffer-scroll-window)
484 iso-accents-mode)))
486 (add-hook 'minibuffer-setup-hook 'iso-acc-minibuf-setup)
488 ;;; iso-acc.el ends here