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