Commit | Line | Data |
---|---|---|
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 | 242 | Each 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 | 249 | LANGUAGE is a string naming the language. |
6ccc68a2 RS |
250 | CHARSET (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 |
253 | PSEUDO-ACCENT is a char specifying an accent key. |
254 | MAPPINGS are cons cells of the form (CHAR . ISO-CHAR). | |
700be2bd | 255 | |
bbaf7c28 RS |
256 | The net effect is that the key sequence PSEUDO-ACCENT CHAR is mapped |
257 | to ISO-CHAR on input.") | |
700be2bd RS |
258 | |
259 | (defvar iso-language nil | |
260 | "Language for which ISO Accents mode is currently customized. | |
261 | Change 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 | 268 | Setting this variable makes it local to the current buffer. |
d876a0a0 SE |
269 | See 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. |
276 | The default is (?' ?` ?^ ?\" ?~ ?/), which contains all the supported | |
277 | accent keys. If you set this variable to a list in which some of those | |
278 | characters are missing, the missing ones do not act as accents. | |
279 | ||
280 | Note that if you specify a language with `iso-accents-customize', | |
281 | that can also turn off certain prefixes (whichever ones are not needed in | |
d876a0a0 SE |
282 | the 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 |
348 | This permits easy insertion of accented characters according to ISO-8859-1. |
349 | When Iso-accents mode is enabled, accent character keys | |
7ab500f0 | 350 | \(`, ', \", ^, / and ~) do not self-insert; instead, they modify the following |
8669cecf RS |
351 | letter key so that it inserts an ISO accented letter. |
352 | ||
72c2a4c1 KH |
353 | You can customize ISO Accents mode to a particular language |
354 | with the command `iso-accents-customize'. | |
6da676ad | 355 | |
7ab500f0 | 356 | Special 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 | 366 | With an argument, a positive argument enables ISO Accents mode, |
8669cecf | 367 | and 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. | |
383 | It 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. | |
412 | Noninteractively, this operates on text from START to END. | |
413 | This 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. | |
442 | Noninteractively, this operates on text from START to END. | |
443 | This 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. | |
462 | Noninteractively, 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 |