(bat-generic-mode): "::"-style comments don't
[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 (?\ . ?\"))
2e9537e7
KH
141 (?~ (?A . ?\303) (?O . ?\325) (?C . ?\307)
142 (?a . ?\343) (?o . ?\365) (?c . ?\347)
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) (?\ . ?'))
5ab71ca5
KH
186 (?, (?S . ?\252) (?T . ?\336)
187 (?s . ?\272) (?t . ?\376)
188 (?\ . ?,))
bbaf7c28 189 (?` (?A . ?\241) (?C . ?\307) (?E . ?\312) (?L . ?\243) (?S . ?\252)
690f9184
RS
190 (?T . ?\336) (?Z . ?\257)
191 (?a . ?\261) (?l . ?\263) (?c . ?\347) (?e . ?\352) (?s . ?\272)
192 (?t . ?\376) (?z . ?\277)
193 (?` . ?\252)
bbaf7c28 194 (?. . ?\377) (?\ . ?`))
690f9184
RS
195 (?^ (?A . ?\302) (?I . ?\316) (?O . ?\324)
196 (?a . ?\342) (?i . ?\356) (?o . ?\364)
bbaf7c28
RS
197 (?^ . ?^) ; no special code?
198 (?\ . ?^))
690f9184
RS
199 (?\" (?A . ?\304) (?E . ?\313) (?O . ?\326) (?U . ?\334)
200 (?a . ?\344) (?e . ?\353) (?o . ?\366) (?s . ?\337) (?u . ?\374)
201 (?\" . ?\250)
bbaf7c28 202 (?\ . ?\"))
ac2828d8
RS
203 (?~ (?A . ?\303) (?C . ?\310) (?D . ?\317) (?L . ?\245) (?N . ?\322)
204 (?O . ?\325) (?R . ?\330) (?S . ?\251) (?T . ?\253) (?U . ?\333)
205 (?Z . ?\256)
206 (?a . ?\343) (?c . ?\350) (?d . ?\357) (?l . ?\265) (?n . ?\362)
207 (?o . ?\365) (?r . ?\370) (?s . ?\271) (?t . ?\273) (?u . ?\373)
208 (?z . ?\276)
209 (?v . ?\242) ; v accent
210 (?\~ . ?\242) ; v accent
211 (?\. . ?\270) ; cedilla accent
212 (?\ . ?~)))
bbaf7c28 213
6ccc68a2 214 ("latin-3" latin-iso8859-3
bbaf7c28 215 (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
c84ae139
KH
216 (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363) (?u . ?\372)
217 (?' . ?\264) (?\ . ?'))
bbaf7c28
RS
218 (?` (?A . ?\300) (?E . ?\310) (?I . ?\314) (?O . ?\322) (?U . ?\331)
219 (?a . ?\340) (?e . ?\350) (?i . ?\354) (?o . ?\362) (?u . ?\371)
220 (?` . ?`) (?\ . ?`))
ac2828d8
RS
221 (?^ (?A . ?\302) (?C . ?\306) (?E . ?\312) (?G . ?\330) (?H . ?\246)
222 (?I . ?\316) (?J . ?\254) (?O . ?\324) (?S . ?\336) (?U . ?\333)
223 (?a . ?\342) (?c . ?\346) (?e . ?\352) (?g . ?\370) (?h . ?\266)
224 (?i . ?\356) (?j . ?\274) (?o . ?\364) (?s . ?\376) (?u . ?\373)
bbaf7c28
RS
225 (?^ . ?^) (?\ . ?^))
226 (?\" (?A . ?\304) (?E . ?\313) (?I . ?\317) (?O . ?\326) (?U . ?\334)
ac2828d8
RS
227 (?a . ?\344) (?e . ?\353) (?i . ?\357) (?o . ?\366) (?u . ?\374)
228 (?s . ?\337)
229 (?\" . ?\250) (?\ . ?\"))
c84ae139
KH
230 (?~ (?A . ?\303) (?C . ?\307) (?D . ?\320) (?N . ?\321) (?O . ?\325)
231 (?a . ?\343) (?c . ?\347) (?d . ?\360) (?n . ?\361) (?o . ?\365)
232 (?$ . ?\245) (?S . ?\252) (?s . ?\272) (?G . ?\253) (?g . ?\273)
ac2828d8
RS
233 (?U . ?\335) (?u . ?\375) (?` . ?\242)
234 (?~ . ?\270) (?\ . ?~))
235 (?/ (?C . ?\305) (?G . ?\325) (?H . ?\241) (?I . ?\251) (?Z . ?\257)
236 (?c . ?\345) (?g . ?\365) (?h . ?\261) (?i . ?\271) (?z . ?\277)
237 (?r . ?\256)
238 (?. . ?\377) (?# . ?\243) (?$ . ?\244)
de2188a1 239 (?/ . ?\260) (?\ . ?/))
ac2828d8 240 (?. (?C . ?\305) (?G . ?\325) (?I . ?\251) (?Z . ?\257)
d4cd7f7b 241 (?c . ?\345) (?g . ?\365) (?z . ?\277))))
700be2bd
RS
242 "List of language-specific customizations for the ISO Accents mode.
243
bbaf7c28 244Each element of the list is of the form
700be2bd 245
6ccc68a2 246 (LANGUAGE [CHARSET]
bbaf7c28
RS
247 (PSEUDO-ACCENT MAPPINGS)
248 (PSEUDO-ACCENT MAPPINGS)
249 ...)
700be2bd 250
bbaf7c28 251LANGUAGE is a string naming the language.
6ccc68a2
RS
252CHARSET (which may be omitted) is the symbol name
253 of the character set used in this language.
254 If CHARSET is omitted, latin-iso8859-1 is the default.
bbaf7c28
RS
255PSEUDO-ACCENT is a char specifying an accent key.
256MAPPINGS are cons cells of the form (CHAR . ISO-CHAR).
700be2bd 257
bbaf7c28
RS
258The net effect is that the key sequence PSEUDO-ACCENT CHAR is mapped
259to ISO-CHAR on input.")
700be2bd
RS
260
261(defvar iso-language nil
262 "Language for which ISO Accents mode is currently customized.
263Change it with the `iso-accents-customize' function.")
264
265(defvar iso-accents-list nil
266 "Association list for ISO accent combinations, for the chosen language.")
bf4de26a 267
d876a0a0 268(defcustom iso-accents-mode nil
884f2b81 269 "*Non-nil enables ISO Accents mode.
9c89d223 270Setting this variable makes it local to the current buffer.
d876a0a0
SE
271See the function `iso-accents-mode'."
272 :type 'boolean
273 :group 'iso-acc)
a4332c3f 274(make-variable-buffer-local 'iso-accents-mode)
bf4de26a 275
d876a0a0 276(defcustom iso-accents-enable '(?' ?` ?^ ?\" ?~ ?/)
9a71dcfd
KH
277 "*List of accent keys that become prefixes in ISO Accents mode.
278The default is (?' ?` ?^ ?\" ?~ ?/), which contains all the supported
279accent keys. If you set this variable to a list in which some of those
280characters are missing, the missing ones do not act as accents.
281
282Note that if you specify a language with `iso-accents-customize',
283that can also turn off certain prefixes (whichever ones are not needed in
d876a0a0
SE
284the language you choose)."
285 :type '(repeat character)
286 :group 'iso-acc)
9a71dcfd 287
da8d0b9e
RS
288(defun iso-accents-accent-key (prompt)
289 "Modify the following character by adding an accent to it."
290 ;; Pick up the accent character.
9a71dcfd
KH
291 (if (and iso-accents-mode
292 (memq last-input-char iso-accents-enable))
da8d0b9e
RS
293 (iso-accents-compose prompt)
294 (char-to-string last-input-char)))
9c89d223 295
da8d0b9e
RS
296(defun iso-accents-compose (prompt)
297 (let* ((first-char last-input-char)
bbaf7c28 298 (list (assq first-char iso-accents-list))
da8d0b9e
RS
299 ;; Wait for the second key and look up the combination.
300 (second-char (if (or prompt
301 (not (eq (key-binding "a")
9ebce7e1 302 'self-insert-command))
55b933cf
RS
303 ;; Not at start of a key sequence.
304 (> (length (this-single-command-keys)) 1)
9ebce7e1
RS
305 ;; Called from anything but the command loop.
306 this-command)
da8d0b9e
RS
307 (progn
308 (message "%s%c"
309 (or prompt "Compose with ")
310 first-char)
311 (read-event))
312 (insert first-char)
313 (prog1 (read-event)
314 (delete-region (1- (point)) (point)))))
bbaf7c28 315 (entry (cdr (assq second-char list))))
da8d0b9e 316 (if entry
bbaf7c28 317 ;; Found it: return the mapped char
267d5b95
RS
318 (vector
319 (if (and enable-multibyte-characters
320 (>= entry ?\200))
321 (+ iso-accents-insert-offset entry)
322 entry))
da8d0b9e 323 ;; Otherwise, advance and schedule the second key for execution.
5f748041
RS
324 (setq unread-command-events
325 (cons (list second-char) unread-command-events))
da8d0b9e
RS
326 (vector first-char))))
327
bf4de26a
RS
328;; It is a matter of taste if you want the minor mode indicated
329;; in the mode line...
9c89d223 330;; If so, uncomment the next four lines.
5f748041 331;; (or (assq 'iso-accents-mode minor-mode-alist)
bf4de26a
RS
332;; (setq minor-mode-alist
333;; (append minor-mode-alist
a4332c3f 334;; '((iso-accents-mode " ISO-Acc")))))
bf4de26a
RS
335
336;;;###autoload
8669cecf 337(defun iso-accents-mode (&optional arg)
884f2b81 338 "Toggle ISO Accents mode, in which accents modify the following letter.
8669cecf
RS
339This permits easy insertion of accented characters according to ISO-8859-1.
340When Iso-accents mode is enabled, accent character keys
7ab500f0 341\(`, ', \", ^, / and ~) do not self-insert; instead, they modify the following
8669cecf
RS
342letter key so that it inserts an ISO accented letter.
343
72c2a4c1
KH
344You can customize ISO Accents mode to a particular language
345with the command `iso-accents-customize'.
6da676ad 346
7ab500f0 347Special combinations: ~c gives a c with cedilla,
298613df
KH
348~d gives an Icelandic eth (d with dash).
349~t gives an Icelandic thorn.
ab4d6ceb
RS
350\"s gives German sharp s.
351/a gives a with ring.
352/e gives an a-e ligature.
5e92ec88 353~< and ~> give guillemots.
947447f4
RS
354~! gives an inverted exclamation mark.
355~? gives an inverted question mark.
7ab500f0 356
6da676ad 357With an argument, a positive argument enables ISO Accents mode,
8669cecf 358and a negative argument disables it."
bf4de26a
RS
359
360 (interactive "P")
361
8669cecf
RS
362 (if (if arg
363 ;; Negative arg means switch it off.
364 (<= (prefix-numeric-value arg) 0)
365 ;; No arg means toggle.
a4332c3f
RS
366 iso-accents-mode)
367 (setq iso-accents-mode nil)
bf4de26a
RS
368
369 ;; Enable electric accents.
a4332c3f 370 (setq iso-accents-mode t)))
bf4de26a 371
700be2bd
RS
372(defun iso-accents-customize (language)
373 "Customize the ISO accents machinery for a particular language.
374It selects the customization based on the specifications in the
375`iso-languages' variable."
376 (interactive (list (completing-read "Language: " iso-languages nil t)))
6ccc68a2 377 (let ((table (cdr (assoc language iso-languages)))
9a71dcfd 378 all-accents tail)
700be2bd 379 (if (not table)
6ccc68a2
RS
380 (error "Unknown language `%s'" language)
381 (setq iso-accents-insert-offset (- (make-char (if (symbolp (car table))
382 (car table)
383 'latin-iso8859-1))
384 128))
385 (if (symbolp (car table))
386 (setq table (cdr table)))
bbaf7c28 387 (setq iso-language language
6ccc68a2 388 iso-accents-list table)
700be2bd
RS
389 (if key-translation-map
390 (substitute-key-definition
391 'iso-accents-accent-key nil key-translation-map)
392 (setq key-translation-map (make-sparse-keymap)))
bbaf7c28
RS
393 ;; Set up translations for all the characters that are used as
394 ;; accent prefixes in this language.
9a71dcfd
KH
395 (setq tail iso-accents-list)
396 (while tail
bbaf7c28 397 (define-key key-translation-map (vector (car (car tail)))
9a71dcfd
KH
398 'iso-accents-accent-key)
399 (setq tail (cdr tail))))))
700be2bd
RS
400
401(defun iso-accentuate (start end)
402 "Convert two-character sequences in region into accented characters.
403Noninteractively, this operates on text from START to END.
404This uses the same conversion that ISO Accents mode uses for type-in."
405 (interactive "r")
406 (save-excursion
407 (save-restriction
408 (narrow-to-region start end)
409 (goto-char start)
410 (forward-char 1)
411 (let (entry)
412 (while (< (point) end)
413 (if (and (memq (preceding-char) iso-accents-enable)
bbaf7c28 414 (setq entry (cdr (assq (following-char) (assq (preceding-char) iso-accents-list)))))
700be2bd
RS
415 (progn
416 (forward-char -1)
417 (delete-char 2)
bbaf7c28 418 (insert entry)
700be2bd
RS
419 (setq end (1- end)))
420 (forward-char 1)))))))
421
422(defun iso-accent-rassoc-unit (value alist)
bbaf7c28
RS
423 (let (elt acc)
424 (while (and alist (not elt))
425 (setq acc (car (car alist))
426 elt (car (rassq value (cdr (car alist))))
427 alist (cdr alist)))
428 (if elt
429 (cons acc elt))))
700be2bd
RS
430
431(defun iso-unaccentuate (start end)
432 "Convert accented characters in the region into two-character sequences.
433Noninteractively, this operates on text from START to END.
434This uses the opposite of the conversion done by ISO Accents mode for type-in."
435 (interactive "r")
436 (save-excursion
437 (save-restriction
438 (narrow-to-region start end)
439 (goto-char start)
440 (let (entry)
441 (while (< (point) end)
442 (if (and (> (following-char) 127)
443 (setq entry (iso-accent-rassoc-unit (following-char)
444 iso-accents-list)))
445 (progn
446 (delete-char 1)
bbaf7c28 447 (insert (car entry) (cdr entry))
700be2bd
RS
448 (setq end (1+ end)))
449 (forward-char 1)))))))
450
451(defun iso-deaccentuate (start end)
452 "Convert accented characters in the region into unaccented characters.
453Noninteractively, this operates on text from START to END."
454 (interactive "r")
455 (save-excursion
456 (save-restriction
457 (narrow-to-region start end)
458 (goto-char start)
459 (let (entry)
460 (while (< (point) end)
461 (if (and (> (following-char) 127)
462 (setq entry (iso-accent-rassoc-unit (following-char)
463 iso-accents-list)))
464 (progn
465 (delete-char 1)
bbaf7c28 466 (insert (cdr entry)))
700be2bd
RS
467 (forward-char 1)))))))
468
9a71dcfd 469;; Set up the default settings.
2023b1c2 470(iso-accents-customize "latin-1")
700be2bd 471
213543f0
RS
472;; Use Iso-Accents mode in the minibuffer
473;; if it was in use in the previous buffer.
474(defun iso-acc-minibuf-setup ()
475 (setq iso-accents-mode
476 (save-excursion
477 (set-buffer (window-buffer minibuffer-scroll-window))
478 iso-accents-mode)))
479
6b19c229 480(add-hook 'minibuffer-setup-hook 'iso-acc-minibuf-setup)
213543f0 481
bf4de26a 482;;; iso-acc.el ends here