Some fixes to follow coding conventions in files maintained by FSF.
[bpt/emacs.git] / lisp / international / iso-transl.el
1 ;;; iso-transl.el --- keyboard input definitions for ISO 8859/1
2
3 ;; Copyright (C) 1987, 1993, 1994, 1995 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 [160])
212 (defalias 'iso-transl-inverted-exclamation-mark [161])
213 (defalias 'iso-transl-cent-sign [162])
214 (defalias 'iso-transl-pound-sign [163])
215 (defalias 'iso-transl-general-currency-sign [164])
216 (defalias 'iso-transl-yen-sign [165])
217 (defalias 'iso-transl-broken-vertical-line [166])
218 (defalias 'iso-transl-section-sign [167])
219 (defalias 'iso-transl-diaeresis [168])
220 (defalias 'iso-transl-copyright-sign [169])
221 (defalias 'iso-transl-ordinal-indicator-feminine [170])
222 (defalias 'iso-transl-angle-left [171])
223 (defalias 'iso-transl-not-sign [172])
224 (defalias 'iso-transl-soft-hyphen [173])
225 (defalias 'iso-transl-registered-sign [174])
226 (defalias 'iso-transl-macron [175])
227 (defalias 'iso-transl-degree-sign [176])
228 (defalias 'iso-transl-plus-or-minus-sign [177])
229 (defalias 'iso-transl-superscript-2 [178])
230 (defalias 'iso-transl-superscript-3 [179])
231 (defalias 'iso-transl-acute-accent [180])
232 (defalias 'iso-transl-micro-sign [181])
233 (defalias 'iso-transl-pilcrow [182])
234 (defalias 'iso-transl-middle-dot [183])
235 (defalias 'iso-transl-cedilla [184])
236 (defalias 'iso-transl-superscript-1 [185])
237 (defalias 'iso-transl-ordinal-indicator-masculine [186])
238 (defalias 'iso-transl-angle-right [187])
239 (defalias 'iso-transl-one-quarter [188])
240 (defalias 'iso-transl-one-half [189])
241 (defalias 'iso-transl-three-quarters [190])
242 (defalias 'iso-transl-inverted-question-mark [191])
243 (defalias 'iso-transl-A-grave [192])
244 (defalias 'iso-transl-A-acute [193])
245 (defalias 'iso-transl-A-caret [194])
246 (defalias 'iso-transl-A-tilde [195])
247 (defalias 'iso-transl-A-umlaut [196])
248 (defalias 'iso-transl-A-ring [197])
249 (defalias 'iso-transl-AE [198])
250 (defalias 'iso-transl-C-cedilla [199])
251 (defalias 'iso-transl-E-grave [200])
252 (defalias 'iso-transl-E-acute [201])
253 (defalias 'iso-transl-E-caret [202])
254 (defalias 'iso-transl-E-umlaut [203])
255 (defalias 'iso-transl-I-grave [204])
256 (defalias 'iso-transl-I-acute [205])
257 (defalias 'iso-transl-I-caret [206])
258 (defalias 'iso-transl-I-umlaut [207])
259 (defalias 'iso-transl-D-stroke [208])
260 (defalias 'iso-transl-N-tilde [209])
261 (defalias 'iso-transl-O-grave [210])
262 (defalias 'iso-transl-O-acute [211])
263 (defalias 'iso-transl-O-caret [212])
264 (defalias 'iso-transl-O-tilde [213])
265 (defalias 'iso-transl-O-umlaut [214])
266 (defalias 'iso-transl-multiplication-sign [215])
267 (defalias 'iso-transl-O-slash [216])
268 (defalias 'iso-transl-U-grave [217])
269 (defalias 'iso-transl-U-acute [218])
270 (defalias 'iso-transl-U-caret [219])
271 (defalias 'iso-transl-U-umlaut [220])
272 (defalias 'iso-transl-Y-acute [221])
273 (defalias 'iso-transl-THORN [222])
274 (defalias 'iso-transl-ss [223])
275 (defalias 'iso-transl-a-grave [224])
276 (defalias 'iso-transl-a-acute [225])
277 (defalias 'iso-transl-a-caret [226])
278 (defalias 'iso-transl-a-tilde [227])
279 (defalias 'iso-transl-a-umlaut [228])
280 (defalias 'iso-transl-a-ring [229])
281 (defalias 'iso-transl-ae [230])
282 (defalias 'iso-transl-c-cedilla [231])
283 (defalias 'iso-transl-e-grave [232])
284 (defalias 'iso-transl-e-acute [233])
285 (defalias 'iso-transl-E-caret [234])
286 (defalias 'iso-transl-e-umlaut [235])
287 (defalias 'iso-transl-i-grave [236])
288 (defalias 'iso-transl-i-acute [237])
289 (defalias 'iso-transl-I-caret [238])
290 (defalias 'iso-transl-i-umlaut [239])
291 (defalias 'iso-transl-d-stroke [240])
292 (defalias 'iso-transl-n-tilde [241])
293 (defalias 'iso-transl-o-grave [242])
294 (defalias 'iso-transl-o-acute [243])
295 (defalias 'iso-transl-O-caret [244])
296 (defalias 'iso-transl-o-tilde [245])
297 (defalias 'iso-transl-o-umlaut [246])
298 (defalias 'iso-transl-division-sign [247])
299 (defalias 'iso-transl-o-slash [248])
300 (defalias 'iso-transl-u-grave [249])
301 (defalias 'iso-transl-u-acute [250])
302 (defalias 'iso-transl-U-caret [251])
303 (defalias 'iso-transl-u-umlaut [252])
304 (defalias 'iso-transl-y-acute [253])
305 (defalias 'iso-transl-thorn [254])
306 (defalias 'iso-transl-y-umlaut [255])
307
308 ;; Language-specific translation lists.
309 (defvar iso-transl-language-alist
310 '(("Esperanto"
311 ("C" . [198])
312 ("G" . [216])
313 ("H" . [166])
314 ("J" . [172])
315 ("S" . [222])
316 ("U" . [221])
317 ("c" . [230])
318 ("g" . [248])
319 ("h" . [182])
320 ("j" . [188])
321 ("s" . [254])
322 ("u" . [253]))
323 ("French"
324 ("C" . [199])
325 ("c" . [231]))
326 ("German"
327 ("A" . [196])
328 ("O" . [214])
329 ("U" . [220])
330 ("a" . [228])
331 ("o" . [246])
332 ("s" . [223])
333 ("u" . [252]))
334 ("Portuguese"
335 ("C" . [199])
336 ("c" . [231]))
337 ("Spanish"
338 ("!" . [161])
339 ("?" . [191])
340 ("N" . [209])
341 ("n" . [241]))))
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