comparison lisp/x-compose.el @ 2828:a25c824ed558

[xemacs-hg @ 2005-06-26 18:04:49 by aidan] Rename the ascii-character property, support more keysyms.
author aidan
date Sun, 26 Jun 2005 18:05:05 +0000
parents 3ecd8885ac67
children 8f07ad760f0f
comparison
equal deleted inserted replaced
2827:936a6576c655 2828:a25c824ed558
1 ;;; x-compose.el --- Compose-key processing in XEmacs 1 ;;; x-compose.el --- Compose-key processing in XEmacs
2 2
3 ;; Copyright (C) 1992, 1993, 1997 Free Software Foundation, Inc. 3 ;; Copyright (C) 1992, 1993, 1997, 2005 Free Software Foundation, Inc.
4 4
5 ;; Author: Jamie Zawinski <jwz@jwz.org> 5 ;; Author: Jamie Zawinski <jwz@jwz.org>
6 ;; Maintainer: XEmacs Development Team 6 ;; Maintainer: XEmacs Development Team
7 ;; Rewritten by Martin Buchholz far too many times. 7 ;; Rewritten by Martin Buchholz far too many times.
8 ;; 8 ;;
98 98
99 ;; This code has one feature that a more "builtin" Compose mechanism could 99 ;; This code has one feature that a more "builtin" Compose mechanism could
100 ;; not have: at any point you can type C-h to get a list of the possible 100 ;; not have: at any point you can type C-h to get a list of the possible
101 ;; completions of what you have typed so far. 101 ;; completions of what you have typed so far.
102 102
103 ;; Giacomo Boffi's problem of
104 ;; 20050324103919.8D22E4901@boffi95.stru.polimi.it is caused by Xlib doing
105 ;; the compose processing. To turn that off, I'm not certain what's
106
103 ;;; Code: 107 ;;; Code:
104
105 (require 'x-iso8859-1)
106 108
107 (macrolet 109 (macrolet
108 ((define-compose-map (keymap-symbol) 110 ((define-compose-map (keymap-symbol)
109 `(progn 111 `(progn
110 (defconst ,keymap-symbol (make-sparse-keymap ',keymap-symbol)) 112 (defconst ,keymap-symbol (make-sparse-keymap ',keymap-symbol))
155 157
156 158
157 ;;; The contents of the "dead key" maps. These are shared by the 159 ;;; The contents of the "dead key" maps. These are shared by the
158 ;;; compose-map. 160 ;;; compose-map.
159 161
162 ;;; These used to all have nice readable X11-oriented keysym names as the
163 ;;; macro definition in the third argument, but I moved the interpretation
164 ;;; of those mappings (that is, Aacute to \301, &c.) to runtime in the X11
165 ;;; code on first sight of the symbols--which is the more general solution,
166 ;;; what with Unicode keysyms, publishing, technical and so on, there's no
167 ;;; need to have them hanging around as symbols all the time--so they're no
168 ;;; longer available to Lisp before X11 sees them, something this relied on.
169
170 ;;; The transformation was done like so;
171
172 ;;; (while (re-search-forward "\\[\\([a-zA-Z]+\\)\\])$" nil t)
173 ;;; (replace-match (format "(?\\%o)"
174 ;;; (get (intern (match-string 1)) 'character-of-keysym))
175 ;;; t t nil 1))
176
177 ;;; with a lot of repeated calling of setxkbmap to esoteric keymaps--so
178 ;;; x_reset_key_mapping gets called for all the keys on the keyboard--yacute
179 ;;; getting picked up from the Czech keymap, idiaeresis from the Dutch one,
180 ;;; and many more (al, ca, cz, de, dvorak, ee, es, fi, fr, hu,
181 ;;; ie(UnicodeExpert), it, nl, pt, ro, tr, us, vn, if it interests you.)
182
183 ;;; The parentheses inside the vector are because otherwise the macro gets
184 ;;; interpreted as a meta character, the Latin-1 codes being in exactly that
185 ;;; range. Perhaps that bears documenting somewhere. Also, why is help
186 ;;; turned off for these (x-compose) sequences by default?
187
188 ;;; (Aidan Kehoe, 2005-05-18)
189
160 (define-key compose-acute-map [space] "'") 190 (define-key compose-acute-map [space] "'")
161 (define-key compose-acute-map [?'] [acute]) 191 (define-key compose-acute-map [?'] [(?\264)])
162 (define-key compose-acute-map [?A] [Aacute]) 192 (define-key compose-acute-map [?A] [(?\301)])
163 (define-key compose-acute-map [E] [Eacute]) 193 (define-key compose-acute-map [E] [(?\311)])
164 (define-key compose-acute-map [I] [Iacute]) 194 (define-key compose-acute-map [I] [(?\315)])
165 (define-key compose-acute-map [O] [Oacute]) 195 (define-key compose-acute-map [O] [(?\323)])
166 (define-key compose-acute-map [U] [Uacute]) 196 (define-key compose-acute-map [U] [(?\332)])
167 (define-key compose-acute-map [Y] [Yacute]) 197 (define-key compose-acute-map [Y] [(?\335)])
168 (define-key compose-acute-map [a] [aacute]) 198 (define-key compose-acute-map [a] [(?\341)])
169 (define-key compose-acute-map [e] [eacute]) 199 (define-key compose-acute-map [e] [(?\351)])
170 (define-key compose-acute-map [i] [iacute]) 200 (define-key compose-acute-map [i] [(?\355)])
171 (define-key compose-acute-map [o] [oacute]) 201 (define-key compose-acute-map [o] [(?\363)])
172 (define-key compose-acute-map [u] [uacute]) 202 (define-key compose-acute-map [u] [(?\372)])
173 (define-key compose-acute-map [y] [yacute]) 203 (define-key compose-acute-map [y] [(?\375)])
174 204
175 (define-key compose-grave-map [space] "`") 205 (define-key compose-grave-map [space] "`")
176 (define-key compose-grave-map [?`] [grave]) 206 (define-key compose-grave-map [?`] [(?\140)])
177 (define-key compose-grave-map [A] [Agrave]) 207 (define-key compose-grave-map [A] [(?\300)])
178 (define-key compose-grave-map [E] [Egrave]) 208 (define-key compose-grave-map [E] [(?\310)])
179 (define-key compose-grave-map [I] [Igrave]) 209 (define-key compose-grave-map [I] [(?\314)])
180 (define-key compose-grave-map [O] [Ograve]) 210 (define-key compose-grave-map [O] [(?\322)])
181 (define-key compose-grave-map [U] [Ugrave]) 211 (define-key compose-grave-map [U] [(?\331)])
182 (define-key compose-grave-map [a] [agrave]) 212 (define-key compose-grave-map [a] [(?\340)])
183 (define-key compose-grave-map [e] [egrave]) 213 (define-key compose-grave-map [e] [(?\350)])
184 (define-key compose-grave-map [i] [igrave]) 214 (define-key compose-grave-map [i] [(?\354)])
185 (define-key compose-grave-map [o] [ograve]) 215 (define-key compose-grave-map [o] [(?\362)])
186 (define-key compose-grave-map [u] [ugrave]) 216 (define-key compose-grave-map [u] [(?\371)])
187 217
188 (define-key compose-cedilla-map [space] ",") 218 (define-key compose-cedilla-map [space] ",")
189 (define-key compose-cedilla-map [?,] [cedilla]) 219 (define-key compose-cedilla-map [?,] [(?\270)])
190 (define-key compose-cedilla-map [C] [Ccedilla]) 220 (define-key compose-cedilla-map [C] [(?\307)])
191 (define-key compose-cedilla-map [c] [ccedilla]) 221 (define-key compose-cedilla-map [c] [(?\347)])
192 222
193 (define-key compose-diaeresis-map [space] [diaeresis]) 223 (define-key compose-diaeresis-map [space] [(?\250)])
194 (define-key compose-diaeresis-map [?\"] [diaeresis]) 224 (define-key compose-diaeresis-map [?\"] [(?\250)])
195 (define-key compose-diaeresis-map [A] [Adiaeresis]) 225 (define-key compose-diaeresis-map [A] [(?\304)])
196 (define-key compose-diaeresis-map [E] [Ediaeresis]) 226 (define-key compose-diaeresis-map [E] [(?\313)])
197 (define-key compose-diaeresis-map [I] [Idiaeresis]) 227 (define-key compose-diaeresis-map [I] [(?\317)])
198 (define-key compose-diaeresis-map [O] [Odiaeresis]) 228 (define-key compose-diaeresis-map [O] [(?\326)])
199 (define-key compose-diaeresis-map [U] [Udiaeresis]) 229 (define-key compose-diaeresis-map [U] [(?\334)])
200 (define-key compose-diaeresis-map [a] [adiaeresis]) 230 (define-key compose-diaeresis-map [a] [(?\344)])
201 (define-key compose-diaeresis-map [e] [ediaeresis]) 231 (define-key compose-diaeresis-map [e] [(?\353)])
202 (define-key compose-diaeresis-map [i] [idiaeresis]) 232 (define-key compose-diaeresis-map [i] [(?\357)])
203 (define-key compose-diaeresis-map [o] [odiaeresis]) 233 (define-key compose-diaeresis-map [o] [(?\366)])
204 (define-key compose-diaeresis-map [u] [udiaeresis]) 234 (define-key compose-diaeresis-map [u] [(?\374)])
205 (define-key compose-diaeresis-map [y] [ydiaeresis]) 235 (define-key compose-diaeresis-map [y] [(?\377)])
206 236
207 (define-key compose-circumflex-map [space] "^") 237 (define-key compose-circumflex-map [space] "^")
208 (define-key compose-circumflex-map [?/] "|") 238 (define-key compose-circumflex-map [?/] "|")
209 (define-key compose-circumflex-map [?!] [brokenbar]) 239 (define-key compose-circumflex-map [?!] [(?\246)])
210 (define-key compose-circumflex-map [?-] [macron]) 240 (define-key compose-circumflex-map [?-] [(?\257)])
211 (define-key compose-circumflex-map [?_] [macron]) 241 (define-key compose-circumflex-map [?_] [(?\257)])
212 (define-key compose-circumflex-map [?0] [degree]) 242 (define-key compose-circumflex-map [?0] [(?\260)])
213 (define-key compose-circumflex-map [?1] [onesuperior]) 243 (define-key compose-circumflex-map [?1] [(?\271)])
214 (define-key compose-circumflex-map [?2] [twosuperior]) 244 (define-key compose-circumflex-map [?2] [(?\262)])
215 (define-key compose-circumflex-map [?3] [threesuperior]) 245 (define-key compose-circumflex-map [?3] [(?\263)])
216 (define-key compose-circumflex-map [?.] [periodcentered]) 246 (define-key compose-circumflex-map [?.] [(?\267)])
217 (define-key compose-circumflex-map [A] [Acircumflex]) 247 (define-key compose-circumflex-map [A] [(?\302)])
218 (define-key compose-circumflex-map [E] [Ecircumflex]) 248 (define-key compose-circumflex-map [E] [(?\312)])
219 (define-key compose-circumflex-map [I] [Icircumflex]) 249 (define-key compose-circumflex-map [I] [(?\316)])
220 (define-key compose-circumflex-map [O] [Ocircumflex]) 250 (define-key compose-circumflex-map [O] [(?\324)])
221 (define-key compose-circumflex-map [U] [Ucircumflex]) 251 (define-key compose-circumflex-map [U] [(?\333)])
222 (define-key compose-circumflex-map [a] [acircumflex]) 252 (define-key compose-circumflex-map [a] [(?\342)])
223 (define-key compose-circumflex-map [e] [ecircumflex]) 253 (define-key compose-circumflex-map [e] [(?\352)])
224 (define-key compose-circumflex-map [i] [icircumflex]) 254 (define-key compose-circumflex-map [i] [(?\356)])
225 (define-key compose-circumflex-map [o] [ocircumflex]) 255 (define-key compose-circumflex-map [o] [(?\364)])
226 (define-key compose-circumflex-map [u] [ucircumflex]) 256 (define-key compose-circumflex-map [u] [(?\373)])
227 257
228 (define-key compose-tilde-map [space] "~") 258 (define-key compose-tilde-map [space] "~")
229 (define-key compose-tilde-map [A] [Atilde]) 259 (define-key compose-tilde-map [A] [(?\303)])
230 (define-key compose-tilde-map [N] [Ntilde]) 260 (define-key compose-tilde-map [N] [(?\321)])
231 (define-key compose-tilde-map [O] [Otilde]) 261 (define-key compose-tilde-map [O] [(?\325)])
232 (define-key compose-tilde-map [a] [atilde]) 262 (define-key compose-tilde-map [a] [(?\343)])
233 (define-key compose-tilde-map [n] [ntilde]) 263 (define-key compose-tilde-map [n] [(?\361)])
234 (define-key compose-tilde-map [o] [otilde]) 264 (define-key compose-tilde-map [o] [(?\365)])
235 265
236 (define-key compose-ring-map [space] [degree]) 266 (define-key compose-ring-map [space] [(?\260)])
237 (define-key compose-ring-map [A] [Aring]) 267 (define-key compose-ring-map [A] [(?\305)])
238 (define-key compose-ring-map [a] [aring]) 268 (define-key compose-ring-map [a] [(?\345)])
239 269
240 270
241 ;;; The rest of the compose-map. These are the composed characters 271 ;;; The rest of the compose-map. These are the composed characters
242 ;;; that are not accessible via "dead" keys. 272 ;;; that are not accessible via "dead" keys.
243 273
244 (define-key compose-map " '" "'") 274 (define-key compose-map " '" "'")
245 (define-key compose-map " ^" "^") 275 (define-key compose-map " ^" "^")
246 (define-key compose-map " `" "`") 276 (define-key compose-map " `" "`")
247 (define-key compose-map " ~" "~") 277 (define-key compose-map " ~" "~")
248 (define-key compose-map " " [nobreakspace]) 278 (define-key compose-map " " [(?\240)])
249 (define-key compose-map " \"" [diaeresis]) 279 (define-key compose-map " \"" [(?\250)])
250 (define-key compose-map " :" [diaeresis]) 280 (define-key compose-map " :" [(?\250)])
251 (define-key compose-map " *" [degree]) 281 (define-key compose-map " *" [(?\260)])
252 282
253 (define-key compose-map "!!" [exclamdown]) 283 (define-key compose-map "!!" [(?\241)])
254 (define-key compose-map "!^" [brokenbar]) 284 (define-key compose-map "!^" [(?\246)])
255 (define-key compose-map "!S" [section]) 285 (define-key compose-map "!S" [(?\247)])
256 (define-key compose-map "!s" [section]) 286 (define-key compose-map "!s" [(?\247)])
257 (define-key compose-map "!P" [paragraph]) 287 (define-key compose-map "!P" [(?\266)])
258 (define-key compose-map "!p" [paragraph]) 288 (define-key compose-map "!p" [(?\266)])
259 289
260 (define-key compose-map "((" "[") 290 (define-key compose-map "((" "[")
261 (define-key compose-map "(-" "{") 291 (define-key compose-map "(-" "{")
262 292
263 (define-key compose-map "))" "]") 293 (define-key compose-map "))" "]")
264 (define-key compose-map ")-" "}") 294 (define-key compose-map ")-" "}")
265 295
266 (define-key compose-map "++" "#") 296 (define-key compose-map "++" "#")
267 (define-key compose-map "+-" [plusminus]) 297 (define-key compose-map "+-" [(?\261)])
268 298
269 (define-key compose-map "-(" "{") 299 (define-key compose-map "-(" "{")
270 (define-key compose-map "-)" "}") 300 (define-key compose-map "-)" "}")
271 (define-key compose-map "--" "-") 301 (define-key compose-map "--" "-")
272 (define-key compose-map "-L" [sterling]) 302 (define-key compose-map "-L" [(?\243)])
273 (define-key compose-map "-l" [sterling]) 303 (define-key compose-map "-l" [(?\243)])
274 (define-key compose-map "-Y" [yen]) 304 (define-key compose-map "-Y" [(?\245)])
275 (define-key compose-map "-y" [yen]) 305 (define-key compose-map "-y" [(?\245)])
276 (define-key compose-map "-," [notsign]) 306 (define-key compose-map "-," [(?\254)])
277 (define-key compose-map "-|" [notsign]) 307 (define-key compose-map "-|" [(?\254)])
278 (define-key compose-map "-^" [macron]) 308 (define-key compose-map "-^" [(?\257)])
279 (define-key compose-map "-+" [plusminus]) 309 (define-key compose-map "-+" [(?\261)])
280 (define-key compose-map "-:" [division]) 310 (define-key compose-map "-:" [(?\367)])
281 (define-key compose-map "-D" [ETH]) 311 (define-key compose-map "-D" [(?\320)])
282 (define-key compose-map "-d" [eth]) 312 (define-key compose-map "-d" [(?\360)])
283 (define-key compose-map "-a" [ordfeminine]) 313 (define-key compose-map "-a" [(?\252)])
284 314
285 (define-key compose-map ".^" [periodcentered]) 315 (define-key compose-map ".^" [(?\267)])
286 316
287 (define-key compose-map "//" "\\") 317 (define-key compose-map "//" "\\")
288 (define-key compose-map "/<" "\\") 318 (define-key compose-map "/<" "\\")
289 (define-key compose-map "/^" "|") 319 (define-key compose-map "/^" "|")
290 (define-key compose-map "/C" [cent]) 320 (define-key compose-map "/C" [(?\242)])
291 (define-key compose-map "/c" [cent]) 321 (define-key compose-map "/c" [(?\242)])
292 (define-key compose-map "/U" [mu]) 322 (define-key compose-map "/U" [(?\265)])
293 (define-key compose-map "/u" [mu]) 323 (define-key compose-map "/u" [(?\265)])
294 (define-key compose-map "/O" [Ooblique]) 324 (define-key compose-map "/O" [(?\330)])
295 (define-key compose-map "/o" [oslash]) 325 (define-key compose-map "/o" [(?\370)])
296 326
297 (define-key compose-map "0X" [currency]) 327 (define-key compose-map "0X" [(?\244)])
298 (define-key compose-map "0x" [currency]) 328 (define-key compose-map "0x" [(?\244)])
299 (define-key compose-map "0S" [section]) 329 (define-key compose-map "0S" [(?\247)])
300 (define-key compose-map "0s" [section]) 330 (define-key compose-map "0s" [(?\247)])
301 (define-key compose-map "0C" [copyright]) 331 (define-key compose-map "0C" [(?\251)])
302 (define-key compose-map "0c" [copyright]) 332 (define-key compose-map "0c" [(?\251)])
303 (define-key compose-map "0R" [registered]) 333 (define-key compose-map "0R" [(?\256)])
304 (define-key compose-map "0r" [registered]) 334 (define-key compose-map "0r" [(?\256)])
305 (define-key compose-map "0^" [degree]) 335 (define-key compose-map "0^" [(?\260)])
306 336
307 (define-key compose-map "1^" [onesuperior]) 337 (define-key compose-map "1^" [(?\271)])
308 (define-key compose-map "14" [onequarter]) 338 (define-key compose-map "14" [(?\274)])
309 (define-key compose-map "12" [onehalf]) 339 (define-key compose-map "12" [(?\275)])
310 340
311 (define-key compose-map "2^" [twosuperior]) 341 (define-key compose-map "2^" [(?\262)])
312 342
313 (define-key compose-map "3^" [threesuperior]) 343 (define-key compose-map "3^" [(?\263)])
314 (define-key compose-map "34" [threequarters]) 344 (define-key compose-map "34" [(?\276)])
315 345
316 (define-key compose-map ":-" [division]) 346 (define-key compose-map ":-" [(?\367)])
317 347
318 (define-key compose-map "</" "\\") 348 (define-key compose-map "</" "\\")
319 (define-key compose-map "<<" [guillemotleft]) 349 (define-key compose-map "<<" [(?\253)])
320 350
321 (define-key compose-map "=L" [sterling]) 351 (define-key compose-map "=L" [(?\243)])
322 (define-key compose-map "=l" [sterling]) 352 (define-key compose-map "=l" [(?\243)])
323 (define-key compose-map "=Y" [yen]) 353 (define-key compose-map "=Y" [(?\245)])
324 (define-key compose-map "=y" [yen]) 354 (define-key compose-map "=y" [(?\245)])
325 355
326 (define-key compose-map ">>" [guillemotright]) 356 (define-key compose-map ">>" [(?\273)])
327 357
328 (define-key compose-map "??" [questiondown]) 358 (define-key compose-map "??" [(?\277)])
329 359
330 (define-key compose-map "AA" "@") 360 (define-key compose-map "AA" "@")
331 (define-key compose-map "Aa" "@") 361 (define-key compose-map "Aa" "@")
332 (define-key compose-map "A_" [ordfeminine]) 362 (define-key compose-map "A_" [(?\252)])
333 (define-key compose-map "A`" [Agrave]) 363 (define-key compose-map "A`" [(?\300)])
334 (define-key compose-map "A'" [Aacute]) 364 (define-key compose-map "A'" [(?\301)])
335 (define-key compose-map "A^" [Acircumflex]) 365 (define-key compose-map "A^" [(?\302)])
336 (define-key compose-map "A~" [Atilde]) 366 (define-key compose-map "A~" [(?\303)])
337 (define-key compose-map "A\"" [Adiaeresis]) 367 (define-key compose-map "A\"" [(?\304)])
338 (define-key compose-map "A*" [Aring]) 368 (define-key compose-map "A*" [(?\305)])
339 (define-key compose-map "AE" [AE]) 369 (define-key compose-map "AE" [(?\306)])
340 370
341 (define-key compose-map "C/" [cent]) 371 (define-key compose-map "C/" [(?\242)])
342 (define-key compose-map "C|" [cent]) 372 (define-key compose-map "C|" [(?\242)])
343 (define-key compose-map "C0" [copyright]) 373 (define-key compose-map "C0" [(?\251)])
344 (define-key compose-map "CO" [copyright]) 374 (define-key compose-map "CO" [(?\251)])
345 (define-key compose-map "Co" [copyright]) 375 (define-key compose-map "Co" [(?\251)])
346 (define-key compose-map "C," [Ccedilla]) 376 (define-key compose-map "C," [(?\307)])
347 377
348 (define-key compose-map "D-" [ETH]) 378 (define-key compose-map "D-" [(?\320)])
349 379
350 (define-key compose-map "E`" [Egrave]) 380 (define-key compose-map "E`" [(?\310)])
351 (define-key compose-map "E'" [Eacute]) 381 (define-key compose-map "E'" [(?\311)])
352 (define-key compose-map "E^" [Ecircumflex]) 382 (define-key compose-map "E^" [(?\312)])
353 (define-key compose-map "E\"" [Ediaeresis]) 383 (define-key compose-map "E\"" [(?\313)])
354 384
355 (define-key compose-map "I`" [Igrave]) 385 (define-key compose-map "I`" [(?\314)])
356 (define-key compose-map "I'" [Iacute]) 386 (define-key compose-map "I'" [(?\315)])
357 (define-key compose-map "I^" [Icircumflex]) 387 (define-key compose-map "I^" [(?\316)])
358 (define-key compose-map "I\"" [Idiaeresis]) 388 (define-key compose-map "I\"" [(?\317)])
359 389
360 (define-key compose-map "L-" [sterling]) 390 (define-key compose-map "L-" [(?\243)])
361 (define-key compose-map "L=" [sterling]) 391 (define-key compose-map "L=" [(?\243)])
362 392
363 (define-key compose-map "N~" [Ntilde]) 393 (define-key compose-map "N~" [(?\321)])
364 394
365 (define-key compose-map "OX" [currency]) 395 (define-key compose-map "OX" [(?\244)])
366 (define-key compose-map "Ox" [currency]) 396 (define-key compose-map "Ox" [(?\244)])
367 (define-key compose-map "OS" [section]) 397 (define-key compose-map "OS" [(?\247)])
368 (define-key compose-map "Os" [section]) 398 (define-key compose-map "Os" [(?\247)])
369 (define-key compose-map "OC" [copyright]) 399 (define-key compose-map "OC" [(?\251)])
370 (define-key compose-map "Oc" [copyright]) 400 (define-key compose-map "Oc" [(?\251)])
371 (define-key compose-map "OR" [registered]) 401 (define-key compose-map "OR" [(?\256)])
372 (define-key compose-map "Or" [registered]) 402 (define-key compose-map "Or" [(?\256)])
373 (define-key compose-map "O_" [masculine]) 403 (define-key compose-map "O_" [(?\272)])
374 (define-key compose-map "O`" [Ograve]) 404 (define-key compose-map "O`" [(?\322)])
375 (define-key compose-map "O'" [Oacute]) 405 (define-key compose-map "O'" [(?\323)])
376 (define-key compose-map "O^" [Ocircumflex]) 406 (define-key compose-map "O^" [(?\324)])
377 (define-key compose-map "O~" [Otilde]) 407 (define-key compose-map "O~" [(?\325)])
378 (define-key compose-map "O\"" [Odiaeresis]) 408 (define-key compose-map "O\"" [(?\326)])
379 (define-key compose-map "O/" [Ooblique]) 409 (define-key compose-map "O/" [(?\330)])
380 410
381 (define-key compose-map "P!" [paragraph]) 411 (define-key compose-map "P!" [(?\266)])
382 412
383 (define-key compose-map "R0" [registered]) 413 (define-key compose-map "R0" [(?\256)])
384 (define-key compose-map "RO" [registered]) 414 (define-key compose-map "RO" [(?\256)])
385 (define-key compose-map "Ro" [registered]) 415 (define-key compose-map "Ro" [(?\256)])
386 416
387 (define-key compose-map "S!" [section]) 417 (define-key compose-map "S!" [(?\247)])
388 (define-key compose-map "S0" [section]) 418 (define-key compose-map "S0" [(?\247)])
389 (define-key compose-map "SO" [section]) 419 (define-key compose-map "SO" [(?\247)])
390 (define-key compose-map "So" [section]) 420 (define-key compose-map "So" [(?\247)])
391 (define-key compose-map "SS" [ssharp]) 421 (define-key compose-map "SS" [(?\337)])
392 422
393 (define-key compose-map "TH" [THORN]) 423 (define-key compose-map "TH" [(?\336)])
394 424
395 (define-key compose-map "U`" [Ugrave]) 425 (define-key compose-map "U`" [(?\331)])
396 (define-key compose-map "U'" [Uacute]) 426 (define-key compose-map "U'" [(?\332)])
397 (define-key compose-map "U^" [Ucircumflex]) 427 (define-key compose-map "U^" [(?\333)])
398 (define-key compose-map "U\"" [Udiaeresis]) 428 (define-key compose-map "U\"" [(?\334)])
399 429
400 (define-key compose-map "X0" [currency]) 430 (define-key compose-map "X0" [(?\244)])
401 (define-key compose-map "XO" [currency]) 431 (define-key compose-map "XO" [(?\244)])
402 (define-key compose-map "Xo" [currency]) 432 (define-key compose-map "Xo" [(?\244)])
403 433
404 (define-key compose-map "Y-" [yen]) 434 (define-key compose-map "Y-" [(?\245)])
405 (define-key compose-map "Y=" [yen]) 435 (define-key compose-map "Y=" [(?\245)])
406 (define-key compose-map "Y'" [Yacute]) 436 (define-key compose-map "Y'" [(?\335)])
407 437
408 (define-key compose-map "_A" [ordfeminine]) 438 (define-key compose-map "_A" [(?\252)])
409 (define-key compose-map "_a" [ordfeminine]) 439 (define-key compose-map "_a" [(?\252)])
410 (define-key compose-map "_^" [macron]) 440 (define-key compose-map "_^" [(?\257)])
411 (define-key compose-map "_O" [masculine]) 441 (define-key compose-map "_O" [(?\272)])
412 (define-key compose-map "_o" [masculine]) 442 (define-key compose-map "_o" [(?\272)])
413 443
414 (define-key compose-map "aA" "@") 444 (define-key compose-map "aA" "@")
415 (define-key compose-map "aa" "@") 445 (define-key compose-map "aa" "@")
416 (define-key compose-map "a_" [ordfeminine]) 446 (define-key compose-map "a_" [(?\252)])
417 (define-key compose-map "a-" [ordfeminine]) 447 (define-key compose-map "a-" [(?\252)])
418 (define-key compose-map "a`" [agrave]) 448 (define-key compose-map "a`" [(?\340)])
419 (define-key compose-map "a'" [aacute]) 449 (define-key compose-map "a'" [(?\341)])
420 (define-key compose-map "a^" [acircumflex]) 450 (define-key compose-map "a^" [(?\342)])
421 (define-key compose-map "a~" [atilde]) 451 (define-key compose-map "a~" [(?\343)])
422 (define-key compose-map "a\"" [adiaeresis]) 452 (define-key compose-map "a\"" [(?\344)])
423 (define-key compose-map "a*" [aring]) 453 (define-key compose-map "a*" [(?\345)])
424 (define-key compose-map "ae" [ae]) 454 (define-key compose-map "ae" [(?\346)])
425 455
426 (define-key compose-map "c/" [cent]) 456 (define-key compose-map "c/" [(?\242)])
427 (define-key compose-map "c|" [cent]) 457 (define-key compose-map "c|" [(?\242)])
428 (define-key compose-map "c0" [copyright]) 458 (define-key compose-map "c0" [(?\251)])
429 (define-key compose-map "cO" [copyright]) 459 (define-key compose-map "cO" [(?\251)])
430 (define-key compose-map "co" [copyright]) 460 (define-key compose-map "co" [(?\251)])
431 (define-key compose-map "c," [ccedilla]) 461 (define-key compose-map "c," [(?\347)])
432 462
433 (define-key compose-map "d-" [eth]) 463 (define-key compose-map "d-" [(?\360)])
434 464
435 (define-key compose-map "e`" [egrave]) 465 (define-key compose-map "e`" [(?\350)])
436 (define-key compose-map "e'" [eacute]) 466 (define-key compose-map "e'" [(?\351)])
437 (define-key compose-map "e^" [ecircumflex]) 467 (define-key compose-map "e^" [(?\352)])
438 (define-key compose-map "e\"" [ediaeresis]) 468 (define-key compose-map "e\"" [(?\353)])
439 469
440 (define-key compose-map "i`" [igrave]) 470 (define-key compose-map "i`" [(?\354)])
441 (define-key compose-map "i'" [iacute]) 471 (define-key compose-map "i'" [(?\355)])
442 (define-key compose-map "i^" [icircumflex]) 472 (define-key compose-map "i^" [(?\356)])
443 (define-key compose-map "i\"" [idiaeresis]) 473 (define-key compose-map "i\"" [(?\357)])
444 (define-key compose-map "i:" [idiaeresis]) 474 (define-key compose-map "i:" [(?\357)])
445 475
446 (define-key compose-map "l-" [sterling]) 476 (define-key compose-map "l-" [(?\243)])
447 (define-key compose-map "l=" [sterling]) 477 (define-key compose-map "l=" [(?\243)])
448 478
449 (define-key compose-map "n~" [ntilde]) 479 (define-key compose-map "n~" [(?\361)])
450 480
451 (define-key compose-map "oX" [currency]) 481 (define-key compose-map "oX" [(?\244)])
452 (define-key compose-map "ox" [currency]) 482 (define-key compose-map "ox" [(?\244)])
453 (define-key compose-map "oC" [copyright]) 483 (define-key compose-map "oC" [(?\251)])
454 (define-key compose-map "oc" [copyright]) 484 (define-key compose-map "oc" [(?\251)])
455 (define-key compose-map "oR" [registered]) 485 (define-key compose-map "oR" [(?\256)])
456 (define-key compose-map "or" [registered]) 486 (define-key compose-map "or" [(?\256)])
457 (define-key compose-map "oS" [section]) 487 (define-key compose-map "oS" [(?\247)])
458 (define-key compose-map "os" [section]) 488 (define-key compose-map "os" [(?\247)])
459 (define-key compose-map "o_" [masculine]) 489 (define-key compose-map "o_" [(?\272)])
460 (define-key compose-map "o`" [ograve]) 490 (define-key compose-map "o`" [(?\362)])
461 (define-key compose-map "o'" [oacute]) 491 (define-key compose-map "o'" [(?\363)])
462 (define-key compose-map "o^" [ocircumflex]) 492 (define-key compose-map "o^" [(?\364)])
463 (define-key compose-map "o~" [otilde]) 493 (define-key compose-map "o~" [(?\365)])
464 (define-key compose-map "o\"" [odiaeresis]) 494 (define-key compose-map "o\"" [(?\366)])
465 (define-key compose-map "o/" [oslash]) 495 (define-key compose-map "o/" [(?\370)])
466 496
467 (define-key compose-map "p!" [paragraph]) 497 (define-key compose-map "p!" [(?\266)])
468 498
469 (define-key compose-map "r0" [registered]) 499 (define-key compose-map "r0" [(?\256)])
470 (define-key compose-map "rO" [registered]) 500 (define-key compose-map "rO" [(?\256)])
471 (define-key compose-map "ro" [registered]) 501 (define-key compose-map "ro" [(?\256)])
472 502
473 (define-key compose-map "s!" [section]) 503 (define-key compose-map "s!" [(?\247)])
474 (define-key compose-map "s0" [section]) 504 (define-key compose-map "s0" [(?\247)])
475 (define-key compose-map "sO" [section]) 505 (define-key compose-map "sO" [(?\247)])
476 (define-key compose-map "so" [section]) 506 (define-key compose-map "so" [(?\247)])
477 (define-key compose-map "ss" [ssharp]) 507 (define-key compose-map "ss" [(?\337)])
478 508
479 (define-key compose-map "th" [thorn]) 509 (define-key compose-map "th" [(?\376)])
480 510
481 (define-key compose-map "u`" [ugrave]) 511 (define-key compose-map "u`" [(?\371)])
482 (define-key compose-map "u'" [uacute]) 512 (define-key compose-map "u'" [(?\372)])
483 (define-key compose-map "u^" [ucircumflex]) 513 (define-key compose-map "u^" [(?\373)])
484 (define-key compose-map "u\"" [udiaeresis]) 514 (define-key compose-map "u\"" [(?\374)])
485 (define-key compose-map "u/" [mu]) 515 (define-key compose-map "u/" [(?\265)])
486 516
487 (define-key compose-map "x0" [currency]) 517 (define-key compose-map "x0" [(?\244)])
488 (define-key compose-map "xO" [currency]) 518 (define-key compose-map "xO" [(?\244)])
489 (define-key compose-map "xo" [currency]) 519 (define-key compose-map "xo" [(?\244)])
490 (define-key compose-map "xx" [multiply]) 520 (define-key compose-map "xx" [(?\327)])
491 521
492 (define-key compose-map "y-" [yen]) 522 (define-key compose-map "y-" [(?\245)])
493 (define-key compose-map "y=" [yen]) 523 (define-key compose-map "y=" [(?\245)])
494 (define-key compose-map "y'" [yacute]) 524 (define-key compose-map "y'" [(?\375)])
495 (define-key compose-map "y\"" [ydiaeresis]) 525 (define-key compose-map "y\"" [(?\377)])
496 526
497 (define-key compose-map "|C" [cent]) 527 (define-key compose-map "|C" [(?\242)])
498 (define-key compose-map "|c" [cent]) 528 (define-key compose-map "|c" [(?\242)])
499 (define-key compose-map "||" [brokenbar]) 529 (define-key compose-map "||" [(?\246)])
500 530
501 531
502 ;; Suppose we type these three physical keys: [Multi_key " a] 532 ;; [[ Suppose we type these three physical keys: [Multi_key " a]
503 ;; Xlib can deliver these keys as the following sequences of keysyms: 533 ;; Xlib can deliver these keys as the following sequences of keysyms:
504 ;; 534 ;;
505 ;; - [Multi_key " a] (no surprise here) 535 ;; - [Multi_key " a] (no surprise here)
506 ;; - [adiaeresis] (OK, Xlib is doing compose processing for us) 536 ;; - [adiaeresis] (OK, Xlib is doing compose processing for us)
507 ;; - [Multi_key " adiaeresis] (Huh?) 537 ;; - [Multi_key " adiaeresis] (Huh?)
508 ;; 538 ;;
509 ;; It is the last possibility that is arguably a bug. Xlib can't 539 ;; It is the last possibility that is arguably a bug. Xlib can't
510 ;; decide whether it's really doing compose processing or not (or 540 ;; decide whether it's really doing compose processing or not (or
511 ;; actually, different parts of Xlib disagree). 541 ;; actually, different parts of Xlib disagree).
512 ;; 542 ;;
513 ;; So we'll just convert [Multi_key " adiaeresis] to [adiaeresis] 543 ;; So we'll just convert [Multi_key " adiaeresis] to [adiaeresis] ]]
514 (defun xlib-input-method-bug-workaround (keymap) 544
515 (map-keymap 545 (eval-when-compile
516 (lambda (key value) 546 (when nil ;; Commenting out.
517 (cond 547
518 ((keymapp value) 548 ;; This _used_ to work with our X11-oriented keysyms above. With them
519 (xlib-input-method-bug-workaround value)) 549 ;; gone, it won't. The X11 bug it works around should be long dead. (Ha!
520 ((and (sequencep value) 550 ;; Wasn't it cockroaches that would have ruled the planet after World
521 (eq 1 (length value)) 551 ;; War III?)
522 (null (lookup-key keymap value))) 552
523 (define-key keymap value value)))) 553 (defun xlib-input-method-bug-workaround (keymap)
524 keymap)) 554 (map-keymap
525 (xlib-input-method-bug-workaround compose-map) 555 (lambda (key value)
526 (unintern 'xlib-input-method-bug-workaround) 556 (cond
557 ((keymapp value)
558 (xlib-input-method-bug-workaround value))
559 ((and (sequencep value)
560 (eq 1 (length value))
561 (null (lookup-key keymap value)))
562 (define-key keymap value value))))
563 keymap))
564 (xlib-input-method-bug-workaround compose-map)
565 (unintern 'xlib-input-method-bug-workaround)))
527 566
528 ;; While we're at it, a similar mechanism will make colon equivalent 567 ;; While we're at it, a similar mechanism will make colon equivalent
529 ;; to doublequote for diaeresis processing. Some Xlibs do this. 568 ;; to doublequote for diaeresis processing. Some Xlibs do this.
530 (defun alias-colon-to-doublequote (keymap) 569 (defun alias-colon-to-doublequote (keymap)
531 (map-keymap 570 (map-keymap
580 (<= (downcase base-char) ?z) 619 (<= (downcase base-char) ?z)
581 (lookup-key map (make-string 1 base-char))))) 620 (lookup-key map (make-string 1 base-char)))))
582 (if (and (vectorp mod-char) (= (length mod-char) 1)) 621 (if (and (vectorp mod-char) (= (length mod-char) 1))
583 (setq mod-char (aref mod-char 0))) 622 (setq mod-char (aref mod-char 0)))
584 (if (and mod-char (symbolp mod-char)) 623 (if (and mod-char (symbolp mod-char))
585 (setq mod-char (or (get mod-char character-set-property) mod-char))) 624 (setq mod-char (or (get mod-char 'character-of-keysym) mod-char)))
586 (if (and mod-char (> count 0)) 625 (if (and mod-char (> count 0))
587 (delete-char -1) 626 (delete-char -1)
588 (setq mod-char c)) 627 (setq mod-char c))
589 (while (> count 0) 628 (while (> count 0)
590 (insert mod-char) 629 (insert mod-char)
653 692
654 (put 'compose-help 'isearch-command t) ; so that it doesn't terminate isearch 693 (put 'compose-help 'isearch-command t) ; so that it doesn't terminate isearch
655 694
656 (defun compose-help-mapper (key binding) 695 (defun compose-help-mapper (key binding)
657 (if (and (symbolp key) 696 (if (and (symbolp key)
658 (get key character-set-property)) 697 (get key 'character-of-keysym))
659 (setq key (get key character-set-property))) 698 (setq key (get key 'character-of-keysym)))
660 (if (eq binding 'compose-help) ; suppress that... 699 (if (eq binding 'compose-help) ; suppress that...
661 nil 700 nil
662 (if (keymapp binding) 701 (if (keymapp binding)
663 (let ((p (point))) 702 (let ((p (point)))
664 (map-keymap 'compose-help-mapper binding t) 703 (map-keymap 'compose-help-mapper binding t)
673 (insert (make-string 1 key)) 712 (insert (make-string 1 key))
674 (insert (single-key-description key))) 713 (insert (single-key-description key)))
675 (indent-to 16) 714 (indent-to 16)
676 (let ((code (and (vectorp binding) 715 (let ((code (and (vectorp binding)
677 (= 1 (length binding)) 716 (= 1 (length binding))
678 (get (aref binding 0) character-set-property)))) 717 (get (aref binding 0) 'character-of-keysym))))
679 (if code 718 (if code
680 (insert (make-string 1 code)) 719 (insert (make-string 1 code))
681 (if (stringp binding) 720 (if (stringp binding)
682 (insert binding) 721 (insert binding)
683 (insert (prin1-to-string binding))))) 722 (insert (prin1-to-string binding)))))