Add arch taglines
[bpt/emacs.git] / lisp / international / iso-acc.el
CommitLineData
b035a678 1;;; iso-acc.el --- minor mode providing electric accent keys
b578f267 2
f6f4bfb3 3;; Copyright (C) 1993, 1994, 1996, 2001 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 35;;
cf3be7f8
RS
36;; ' (minute) -> actue accent
37;; ` (backtick) -> grave accent
bf4de26a 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.
a1506d29 49;; In general:
bf4de26a
RS
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;;
a1506d29 56;; If the pseudo-accent is followed by anything else than a
bf4de26a
RS
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 (?\ . ?^))
a1506d29 113 (?\" (?E . ?\313) (?I . ?\317)
ac2828d8
RS
114 (?e . ?\353) (?i . ?\357)
115 (?\ . ?\"))
116 (?~ (?< . ?\253) (?> . ?\273) (?C . ?\307) (?c . ?\347)
cf3be7f8 117 (?\ . ?~))
3efadcb8 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 157 (?u . ?\372) (?y . ?\375) (?' . ?\264)
a1506d29 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)
a1506d29 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 213 (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363) (?u . ?\372)
a1506d29 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) (?\ . ?~))
a1506d29 232 (?/ (?C . ?\305) (?G . ?\325) (?H . ?\241) (?I . ?\251) (?Z . ?\257)
ac2828d8
RS
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 290 (iso-accents-compose prompt)
f33c1f4c 291 (vector 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.
8d7b140f 321 (push second-char unread-command-events)
da8d0b9e
RS
322 (vector first-char))))
323
bf4de26a
RS
324;; It is a matter of taste if you want the minor mode indicated
325;; in the mode line...
9c89d223 326;; If so, uncomment the next four lines.
5f748041 327;; (or (assq 'iso-accents-mode minor-mode-alist)
bf4de26a
RS
328;; (setq minor-mode-alist
329;; (append minor-mode-alist
a4332c3f 330;; '((iso-accents-mode " ISO-Acc")))))
bf4de26a
RS
331
332;;;###autoload
8669cecf 333(defun iso-accents-mode (&optional arg)
884f2b81 334 "Toggle ISO Accents mode, in which accents modify the following letter.
8669cecf
RS
335This permits easy insertion of accented characters according to ISO-8859-1.
336When Iso-accents mode is enabled, accent character keys
7ab500f0 337\(`, ', \", ^, / and ~) do not self-insert; instead, they modify the following
8669cecf
RS
338letter key so that it inserts an ISO accented letter.
339
72c2a4c1
KH
340You can customize ISO Accents mode to a particular language
341with the command `iso-accents-customize'.
6da676ad 342
7ab500f0 343Special combinations: ~c gives a c with cedilla,
298613df
KH
344~d gives an Icelandic eth (d with dash).
345~t gives an Icelandic thorn.
ab4d6ceb
RS
346\"s gives German sharp s.
347/a gives a with ring.
348/e gives an a-e ligature.
5e92ec88 349~< and ~> give guillemots.
947447f4
RS
350~! gives an inverted exclamation mark.
351~? gives an inverted question mark.
7ab500f0 352
a1506d29 353With an argument, a positive argument enables ISO Accents mode,
8669cecf 354and a negative argument disables it."
bf4de26a
RS
355
356 (interactive "P")
357
8669cecf
RS
358 (if (if arg
359 ;; Negative arg means switch it off.
360 (<= (prefix-numeric-value arg) 0)
361 ;; No arg means toggle.
a4332c3f
RS
362 iso-accents-mode)
363 (setq iso-accents-mode nil)
bf4de26a
RS
364
365 ;; Enable electric accents.
a4332c3f 366 (setq iso-accents-mode t)))
bf4de26a 367
700be2bd
RS
368(defun iso-accents-customize (language)
369 "Customize the ISO accents machinery for a particular language.
370It selects the customization based on the specifications in the
371`iso-languages' variable."
372 (interactive (list (completing-read "Language: " iso-languages nil t)))
6ccc68a2 373 (let ((table (cdr (assoc language iso-languages)))
9a71dcfd 374 all-accents tail)
700be2bd 375 (if (not table)
6ccc68a2
RS
376 (error "Unknown language `%s'" language)
377 (setq iso-accents-insert-offset (- (make-char (if (symbolp (car table))
378 (car table)
379 'latin-iso8859-1))
380 128))
381 (if (symbolp (car table))
382 (setq table (cdr table)))
bbaf7c28 383 (setq iso-language language
6ccc68a2 384 iso-accents-list table)
700be2bd
RS
385 (if key-translation-map
386 (substitute-key-definition
387 'iso-accents-accent-key nil key-translation-map)
388 (setq key-translation-map (make-sparse-keymap)))
bbaf7c28
RS
389 ;; Set up translations for all the characters that are used as
390 ;; accent prefixes in this language.
9a71dcfd
KH
391 (setq tail iso-accents-list)
392 (while tail
bbaf7c28 393 (define-key key-translation-map (vector (car (car tail)))
9a71dcfd
KH
394 'iso-accents-accent-key)
395 (setq tail (cdr tail))))))
700be2bd
RS
396
397(defun iso-accentuate (start end)
398 "Convert two-character sequences in region into accented characters.
399Noninteractively, this operates on text from START to END.
400This uses the same conversion that ISO Accents mode uses for type-in."
401 (interactive "r")
402 (save-excursion
403 (save-restriction
404 (narrow-to-region start end)
405 (goto-char start)
406 (forward-char 1)
407 (let (entry)
408 (while (< (point) end)
409 (if (and (memq (preceding-char) iso-accents-enable)
bbaf7c28 410 (setq entry (cdr (assq (following-char) (assq (preceding-char) iso-accents-list)))))
700be2bd
RS
411 (progn
412 (forward-char -1)
413 (delete-char 2)
bbaf7c28 414 (insert entry)
700be2bd
RS
415 (setq end (1- end)))
416 (forward-char 1)))))))
417
418(defun iso-accent-rassoc-unit (value alist)
bbaf7c28
RS
419 (let (elt acc)
420 (while (and alist (not elt))
421 (setq acc (car (car alist))
422 elt (car (rassq value (cdr (car alist))))
423 alist (cdr alist)))
424 (if elt
425 (cons acc elt))))
700be2bd
RS
426
427(defun iso-unaccentuate (start end)
428 "Convert accented characters in the region into two-character sequences.
429Noninteractively, this operates on text from START to END.
430This uses the opposite of the conversion done by ISO Accents mode for type-in."
431 (interactive "r")
432 (save-excursion
433 (save-restriction
434 (narrow-to-region start end)
435 (goto-char start)
436 (let (entry)
437 (while (< (point) end)
438 (if (and (> (following-char) 127)
439 (setq entry (iso-accent-rassoc-unit (following-char)
440 iso-accents-list)))
441 (progn
442 (delete-char 1)
bbaf7c28 443 (insert (car entry) (cdr entry))
700be2bd
RS
444 (setq end (1+ end)))
445 (forward-char 1)))))))
446
447(defun iso-deaccentuate (start end)
448 "Convert accented characters in the region into unaccented characters.
449Noninteractively, this operates on text from START to END."
450 (interactive "r")
451 (save-excursion
452 (save-restriction
453 (narrow-to-region start end)
454 (goto-char start)
455 (let (entry)
456 (while (< (point) end)
457 (if (and (> (following-char) 127)
458 (setq entry (iso-accent-rassoc-unit (following-char)
459 iso-accents-list)))
460 (progn
461 (delete-char 1)
bbaf7c28 462 (insert (cdr entry)))
700be2bd
RS
463 (forward-char 1)))))))
464
9a71dcfd 465;; Set up the default settings.
2023b1c2 466(iso-accents-customize "latin-1")
700be2bd 467
213543f0
RS
468;; Use Iso-Accents mode in the minibuffer
469;; if it was in use in the previous buffer.
470(defun iso-acc-minibuf-setup ()
471 (setq iso-accents-mode
472 (save-excursion
473 (set-buffer (window-buffer minibuffer-scroll-window))
474 iso-accents-mode)))
475
6b19c229 476(add-hook 'minibuffer-setup-hook 'iso-acc-minibuf-setup)
213543f0 477
ab5796a9 478;;; arch-tag: 149ff409-7c3e-4574-9b5d-ac038939c0a6
bf4de26a 479;;; iso-acc.el ends here