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