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