]> code.delx.au - gnu-emacs/blob - lisp/international/iso-transl.el
(translation-table-for-input): New
[gnu-emacs] / lisp / international / iso-transl.el
1 ;;; iso-transl.el --- keyboard input definitions for ISO 8859-1 -*- coding: iso-8859-1 -*-
2
3 ;; Copyright (C) 1987, 1993, 1994, 1995, 2001 Free Software Foundation, Inc.
4
5 ;; Author: Howard Gayle
6 ;; Maintainer: FSF
7 ;; Keywords: i18n
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
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.
25
26 ;;; Commentary:
27
28 ;; Loading this package defines three ways of entering the non-ASCII
29 ;; printable characters with codes above 127: the prefix C-x 8, or the
30 ;; Alt key, or a dead accent key. For example, you can enter uppercase
31 ;; A-umlaut as `C-x 8 " A' or `Alt-" A' (if you have an Alt key) or
32 ;; `umlaut A' (if you have an umlaut/diaeresis key).
33
34 ;; C-x 8 is set up to autoload this package,
35 ;; but Alt keys and dead accent keys are only defined
36 ;; once you have loaded the package. It is nontrivial
37 ;; to make all of the Alt keys autoload, and it is not clear
38 ;; that the dead accent keys SHOULD autoload this package.
39
40 ;;; Code:
41
42 ;;; Provide some binding for startup:
43 ;;;###autoload (or key-translation-map (setq key-translation-map (make-sparse-keymap)))
44 ;;;###autoload (define-key key-translation-map "\C-x8" 'iso-transl-ctl-x-8-map)
45 ;;;###autoload (autoload 'iso-transl-ctl-x-8-map "iso-transl" "Keymap for C-x 8 prefix." t 'keymap)
46
47 (defvar iso-transl-dead-key-alist
48 '((?\' . mute-acute)
49 (?\` . mute-grave)
50 (?\" . mute-diaeresis)
51 (?^ . mute-asciicircum)
52 (?\~ . mute-asciitilde)
53 (?\' . dead-acute)
54 (?\` . dead-grave)
55 (?\" . dead-diaeresis)
56 (?^ . dead-asciicircum)
57 (?\~ . dead-asciitilde)
58 (?^ . dead-circum)
59 (?^ . dead-circumflex)
60 (?\~ . dead-tilde)
61 ;; Someone reports that these keys don't work if shifted.
62 ;; This might fix it--no word yet.
63 (?\' . S-dead-acute)
64 (?\` . S-dead-grave)
65 (?\" . S-dead-diaeresis)
66 (?^ . S-dead-asciicircum)
67 (?\~ . S-dead-asciitilde)
68 (?^ . S-dead-circum)
69 (?^ . S-dead-circumflex)
70 (?\~ . S-dead-tilde))
71 "Mapping of ASCII characters to their corresponding dead-key symbols.")
72
73 ;; The two-character mnemonics are intended to be available in all languages.
74 ;; The ones beginning with `*' have one-character synonyms, but a
75 ;; language-specific table might override the short form for its own use.
76
77 ;; When a translation is non-ASCII, we use a symbol name
78 ;; whose "function definition" is a translation, rather than
79 ;; writing the translation directly here.
80 ;; That is for the sake of C-x 8 C-h.
81 (defvar iso-transl-char-map
82 '(("* " . iso-transl-no-break-space)
83 (" " . iso-transl-no-break-space)
84 ("*!" . iso-transl-inverted-exclamation-mark)
85 ("!" . iso-transl-inverted-exclamation-mark)
86 ("\"\"" . iso-transl-diaeresis)
87 ("\"A" . iso-transl-A-umlaut)
88 ("\"E" . iso-transl-E-umlaut)
89 ("\"I" . iso-transl-I-umlaut)
90 ("\"O" . iso-transl-O-umlaut)
91 ("\"U" . iso-transl-U-umlaut)
92 ("\"a" . iso-transl-a-umlaut)
93 ("\"e" . iso-transl-e-umlaut)
94 ("\"i" . iso-transl-i-umlaut)
95 ("\"o" . iso-transl-o-umlaut)
96 ("\"s" . iso-transl-ss)
97 ("\"u" . iso-transl-u-umlaut)
98 ("\"y" . iso-transl-y-umlaut)
99 ("''" . iso-transl-acute-accent)
100 ("'A" . iso-transl-A-acute)
101 ("'E" . iso-transl-E-acute)
102 ("'I" . iso-transl-I-acute)
103 ("'O" . iso-transl-O-acute)
104 ("'U" . iso-transl-U-acute)
105 ("'Y" . iso-transl-Y-acute)
106 ("'a" . iso-transl-a-acute)
107 ("'e" . iso-transl-e-acute)
108 ("'i" . iso-transl-i-acute)
109 ("'o" . iso-transl-o-acute)
110 ("'u" . iso-transl-u-acute)
111 ("'y" . iso-transl-y-acute)
112 ("*$" . iso-transl-general-currency-sign)
113 ("$" . iso-transl-general-currency-sign)
114 ("*+" . iso-transl-plus-or-minus-sign)
115 ("+" . iso-transl-plus-or-minus-sign)
116 (",," . iso-transl-cedilla)
117 (",C" . iso-transl-C-cedilla)
118 (",c" . iso-transl-c-cedilla)
119 ("*-" . iso-transl-soft-hyphen)
120 ("-" . iso-transl-soft-hyphen)
121 ("*." . iso-transl-middle-dot)
122 ("." . iso-transl-middle-dot)
123 ("//" . iso-transl-division-sign)
124 ("/A" . iso-transl-A-ring)
125 ("/E" . iso-transl-AE)
126 ("/O" . iso-transl-O-slash)
127 ("/a" . iso-transl-a-ring)
128 ("/e" . iso-transl-ae)
129 ("/o" . iso-transl-o-slash)
130 ("1/2" . iso-transl-one-half)
131 ("1/4" . iso-transl-one-quarter)
132 ("3/4" . iso-transl-three-quarters)
133 ("*<" . iso-transl-angle-left)
134 ("<" . iso-transl-angle-left)
135 ("*=" . iso-transl-macron)
136 ("=" . iso-transl-macron)
137 ("*>" . iso-transl-angle-right)
138 (">" . iso-transl-angle-right)
139 ("*?" . iso-transl-inverted-question-mark)
140 ("?" . iso-transl-inverted-question-mark)
141 ("*C" . iso-transl-copyright-sign)
142 ("C" . iso-transl-copyright-sign)
143 ("*L" . iso-transl-pound-sign)
144 ("L" . iso-transl-pound-sign)
145 ("*P" . iso-transl-pilcrow)
146 ("P" . iso-transl-pilcrow)
147 ("*R" . iso-transl-registered-sign)
148 ("R" . iso-transl-registered-sign)
149 ("*S" . iso-transl-section-sign)
150 ("S" . iso-transl-section-sign)
151 ("*Y" . iso-transl-yen-sign)
152 ("Y" . iso-transl-yen-sign)
153 ("^1" . iso-transl-superscript-1)
154 ("^2" . iso-transl-superscript-2)
155 ("^3" . iso-transl-superscript-3)
156 ("^A" . iso-transl-A-caret)
157 ("^E" . iso-transl-E-caret)
158 ("^I" . iso-transl-I-caret)
159 ("^O" . iso-transl-O-caret)
160 ("^U" . iso-transl-U-caret)
161 ("^a" . iso-transl-a-caret)
162 ("^e" . iso-transl-e-caret)
163 ("^i" . iso-transl-i-caret)
164 ("^o" . iso-transl-o-caret)
165 ("^u" . iso-transl-u-caret)
166 ("_a" . iso-transl-ordinal-indicator-feminine)
167 ("_o" . iso-transl-ordinal-indicator-masculine)
168 ("`A" . iso-transl-A-grave)
169 ("`E" . iso-transl-E-grave)
170 ("`I" . iso-transl-I-grave)
171 ("`O" . iso-transl-O-grave)
172 ("`U" . iso-transl-U-grave)
173 ("`a" . iso-transl-a-grave)
174 ("`e" . iso-transl-e-grave)
175 ("`i" . iso-transl-i-grave)
176 ("`o" . iso-transl-o-grave)
177 ("`u" . iso-transl-u-grave)
178 ("*c" . iso-transl-cent-sign)
179 ("c" . iso-transl-cent-sign)
180 ("*o" . iso-transl-degree-sign)
181 ("o" . iso-transl-degree-sign)
182 ("*u" . iso-transl-micro-sign)
183 ("u" . iso-transl-micro-sign)
184 ("*m" . iso-transl-micro-sign)
185 ("m" . iso-transl-micro-sign)
186 ("*x" . iso-transl-multiplication-sign)
187 ("x" . iso-transl-multiplication-sign)
188 ("*|" . iso-transl-broken-vertical-line)
189 ("|" . iso-transl-broken-vertical-line)
190 ("~A" . iso-transl-A-tilde)
191 ("~D" . iso-transl-D-stroke)
192 ("~N" . iso-transl-N-tilde)
193 ("~O" . iso-transl-O-tilde)
194 ("~T" . iso-transl-THORN)
195 ("~a" . iso-transl-a-tilde)
196 ("~d" . iso-transl-d-stroke)
197 ("~n" . iso-transl-n-tilde)
198 ("~o" . iso-transl-o-tilde)
199 ("~t" . iso-transl-thorn)
200 ("~~" . iso-transl-not-sign)
201 ("' " . "'")
202 ("` " . "`")
203 ("\" " . "\"")
204 ("^ " . "^")
205 ("~ " . "~"))
206 "Alist of character translations for entering ISO characters.
207 Each element has the form (STRING . VECTOR).
208 The sequence STRING of ASCII chars translates into the
209 sequence VECTOR. (VECTOR is normally one character long.)")
210
211 (defalias 'iso-transl-no-break-space [? ])
212 (defalias 'iso-transl-inverted-exclamation-mark [?¡])
213 (defalias 'iso-transl-cent-sign [?¢])
214 (defalias 'iso-transl-pound-sign [?£])
215 (defalias 'iso-transl-general-currency-sign [?¤])
216 (defalias 'iso-transl-yen-sign [?¥])
217 (defalias 'iso-transl-broken-vertical-line [?¦])
218 (defalias 'iso-transl-section-sign [?§])
219 (defalias 'iso-transl-diaeresis [?¨])
220 (defalias 'iso-transl-copyright-sign [?©])
221 (defalias 'iso-transl-ordinal-indicator-feminine [?ª])
222 (defalias 'iso-transl-angle-left [?«])
223 (defalias 'iso-transl-not-sign [?¬])
224 (defalias 'iso-transl-soft-hyphen [?­])
225 (defalias 'iso-transl-registered-sign [?®])
226 (defalias 'iso-transl-macron [?¯])
227 (defalias 'iso-transl-degree-sign [?°])
228 (defalias 'iso-transl-plus-or-minus-sign [?±])
229 (defalias 'iso-transl-superscript-2 [?²])
230 (defalias 'iso-transl-superscript-3 [?³])
231 (defalias 'iso-transl-acute-accent [?´])
232 (defalias 'iso-transl-micro-sign [?µ])
233 (defalias 'iso-transl-pilcrow [?¶])
234 (defalias 'iso-transl-middle-dot [?·])
235 (defalias 'iso-transl-cedilla [?¸])
236 (defalias 'iso-transl-superscript-1 [?¹])
237 (defalias 'iso-transl-ordinal-indicator-masculine [?º])
238 (defalias 'iso-transl-angle-right [?»])
239 (defalias 'iso-transl-one-quarter [?¼])
240 (defalias 'iso-transl-one-half [?½])
241 (defalias 'iso-transl-three-quarters [?¾])
242 (defalias 'iso-transl-inverted-question-mark [?¿])
243 (defalias 'iso-transl-A-grave [?À])
244 (defalias 'iso-transl-A-acute [?Á])
245 (defalias 'iso-transl-A-caret [?Â])
246 (defalias 'iso-transl-A-tilde [?Ã])
247 (defalias 'iso-transl-A-umlaut [?Ä])
248 (defalias 'iso-transl-A-ring [?Å])
249 (defalias 'iso-transl-AE [?Æ])
250 (defalias 'iso-transl-C-cedilla [?Ç])
251 (defalias 'iso-transl-E-grave [?È])
252 (defalias 'iso-transl-E-acute [?É])
253 (defalias 'iso-transl-E-caret [?Ê])
254 (defalias 'iso-transl-E-umlaut [?Ë])
255 (defalias 'iso-transl-I-grave [?Ì])
256 (defalias 'iso-transl-I-acute [?Í])
257 (defalias 'iso-transl-I-caret [?Î])
258 (defalias 'iso-transl-I-umlaut [?Ï])
259 (defalias 'iso-transl-D-stroke [?Ð])
260 (defalias 'iso-transl-N-tilde [?Ñ])
261 (defalias 'iso-transl-O-grave [?Ò])
262 (defalias 'iso-transl-O-acute [?Ó])
263 (defalias 'iso-transl-O-caret [?Ô])
264 (defalias 'iso-transl-O-tilde [?Õ])
265 (defalias 'iso-transl-O-umlaut [?Ö])
266 (defalias 'iso-transl-multiplication-sign [?×])
267 (defalias 'iso-transl-O-slash [?Ø])
268 (defalias 'iso-transl-U-grave [?Ù])
269 (defalias 'iso-transl-U-acute [?Ú])
270 (defalias 'iso-transl-U-caret [?Û])
271 (defalias 'iso-transl-U-umlaut [?Ü])
272 (defalias 'iso-transl-Y-acute [?Ý])
273 (defalias 'iso-transl-THORN [?Þ])
274 (defalias 'iso-transl-ss [?ß])
275 (defalias 'iso-transl-a-grave [?à])
276 (defalias 'iso-transl-a-acute [?á])
277 (defalias 'iso-transl-a-caret [?â])
278 (defalias 'iso-transl-a-tilde [?ã])
279 (defalias 'iso-transl-a-umlaut [?ä])
280 (defalias 'iso-transl-a-ring [?å])
281 (defalias 'iso-transl-ae [?æ])
282 (defalias 'iso-transl-c-cedilla [?ç])
283 (defalias 'iso-transl-e-grave [?è])
284 (defalias 'iso-transl-e-acute [?é])
285 (defalias 'iso-transl-e-caret [?ê])
286 (defalias 'iso-transl-e-umlaut [?ë])
287 (defalias 'iso-transl-i-grave [?ì])
288 (defalias 'iso-transl-i-acute [?í])
289 (defalias 'iso-transl-i-caret [?î])
290 (defalias 'iso-transl-i-umlaut [?ï])
291 (defalias 'iso-transl-d-stroke [?ð])
292 (defalias 'iso-transl-n-tilde [?ñ])
293 (defalias 'iso-transl-o-grave [?ò])
294 (defalias 'iso-transl-o-acute [?ó])
295 (defalias 'iso-transl-o-caret [?ô])
296 (defalias 'iso-transl-o-tilde [?õ])
297 (defalias 'iso-transl-o-umlaut [?ö])
298 (defalias 'iso-transl-division-sign [?÷])
299 (defalias 'iso-transl-o-slash [?ø])
300 (defalias 'iso-transl-u-grave [?ù])
301 (defalias 'iso-transl-u-acute [?ú])
302 (defalias 'iso-transl-u-caret [?û])
303 (defalias 'iso-transl-u-umlaut [?ü])
304 (defalias 'iso-transl-y-acute [?ý])
305 (defalias 'iso-transl-thorn [?þ])
306 (defalias 'iso-transl-y-umlaut [?ÿ])
307
308 ;; Language-specific translation lists.
309 (defvar iso-transl-language-alist
310 '(("Esperanto"
311 ("C" . [?Æ])
312 ("G" . [?Ø])
313 ("H" . [?¦])
314 ("J" . [?¬])
315 ("S" . [?Þ])
316 ("U" . [?Ý])
317 ("c" . [?æ])
318 ("g" . [?ø])
319 ("h" . [?¶])
320 ("j" . [?¼])
321 ("s" . [?þ])
322 ("u" . [?ý]))
323 ("French"
324 ("C" . [?Ç])
325 ("c" . [?ç]))
326 ("German"
327 ("A" . [?Ä])
328 ("O" . [?Ö])
329 ("U" . [?Ü])
330 ("a" . [?ä])
331 ("o" . [?ö])
332 ("s" . [?ß])
333 ("u" . [?ü]))
334 ("Portuguese"
335 ("C" . [?Ç])
336 ("c" . [?ç]))
337 ("Spanish"
338 ("!" . [?¡])
339 ("?" . [?¿])
340 ("N" . [?Ñ])
341 ("n" . [?ñ]))))
342
343 (defvar iso-transl-ctl-x-8-map nil
344 "Keymap for C-x 8 prefix.")
345 (or iso-transl-ctl-x-8-map
346 (fset 'iso-transl-ctl-x-8-map
347 (setq iso-transl-ctl-x-8-map (make-sparse-keymap))))
348 (or key-translation-map
349 (setq key-translation-map (make-sparse-keymap)))
350 (define-key key-translation-map "\C-x8" iso-transl-ctl-x-8-map)
351
352 ;; For each entry in the alist, we'll make up to three ways to generate
353 ;; the character in question: the prefix `C-x 8'; the ALT modifier on
354 ;; the first key of the sequence; and (if applicable) replacing the first
355 ;; key of the sequence with the corresponding dead key. For example, a
356 ;; character associated with the string "~n" can be input with `C-x 8 ~ n'
357 ;; or `Alt-~ n' or `mute-asciitilde n'.
358 (defun iso-transl-define-keys (alist)
359 (while alist
360 (let ((translated-vec (cdr (car alist))))
361 (define-key iso-transl-ctl-x-8-map (car (car alist)) translated-vec)
362 (let ((inchar (aref (car (car alist)) 0))
363 (vec (vconcat (car (car alist))))
364 (tail iso-transl-dead-key-alist))
365 (aset vec 0 (logior (aref vec 0) ?\A-\^@))
366 (define-key key-translation-map vec translated-vec)
367 (define-key isearch-mode-map (vector (aref vec 0)) nil)
368 (while tail
369 (if (eq (car (car tail)) inchar)
370 (let ((deadvec (copy-sequence vec))
371 (deadkey (cdr (car tail))))
372 (aset deadvec 0 deadkey)
373 (define-key isearch-mode-map (vector deadkey) nil)
374 (define-key key-translation-map deadvec translated-vec)))
375 (setq tail (cdr tail)))))
376 (setq alist (cdr alist))))
377
378 (defun iso-transl-set-language (lang)
379 (interactive (list (let ((completion-ignore-case t))
380 (completing-read "Set which language? "
381 iso-transl-language-alist nil t))))
382 (iso-transl-define-keys (cdr (assoc lang iso-transl-language-alist))))
383
384
385 ;; The standard mapping comes automatically. You can partially overlay it
386 ;; with a language-specific mapping by using `M-x iso-transl-set-language'.
387 (iso-transl-define-keys iso-transl-char-map)
388
389 (define-key isearch-mode-map "\C-x" nil)
390 (define-key isearch-mode-map [?\C-x t] 'isearch-other-control-char)
391 (define-key isearch-mode-map "\C-x8" nil)
392
393
394 (provide 'iso-transl)
395
396 ;;; iso-transl.el ends here