HideIfDef mode bug fixes and enhancements. This is #2 of 3 patches based
[bpt/emacs.git] / lisp / obsolete / iso-acc.el
CommitLineData
b035a678 1;;; iso-acc.el --- minor mode providing electric accent keys
b578f267 2
ba318903 3;; Copyright (C) 1993-1994, 1996, 2001-2014 Free Software Foundation,
ab422c4d 4;; Inc.
bf4de26a 5
9e5a48ce 6;; Author: Johan Vromans
34dc21db 7;; Maintainer: emacs-devel@gnu.org
7ab500f0 8;; Keywords: i18n
bed7f140 9;; Obsolete-since: 22.1
bf4de26a
RS
10
11;; This file is part of GNU Emacs.
12
4936186e 13;; GNU Emacs is free software: you can redistribute it and/or modify
bf4de26a 14;; it under the terms of the GNU General Public License as published by
4936186e
GM
15;; the Free Software Foundation, either version 3 of the License, or
16;; (at your option) any later version.
bf4de26a
RS
17
18;; GNU Emacs is distributed in the hope that it will be useful,
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
22
23;; You should have received a copy of the GNU General Public License
4936186e 24;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
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;;
91af3942 36;; ' (minute) -> acute accent
cf3be7f8 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
fb7ada5f 77 "Offset added by ISO Accents mode to character codes 0200 and above."
d876a0a0
SE
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
fb7ada5f 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 '(?' ?` ?^ ?\" ?~ ?/)
fb7ada5f 274 "List of accent keys that become prefixes in ISO Accents mode.
9a71dcfd
KH
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 288 (if (and iso-accents-mode
1e4bd40d 289 (memq last-input-event iso-accents-enable))
da8d0b9e 290 (iso-accents-compose prompt)
1e4bd40d 291 (vector last-input-event)))
9c89d223 292
1a94a565
KS
293
294;; The iso-accents-compose function is called deep inside Emacs' read
295;; key sequence machinery, so the call to read-event below actually
296;; recurses into that machinery. Doing that does not cause any
297;; problem on its own, but read-event will have marked the window's
298;; display matrix to be accurate -- which is broken by the subsequent
299;; call to delete-region. Therefore, we must call force-window-update
300;; after delete-region to explicitly clear the accurate state of the
301;; window's display matrix.
302
da8d0b9e 303(defun iso-accents-compose (prompt)
1e4bd40d 304 (let* ((first-char last-input-event)
bbaf7c28 305 (list (assq first-char iso-accents-list))
da8d0b9e
RS
306 ;; Wait for the second key and look up the combination.
307 (second-char (if (or prompt
308 (not (eq (key-binding "a")
9ebce7e1 309 'self-insert-command))
55b933cf
RS
310 ;; Not at start of a key sequence.
311 (> (length (this-single-command-keys)) 1)
9ebce7e1
RS
312 ;; Called from anything but the command loop.
313 this-command)
da8d0b9e
RS
314 (progn
315 (message "%s%c"
316 (or prompt "Compose with ")
317 first-char)
318 (read-event))
319 (insert first-char)
320 (prog1 (read-event)
1a94a565
KS
321 (delete-region (1- (point)) (point))
322 ;; Display is no longer up-to-date.
323 (force-window-update (selected-window)))))
bbaf7c28 324 (entry (cdr (assq second-char list))))
da8d0b9e 325 (if entry
bbaf7c28 326 ;; Found it: return the mapped char
267d5b95
RS
327 (vector
328 (if (and enable-multibyte-characters
329 (>= entry ?\200))
330 (+ iso-accents-insert-offset entry)
331 entry))
da8d0b9e 332 ;; Otherwise, advance and schedule the second key for execution.
8d7b140f 333 (push second-char unread-command-events)
da8d0b9e
RS
334 (vector first-char))))
335
bf4de26a
RS
336;; It is a matter of taste if you want the minor mode indicated
337;; in the mode line...
9c89d223 338;; If so, uncomment the next four lines.
5f748041 339;; (or (assq 'iso-accents-mode minor-mode-alist)
bf4de26a
RS
340;; (setq minor-mode-alist
341;; (append minor-mode-alist
a4332c3f 342;; '((iso-accents-mode " ISO-Acc")))))
bf4de26a
RS
343
344;;;###autoload
8669cecf 345(defun iso-accents-mode (&optional arg)
884f2b81 346 "Toggle ISO Accents mode, in which accents modify the following letter.
8669cecf
RS
347This permits easy insertion of accented characters according to ISO-8859-1.
348When Iso-accents mode is enabled, accent character keys
7ab500f0 349\(`, ', \", ^, / and ~) do not self-insert; instead, they modify the following
8669cecf
RS
350letter key so that it inserts an ISO accented letter.
351
72c2a4c1
KH
352You can customize ISO Accents mode to a particular language
353with the command `iso-accents-customize'.
6da676ad 354
7ab500f0 355Special combinations: ~c gives a c with cedilla,
298613df
KH
356~d gives an Icelandic eth (d with dash).
357~t gives an Icelandic thorn.
ab4d6ceb
RS
358\"s gives German sharp s.
359/a gives a with ring.
360/e gives an a-e ligature.
5e92ec88 361~< and ~> give guillemots.
947447f4
RS
362~! gives an inverted exclamation mark.
363~? gives an inverted question mark.
7ab500f0 364
a1506d29 365With an argument, a positive argument enables ISO Accents mode,
8669cecf 366and a negative argument disables it."
bf4de26a
RS
367
368 (interactive "P")
369
8669cecf
RS
370 (if (if arg
371 ;; Negative arg means switch it off.
372 (<= (prefix-numeric-value arg) 0)
373 ;; No arg means toggle.
a4332c3f
RS
374 iso-accents-mode)
375 (setq iso-accents-mode nil)
bf4de26a
RS
376
377 ;; Enable electric accents.
a4332c3f 378 (setq iso-accents-mode t)))
bf4de26a 379
700be2bd
RS
380(defun iso-accents-customize (language)
381 "Customize the ISO accents machinery for a particular language.
382It selects the customization based on the specifications in the
383`iso-languages' variable."
384 (interactive (list (completing-read "Language: " iso-languages nil t)))
6ccc68a2 385 (let ((table (cdr (assoc language iso-languages)))
9a71dcfd 386 all-accents tail)
700be2bd 387 (if (not table)
6ccc68a2
RS
388 (error "Unknown language `%s'" language)
389 (setq iso-accents-insert-offset (- (make-char (if (symbolp (car table))
390 (car table)
391 'latin-iso8859-1))
392 128))
393 (if (symbolp (car table))
394 (setq table (cdr table)))
bbaf7c28 395 (setq iso-language language
6ccc68a2 396 iso-accents-list table)
700be2bd
RS
397 (if key-translation-map
398 (substitute-key-definition
399 'iso-accents-accent-key nil key-translation-map)
400 (setq key-translation-map (make-sparse-keymap)))
bbaf7c28
RS
401 ;; Set up translations for all the characters that are used as
402 ;; accent prefixes in this language.
9a71dcfd
KH
403 (setq tail iso-accents-list)
404 (while tail
bbaf7c28 405 (define-key key-translation-map (vector (car (car tail)))
9a71dcfd
KH
406 'iso-accents-accent-key)
407 (setq tail (cdr tail))))))
700be2bd
RS
408
409(defun iso-accentuate (start end)
410 "Convert two-character sequences in region into accented characters.
411Noninteractively, this operates on text from START to END.
412This uses the same conversion that ISO Accents mode uses for type-in."
413 (interactive "r")
414 (save-excursion
415 (save-restriction
416 (narrow-to-region start end)
417 (goto-char start)
418 (forward-char 1)
419 (let (entry)
420 (while (< (point) end)
421 (if (and (memq (preceding-char) iso-accents-enable)
bbaf7c28 422 (setq entry (cdr (assq (following-char) (assq (preceding-char) iso-accents-list)))))
700be2bd
RS
423 (progn
424 (forward-char -1)
425 (delete-char 2)
bbaf7c28 426 (insert entry)
700be2bd
RS
427 (setq end (1- end)))
428 (forward-char 1)))))))
429
430(defun iso-accent-rassoc-unit (value alist)
bbaf7c28
RS
431 (let (elt acc)
432 (while (and alist (not elt))
433 (setq acc (car (car alist))
434 elt (car (rassq value (cdr (car alist))))
435 alist (cdr alist)))
436 (if elt
437 (cons acc elt))))
700be2bd
RS
438
439(defun iso-unaccentuate (start end)
440 "Convert accented characters in the region into two-character sequences.
441Noninteractively, this operates on text from START to END.
442This uses the opposite of the conversion done by ISO Accents mode for type-in."
443 (interactive "r")
444 (save-excursion
445 (save-restriction
446 (narrow-to-region start end)
447 (goto-char start)
448 (let (entry)
449 (while (< (point) end)
450 (if (and (> (following-char) 127)
451 (setq entry (iso-accent-rassoc-unit (following-char)
452 iso-accents-list)))
453 (progn
454 (delete-char 1)
bbaf7c28 455 (insert (car entry) (cdr entry))
700be2bd
RS
456 (setq end (1+ end)))
457 (forward-char 1)))))))
458
459(defun iso-deaccentuate (start end)
460 "Convert accented characters in the region into unaccented characters.
461Noninteractively, this operates on text from START to END."
462 (interactive "r")
463 (save-excursion
464 (save-restriction
465 (narrow-to-region start end)
466 (goto-char start)
467 (let (entry)
468 (while (< (point) end)
469 (if (and (> (following-char) 127)
470 (setq entry (iso-accent-rassoc-unit (following-char)
471 iso-accents-list)))
472 (progn
473 (delete-char 1)
bbaf7c28 474 (insert (cdr entry)))
700be2bd
RS
475 (forward-char 1)))))))
476
9a71dcfd 477;; Set up the default settings.
2023b1c2 478(iso-accents-customize "latin-1")
700be2bd 479
213543f0
RS
480;; Use Iso-Accents mode in the minibuffer
481;; if it was in use in the previous buffer.
482(defun iso-acc-minibuf-setup ()
483 (setq iso-accents-mode
9a529312 484 (with-current-buffer (window-buffer minibuffer-scroll-window)
213543f0
RS
485 iso-accents-mode)))
486
6b19c229 487(add-hook 'minibuffer-setup-hook 'iso-acc-minibuf-setup)
213543f0 488
bf4de26a 489;;; iso-acc.el ends here