home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / lucid / lemacs-19.6 / lisp / x11 / x-compose.el next >
Encoding:
Text File  |  1993-01-15  |  26.7 KB  |  684 lines

  1. ;; Compose-key processing in emacs.
  2. ;; Copyright (C) 1992-1993 Free Software Foundation, Inc.
  3.  
  4. ;; This file is part of GNU Emacs.
  5.  
  6. ;; GNU Emacs is free software; you can redistribute it and/or modify
  7. ;; it under the terms of the GNU General Public License as published by
  8. ;; the Free Software Foundation; either version 2, or (at your option)
  9. ;; any later version.
  10.  
  11. ;; GNU Emacs is distributed in the hope that it will be useful,
  12. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ;; GNU General Public License for more details.
  15.  
  16. ;; You should have received a copy of the GNU General Public License
  17. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  18. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20. ;;; created by jwz, 14-jun-92.
  21.  
  22. ;;; This file implements DEC-, OpenWindows-, and HP-compatible "Compose"
  23. ;;; processing for Lucid GNU Emacs.  
  24. ;;;
  25. ;;; If you are running a version of X which already does compose processing,
  26. ;;; then you don't need this file.  But the MIT R4 and R5 distributions don't
  27. ;;; do compose processing, so you may want to fake it by using this code.
  28. ;;;
  29. ;;; The basic idea is that there are several ways to generate keysyms which
  30. ;;; do not have keys devoted to them on your keyboard.
  31. ;;;
  32. ;;; The first method is by using "dead" keys.  A dead key is a key which,
  33. ;;; when typed, does not insert a character.  Instead it modifies the
  34. ;;; following character typed.  So if you typed "dead-tilde" followed by "A",
  35. ;;; then "A-tilde" would be inserted.  Of course, this requires you to modify
  36. ;;; your keyboard to include a "dead-tilde" key on it somewhere.
  37. ;;;
  38. ;;; The second method is by using a "Compose" key.  With a Compose key, you
  39. ;;; would type "Compose" then "tilde" then "A" to insert "A-tilde".
  40. ;;;
  41. ;;; There are a small number of dead keys: acute, grave, cedilla, diaeresis,
  42. ;;; circumflex, tilde, and ring.  There are a larger number of accented and
  43. ;;; other characters accessible via the Compose key, so both are useful.
  44. ;;;
  45. ;;; To use this code, you will need to have a Compose key on your keyboard.
  46. ;;; The default configuration of most X keyboards doesn't contain one.  You
  47. ;;; can, for example, turn the right "Meta" key into a "Compose" key with
  48. ;;; this command:
  49. ;;;
  50. ;;;    xmodmap -e "remove mod1 = Meta_R" -e "keysym Meta_R = Multi_key"
  51. ;;;
  52. ;;; Multi_key is the name that X (and emacs) know the "Compose" key by.
  53. ;;; The "remove..." command is necessary because the "Compose" key must not
  54. ;;; have any modifier bits associated with it.  This exact command may not
  55. ;;; work, depending on what system and keyboard you are using.  If it
  56. ;;; doesn't, you'll have to read the man page for xmodmap.  You might want
  57. ;;; to get the "xkeycaps" program from the host export.lcs.mit.edu in the
  58. ;;; file contrib/xkeycaps.tar.Z, which is a graphical front end to xmodmap
  59. ;;; that hides xmodmap's arcane syntax from you.
  60. ;;;
  61. ;;; If for some reason you don't want to have a dedicated compose key on your
  62. ;;; keyboard, you can use some other key as the prefix.  For example, to make
  63. ;;; "Meta-Shift-C" act as a compose key (so that "M-C , c" would insert the
  64. ;;; character "ccedilla") you could do
  65. ;;;
  66. ;;;    (global-set-key "\M-C" compose-map)
  67. ;;;
  68. ;;; I believe the bindings encoded in this file are the same as those used
  69. ;;; by OpenWindows versions 2 and 3, and DEC VT320 terminals.  Please let me
  70. ;;; know if you think otherwise.
  71. ;;;
  72. ;;; Much thanks to Justin Bur <justin@crim.ca> for helping me understand how
  73. ;;; this stuff is supposed to work.
  74. ;;;
  75. ;;; You also might want to consider getting Justin's patch for the MIT Xlib
  76. ;;; that implements compose processing in the library.  This will enable
  77. ;;; compose processing in applications other than emacs as well.  You can
  78. ;;; get it from export.lcs.mit.edu in contrib/compose.tar.Z.
  79.  
  80. ;;; This code has one feature that a more "builtin" Compose mechanism could
  81. ;;; not have: at any point you can type C-h to get a list of the possible
  82. ;;; completions of what you have typed so far.
  83.  
  84. (require 'x-iso8859-1)
  85.  
  86. (defvar compose-map        (make-keymap))
  87. (defvar compose-acute-map    (make-sparse-keymap))
  88. (defvar compose-grave-map    (make-sparse-keymap))
  89. (defvar compose-cedilla-map    (make-sparse-keymap))
  90. (defvar compose-diaeresis-map    (make-sparse-keymap))
  91. (defvar compose-circumflex-map    (make-sparse-keymap))
  92. (defvar compose-tilde-map    (make-sparse-keymap))
  93. (defvar compose-ring-map    (make-sparse-keymap))
  94.  
  95. ;; The "Compose" key:
  96. ;;
  97. (define-key global-map [multi_key]    compose-map)
  98. ;; (it's lower case because we downcase everything in the Symbol font...)
  99.  
  100. ;; The "Dead" keys:
  101. ;;
  102. (define-key global-map [acute]        compose-acute-map)
  103. (define-key global-map [cedilla]    compose-cedilla-map)
  104. (define-key global-map [diaeresis]    compose-diaeresis-map)
  105. (define-key global-map [degree]        compose-ring-map)
  106.  
  107. ;; The dead keys as seen by the "Compose" map:
  108. ;;
  109. (define-key compose-map [acute]        compose-acute-map)
  110. (define-key compose-map [cedilla]    compose-cedilla-map)
  111. (define-key compose-map [diaeresis]    compose-diaeresis-map)
  112. (define-key compose-map [degree]    compose-ring-map)
  113.  
  114. (define-key compose-map "'"        compose-acute-map)
  115. (define-key compose-map "`"        compose-grave-map)
  116. (define-key compose-map ","        compose-cedilla-map)
  117. (define-key compose-map "\""        compose-diaeresis-map)
  118. (define-key compose-map "^"        compose-circumflex-map)
  119. (define-key compose-map "~"        compose-tilde-map)
  120. (define-key compose-map "*"        compose-ring-map)
  121.  
  122.  
  123. ;;; The dead keys might really be called just about anything, depending
  124. ;;; on the vendor.  MIT thinks that the prefixes are "SunFA_", "D", and
  125. ;;; "hpmute_" for Sun, DEC, and HP respectively.  However, OpenWindows 3
  126. ;;; thinks that the prefixes are "SunXK_FA_", "DXK_", and "hpXK_mute_".
  127. ;;; And HP (who don't mention Sun and DEC at all) use "XK_mute_".
  128. ;;; Go figure.
  129.  
  130. ;;; Presumably if someone is running OpenWindows, they won't be using
  131. ;;; the DEC or HP keysyms, but if they are defined then that is possible,
  132. ;;; so in that case we accept them all.
  133.  
  134. ;;; If things seem not to be working, you might want to check your
  135. ;;; /usr/lib/X11/XKeysymDB file to see if your vendor has an equally
  136. ;;; mixed up view of what these keys should be called.
  137.  
  138. ;; Sun according to MIT:
  139. ;;
  140. (cond ((x-valid-keysym-name-p "SunFA_Acute")
  141.        (define-key global-map  [SunFA_Acute]        compose-acute-map)
  142.        (define-key compose-map [SunFA_Acute]        compose-acute-map)
  143.        (define-key global-map  [SunFA_Grave]        compose-grave-map)
  144.        (define-key compose-map [SunFA_Grave]        compose-grave-map)
  145.        (define-key global-map  [SunFA_Cedilla]        compose-cedilla-map)
  146.        (define-key compose-map [SunFA_Cedilla]        compose-cedilla-map)
  147.        (define-key global-map  [SunFA_Diaeresis]    compose-diaeresis-map)
  148.        (define-key compose-map [SunFA_Diaeresis]    compose-diaeresis-map)
  149.        (define-key global-map  [SunFA_Circum]        compose-circumflex-map)
  150.        (define-key compose-map [SunFA_Circum]        compose-circumflex-map)
  151.        (define-key global-map  [SunFA_Tilde]        compose-tilde-map)
  152.        (define-key compose-map [SunFA_Tilde]        compose-tilde-map)
  153.        ))
  154.  
  155. ;; Sun according to OpenWindows 2:
  156. ;;
  157. (cond ((x-valid-keysym-name-p "Dead_Grave")
  158.        (define-key global-map  [Dead_Grave]        compose-grave-map)
  159.        (define-key compose-map [Dead_Grave]        compose-grave-map)
  160.        (define-key global-map  [Dead_Circum]        compose-circumflex-map)
  161.        (define-key compose-map [Dead_Circum]        compose-circumflex-map)
  162.        (define-key global-map  [Dead_Tilde]        compose-tilde-map)
  163.        (define-key compose-map [Dead_Tilde]        compose-tilde-map)
  164.        ))
  165.  
  166. ;; Sun according to OpenWindows 3:
  167. ;;
  168. (cond ((x-valid-keysym-name-p "SunXK_FA_Acute")
  169.        (define-key global-map  [SunXK_FA_Acute]        compose-acute-map)
  170.        (define-key compose-map [SunXK_FA_Acute]        compose-acute-map)
  171.        (define-key global-map  [SunXK_FA_Grave]        compose-grave-map)
  172.        (define-key compose-map [SunXK_FA_Grave]        compose-grave-map)
  173.        (define-key global-map  [SunXK_FA_Cedilla]    compose-cedilla-map)
  174.        (define-key compose-map [SunXK_FA_Cedilla]    compose-cedilla-map)
  175.        (define-key global-map  [SunXK_FA_Diaeresis]    compose-diaeresis-map)
  176.        (define-key compose-map [SunXK_FA_Diaeresis]    compose-diaeresis-map)
  177.        (define-key global-map  [SunXK_FA_Circum]    compose-circumflex-map)
  178.        (define-key compose-map [SunXK_FA_Circum]    compose-circumflex-map)
  179.        (define-key global-map  [SunXK_FA_Tilde]        compose-tilde-map)
  180.        (define-key compose-map [SunXK_FA_Tilde]        compose-tilde-map)
  181.        ))
  182.  
  183. ;; DEC according to MIT:
  184. ;;
  185. (cond ((x-valid-keysym-name-p "Dacute_accent")
  186.        (define-key global-map  [Dacute_accent]        compose-acute-map)
  187.        (define-key compose-map [Dacute_accent]        compose-acute-map)
  188.        (define-key global-map  [Dgrave_accent]        compose-grave-map)
  189.        (define-key compose-map [Dgrave_accent]        compose-grave-map)
  190.        (define-key global-map  [Dcedilla_accent]    compose-cedilla-map)
  191.        (define-key compose-map [Dcedilla_accent]    compose-cedilla-map)
  192.        (define-key global-map  [Dcircumflex_accent]    compose-circumflex-map)
  193.        (define-key compose-map [Dcircumflex_accent]    compose-circumflex-map)
  194.        (define-key global-map  [Dtilde]            compose-tilde-map)
  195.        (define-key compose-map [Dtilde]            compose-tilde-map)
  196.        (define-key global-map  [Dring_accent]        compose-ring-map)
  197.        (define-key compose-map [Dring_accent]        compose-ring-map)
  198.        ))
  199.  
  200. ;; DEC according to OpenWindows 3:
  201. ;;
  202. (cond ((x-valid-keysym-name-p "DXK_acute_accent")
  203.        (define-key global-map  [DXK_acute_accent]    compose-acute-map)
  204.        (define-key compose-map [DXK_acute_accent]    compose-acute-map)
  205.        (define-key global-map  [DXK_grave_accent]    compose-grave-map)
  206.        (define-key compose-map [DXK_grave_accent]    compose-grave-map)
  207.        (define-key global-map  [DXK_cedilla_accent]    compose-cedilla-map)
  208.        (define-key compose-map [DXK_cedilla_accent]    compose-cedilla-map)
  209.        (define-key global-map  [DXK_circumflex_accent]    compose-circumflex-map)
  210.        (define-key compose-map [DXK_circumflex_accent]    compose-circumflex-map)
  211.        (define-key global-map  [DXK_tilde]        compose-tilde-map)
  212.        (define-key compose-map [DXK_tilde]        compose-tilde-map)
  213.        (define-key global-map  [DXK_ring_accent]    compose-ring-map)
  214.        (define-key compose-map [DXK_ring_accent]    compose-ring-map)
  215.        ))
  216.  
  217. ;; HP according to MIT:
  218. ;;
  219. (cond ((x-valid-keysym-name-p "hpmute_acute")
  220.        (define-key global-map  [hpmute_acute]        compose-acute-map)
  221.        (define-key compose-map [hpmute_acute]        compose-acute-map)
  222.        (define-key global-map  [hpmute_grave]        compose-grave-map)
  223.        (define-key compose-map [hpmute_grave]        compose-grave-map)
  224.        (define-key global-map  [hpmute_diaeresis]    compose-diaeresis-map)
  225.        (define-key compose-map [hpmute_diaeresis]    compose-diaeresis-map)
  226.        (define-key global-map  [hpmute_asciicircum]    compose-circumflex-map)
  227.        (define-key compose-map [hpmute_asciicircum]    compose-circumflex-map)
  228.        (define-key global-map  [hpmute_asciitilde]    compose-tilde-map)
  229.        (define-key compose-map [hpmute_asciitilde]    compose-tilde-map)
  230.        ))
  231.  
  232. ;; HP according to OpenWindows 3:
  233. ;;
  234. (cond ((x-valid-keysym-name-p "hpXK_mute_acute")
  235.        (define-key global-map  [hpXK_mute_acute]    compose-acute-map)
  236.        (define-key compose-map [hpXK_mute_acute]    compose-acute-map)
  237.        (define-key global-map  [hpXK_mute_grave]    compose-grave-map)
  238.        (define-key compose-map [hpXK_mute_grave]    compose-grave-map)
  239.        (define-key global-map  [hpXK_mute_diaeresis]    compose-diaeresis-map)
  240.        (define-key compose-map [hpXK_mute_diaeresis]    compose-diaeresis-map)
  241.        (define-key global-map  [hpXK_mute_asciicircum]    compose-circumflex-map)
  242.        (define-key compose-map [hpXK_mute_asciicircum]    compose-circumflex-map)
  243.        (define-key global-map  [hpXK_mute_asciitilde]    compose-tilde-map)
  244.        (define-key compose-map [hpXK_mute_asciitilde]    compose-tilde-map)
  245.        ))
  246.  
  247. ;; HP according to HP-UX 8.0:
  248. ;;
  249. (cond ((x-valid-keysym-name-p "XK_mute_acute")
  250.        (define-key global-map  [XK_mute_acute]        compose-acute-map)
  251.        (define-key compose-map [XK_mute_acute]        compose-acute-map)
  252.        (define-key global-map  [XK_mute_grave]        compose-grave-map)
  253.        (define-key compose-map [XK_mute_grave]        compose-grave-map)
  254.        (define-key global-map  [XK_mute_diaeresis]    compose-diaeresis-map)
  255.        (define-key compose-map [XK_mute_diaeresis]    compose-diaeresis-map)
  256.        (define-key global-map  [XK_mute_asciicircum]    compose-circumflex-map)
  257.        (define-key compose-map [XK_mute_asciicircum]    compose-circumflex-map)
  258.        (define-key global-map  [XK_mute_asciitilde]    compose-tilde-map)
  259.        (define-key compose-map [XK_mute_asciitilde]    compose-tilde-map)
  260.        ))
  261.  
  262. ;;; The contents of the "dead key" maps.  These are shared by the
  263. ;;; compose-map.
  264.  
  265. (define-key compose-acute-map " "    "'")
  266. (define-key compose-acute-map "'"    [acute])
  267. (define-key compose-acute-map "A"    [Aacute])
  268. (define-key compose-acute-map "E"    [Eacute])
  269. (define-key compose-acute-map "I"    [Iacute])
  270. (define-key compose-acute-map "O"    [Oacute])
  271. (define-key compose-acute-map "U"    [Uacute])
  272. (define-key compose-acute-map "Y"    [Yacute])
  273. (define-key compose-acute-map "a"    [aacute])
  274. (define-key compose-acute-map "e"    [eacute])
  275. (define-key compose-acute-map "i"    [iacute])
  276. (define-key compose-acute-map "o"    [oacute])
  277. (define-key compose-acute-map "u"    [uacute])
  278. (define-key compose-acute-map "y"    [yacute])
  279.  
  280. (define-key compose-grave-map " "    [grave])
  281. (define-key compose-grave-map "A"    [Agrave])
  282. (define-key compose-grave-map "E"    [Egrave])
  283. (define-key compose-grave-map "I"    [Igrave])
  284. (define-key compose-grave-map "O"    [Ograve])
  285. (define-key compose-grave-map "U"    [Ugrave])
  286. (define-key compose-grave-map "a"    [agrave])
  287. (define-key compose-grave-map "e"    [egrave])
  288. (define-key compose-grave-map "i"    [igrave])
  289. (define-key compose-grave-map "o"    [ograve])
  290. (define-key compose-grave-map "u"    [ugrave])
  291.  
  292. (define-key compose-cedilla-map ","    [cedilla])
  293. (define-key compose-cedilla-map "C"    [Ccedilla])
  294. (define-key compose-cedilla-map "c"    [ccedilla])
  295.  
  296. (define-key compose-diaeresis-map " "    [diaeresis])
  297. (define-key compose-diaeresis-map "\""    [diaeresis])
  298. (define-key compose-diaeresis-map "A"    [Adiaeresis])
  299. (define-key compose-diaeresis-map "E"    [Ediaeresis])
  300. (define-key compose-diaeresis-map "I"    [Idiaeresis])
  301. (define-key compose-diaeresis-map "O"    [Odiaeresis])
  302. (define-key compose-diaeresis-map "U"    [Udiaeresis])
  303. (define-key compose-diaeresis-map "a"    [adiaeresis])
  304. (define-key compose-diaeresis-map "e"    [ediaeresis])
  305. (define-key compose-diaeresis-map "i"    [idiaeresis])
  306. (define-key compose-diaeresis-map "o"    [odiaeresis])
  307. (define-key compose-diaeresis-map "u"    [udiaeresis])
  308. (define-key compose-diaeresis-map "y"    [ydiaeresis])
  309.  
  310. (define-key compose-circumflex-map " "    "^")
  311. (define-key compose-circumflex-map "/"    "|")
  312. (define-key compose-circumflex-map "!"    [brokenbar])
  313. (define-key compose-circumflex-map "-"    [macron])
  314. (define-key compose-circumflex-map "_"    [macron])
  315. (define-key compose-circumflex-map "0"    [degree])
  316. (define-key compose-circumflex-map "1"    [onesuperior])
  317. (define-key compose-circumflex-map "2"    [twosuperior])
  318. (define-key compose-circumflex-map "3"    [threesuperior])
  319. (define-key compose-circumflex-map "."    [periodcentered])
  320. (define-key compose-circumflex-map "A"    [Acircumflex])
  321. (define-key compose-circumflex-map "E"    [Ecircumflex])
  322. (define-key compose-circumflex-map "I"    [Icircumflex])
  323. (define-key compose-circumflex-map "O"    [Ocircumflex])
  324. (define-key compose-circumflex-map "U"    [Ucircumflex])
  325. (define-key compose-circumflex-map "a"    [acircumflex])
  326. (define-key compose-circumflex-map "e"    [ecircumflex])
  327. (define-key compose-circumflex-map "i"    [icircumflex])
  328. (define-key compose-circumflex-map "o"    [ocircumflex])
  329. (define-key compose-circumflex-map "u"    [ucircumflex])
  330.  
  331. (define-key compose-tilde-map " "    "~")
  332. (define-key compose-tilde-map "A"    [Atilde])
  333. (define-key compose-tilde-map "N"    [Ntilde])
  334. (define-key compose-tilde-map "O"    [Otilde])
  335. (define-key compose-tilde-map "a"    [atilde])
  336. (define-key compose-tilde-map "n"    [ntilde])
  337. (define-key compose-tilde-map "o"    [otilde])
  338.  
  339. (define-key compose-ring-map " "    [degree])
  340. (define-key compose-ring-map "A"    [Aring])
  341. (define-key compose-ring-map "a"    [aring])
  342.  
  343.  
  344. ;;; The rest of the compose-map.  These are the composed characters
  345. ;;; that are not accessible via "dead" keys.
  346.  
  347. (define-key compose-map " '"    "'")
  348. (define-key compose-map " ^"    "^")
  349. (define-key compose-map " `"    "`")
  350. (define-key compose-map " ~"    "~")
  351. (define-key compose-map "  "    [nobreakspace])
  352. (define-key compose-map " \""    [diaeresis])
  353. (define-key compose-map " *"    [degree])
  354.  
  355. (define-key compose-map "!!"    [exclamdown])
  356. (define-key compose-map "!^"    [brokenbar])
  357. (define-key compose-map "!S"    [section])
  358. (define-key compose-map "!s"    [section])
  359. (define-key compose-map "!P"    [paragraph])
  360. (define-key compose-map "!p"    [paragraph])
  361.  
  362. (define-key compose-map "(("    "[")
  363. (define-key compose-map "(-"    "{")
  364.  
  365. (define-key compose-map "))"    "]")
  366. (define-key compose-map ")-"    "}")
  367.  
  368. (define-key compose-map "++"    "#")
  369. (define-key compose-map "+-"    [plusminus])
  370.  
  371. (define-key compose-map "-("    "{")
  372. (define-key compose-map "-)"    "}")
  373. (define-key compose-map "--"    "-")
  374. (define-key compose-map "-L"    [sterling])
  375. (define-key compose-map "-l"    [sterling])
  376. (define-key compose-map "-Y"    [yen])
  377. (define-key compose-map "-y"    [yen])
  378. (define-key compose-map "-,"    [notsign])
  379. (define-key compose-map "-|"    [notsign])
  380. (define-key compose-map "-^"    [macron])
  381. (define-key compose-map "-+"    [plusminus])
  382. (define-key compose-map "-:"    [division])
  383. (define-key compose-map "-D"    [ETH])
  384. (define-key compose-map "-d"    [eth])
  385. (define-key compose-map "-a"    [ordfeminine])
  386.  
  387. (define-key compose-map ".^"    [periodcentered])
  388.  
  389. (define-key compose-map "//"    "\\")
  390. (define-key compose-map "/<"    "\\")
  391. (define-key compose-map "/^"    "|")
  392. (define-key compose-map "/C"    [cent])
  393. (define-key compose-map "/c"    [cent])
  394. (define-key compose-map "/U"    [mu])
  395. (define-key compose-map "/u"    [mu])
  396. (define-key compose-map "/O"    [Ooblique])
  397. (define-key compose-map "/o"    [oslash])
  398.  
  399. (define-key compose-map "0X"    [currency])
  400. (define-key compose-map "0x"    [currency])
  401. (define-key compose-map "0S"    [section])
  402. (define-key compose-map "0s"    [section])
  403. (define-key compose-map "0C"    [copyright])
  404. (define-key compose-map "0c"    [copyright])
  405. (define-key compose-map "0R"    [registered])
  406. (define-key compose-map "0r"    [registered])
  407. (define-key compose-map "0^"    [degree])
  408.  
  409. (define-key compose-map "1^"    [onesuperior])
  410. (define-key compose-map "14"    [onequarter])
  411. (define-key compose-map "12"    [onehalf])
  412.  
  413. (define-key compose-map "2^"    [twosuperior])
  414.  
  415. (define-key compose-map "3^"    [threesuperior])
  416. (define-key compose-map "34"    [threequarters])
  417.  
  418. (define-key compose-map ":-"    [division])
  419.  
  420. (define-key compose-map "</"    "\\")
  421. (define-key compose-map "<<"    [guillemotleft])
  422.  
  423. (define-key compose-map "=L"    [sterling])
  424. (define-key compose-map "=l"    [sterling])
  425. (define-key compose-map "=Y"    [yen])
  426. (define-key compose-map "=y"    [yen])
  427.  
  428. (define-key compose-map ">>"    [guillemotright])
  429.  
  430. (define-key compose-map "??"    [questiondown])
  431.  
  432. (define-key compose-map "AA"    "@")
  433. (define-key compose-map "Aa"    "@")
  434. (define-key compose-map "A_"    [ordfeminine])
  435. (define-key compose-map "A`"    [Agrave])
  436. (define-key compose-map "A'"    [Aacute])
  437. (define-key compose-map "A^"    [Acircumflex])
  438. (define-key compose-map "A~"    [Atilde])
  439. (define-key compose-map "A\""    [Adiaeresis])
  440. (define-key compose-map "A*"    [Aring])
  441. (define-key compose-map "AE"    [AE])
  442.  
  443. (define-key compose-map "C/"    [cent])
  444. (define-key compose-map "C|"    [cent])
  445. (define-key compose-map "C0"    [copyright])
  446. (define-key compose-map "CO"    [copyright])
  447. (define-key compose-map "Co"    [copyright])
  448. (define-key compose-map "C,"    [Ccedilla])
  449.  
  450. (define-key compose-map "D-"    [ETH])
  451.  
  452. (define-key compose-map "E`"    [Egrave])
  453. (define-key compose-map "E'"    [Eacute])
  454. (define-key compose-map "E^"    [Ecircumflex])
  455. (define-key compose-map "E\""    [Ediaeresis])
  456.  
  457. (define-key compose-map "I`"    [Igrave])
  458. (define-key compose-map "I'"    [Iacute])
  459. (define-key compose-map "I^"    [Icircumflex])
  460. (define-key compose-map "I\""    [Idiaeresis])
  461.  
  462. (define-key compose-map "L-"    [sterling])
  463. (define-key compose-map "L="    [sterling])
  464.  
  465. (define-key compose-map "N~"    [Ntilde])
  466.  
  467. (define-key compose-map "OX"    [currency])
  468. (define-key compose-map "Ox"    [currency])
  469. (define-key compose-map "OS"    [section])
  470. (define-key compose-map "Os"    [section])
  471. (define-key compose-map "OC"    [copyright])
  472. (define-key compose-map "Oc"    [copyright])
  473. (define-key compose-map "OR"    [registered])
  474. (define-key compose-map "Or"    [registered])
  475. (define-key compose-map "O_"    [masculine])
  476. (define-key compose-map "O`"    [Ograve])
  477. (define-key compose-map "O'"    [Oacute])
  478. (define-key compose-map "O^"    [Ocircumflex])
  479. (define-key compose-map "O~"    [Otilde])
  480. (define-key compose-map "O\""    [Odiaeresis])
  481. (define-key compose-map "O/"    [Ooblique])
  482.  
  483. (define-key compose-map "P!"    [paragraph])
  484.  
  485. (define-key compose-map "R0"    [registered])
  486. (define-key compose-map "RO"    [registered])
  487. (define-key compose-map "Ro"    [registered])
  488.  
  489. (define-key compose-map "S!"    [section])
  490. (define-key compose-map "S0"    [section])
  491. (define-key compose-map "SO"    [section])
  492. (define-key compose-map "So"    [section])
  493. (define-key compose-map "SS"    [ssharp])
  494.  
  495. (define-key compose-map "TH"    [THORN])
  496.  
  497. (define-key compose-map "U`"    [Ugrave])
  498. (define-key compose-map "U'"    [Uacute])
  499. (define-key compose-map "U^"    [Ucircumflex])
  500. (define-key compose-map "U\""    [Udiaeresis])
  501.  
  502. (define-key compose-map "X0"    [currency])
  503. (define-key compose-map "XO"    [currency])
  504. (define-key compose-map "Xo"    [currency])
  505.  
  506. (define-key compose-map "Y-"    [yen])
  507. (define-key compose-map "Y="    [yen])
  508. (define-key compose-map "Y'"    [Yacute])
  509.  
  510. (define-key compose-map "_A"    [ordfeminine])
  511. (define-key compose-map "_a"    [ordfeminine])
  512. (define-key compose-map "_^"    [macron])
  513. (define-key compose-map "_O"    [masculine])
  514. (define-key compose-map "_o"    [masculine])
  515.  
  516. (define-key compose-map "aA"    "@")
  517. (define-key compose-map "aa"    "@")
  518. (define-key compose-map "a_"    [ordfeminine])
  519. (define-key compose-map "a-"    [ordfeminine])
  520. (define-key compose-map "a`"    [agrave])
  521. (define-key compose-map "a'"    [aacute])
  522. (define-key compose-map "a^"    [acircumflex])
  523. (define-key compose-map "a~"    [atilde])
  524. (define-key compose-map "a\""    [adiaeresis])
  525. (define-key compose-map "a*"    [aring])
  526. (define-key compose-map "ae"    [ae])
  527.  
  528. (define-key compose-map "c/"    [cent])
  529. (define-key compose-map "c|"    [cent])
  530. (define-key compose-map "c0"    [copyright])
  531. (define-key compose-map "cO"    [copyright])
  532. (define-key compose-map "co"    [copyright])
  533. (define-key compose-map "c,"    [ccedilla])
  534.  
  535. (define-key compose-map "d-"    [eth])
  536.  
  537. (define-key compose-map "e`"    [egrave])
  538. (define-key compose-map "e'"    [eacute])
  539. (define-key compose-map "e^"    [ecircumflex])
  540. (define-key compose-map "e\""    [ediaeresis])
  541.  
  542. (define-key compose-map "i`"    [igrave])
  543. (define-key compose-map "i'"    [iacute])
  544. (define-key compose-map "i^"    [icircumflex])
  545. (define-key compose-map "i\""    [idiaeresis])
  546.  
  547. (define-key compose-map "l-"    [sterling])
  548. (define-key compose-map "l="    [sterling])
  549.  
  550. (define-key compose-map "n~"    [ntilde])
  551.  
  552. (define-key compose-map "oX"    [currency])
  553. (define-key compose-map "ox"    [currency])
  554. (define-key compose-map "oC"    [copyright])
  555. (define-key compose-map "oc"    [copyright])
  556. (define-key compose-map "oR"    [registered])
  557. (define-key compose-map "or"    [registered])
  558. (define-key compose-map "oS"    [section])
  559. (define-key compose-map "os"    [section])
  560. (define-key compose-map "o_"    [masculine])
  561. (define-key compose-map "o`"    [ograve])
  562. (define-key compose-map "o'"    [oacute])
  563. (define-key compose-map "o^"    [ocircumflex])
  564. (define-key compose-map "o~"    [otilde])
  565. (define-key compose-map "o\""    [odiaeresis])
  566. (define-key compose-map "o/"    [oslash])
  567.  
  568. (define-key compose-map "p!"    [paragraph])
  569.  
  570. (define-key compose-map "r0"    [registered])
  571. (define-key compose-map "rO"    [registered])
  572. (define-key compose-map "ro"    [registered])
  573.  
  574. (define-key compose-map "s!"    [section])
  575. (define-key compose-map "s0"    [section])
  576. (define-key compose-map "sO"    [section])
  577. (define-key compose-map "so"    [section])
  578. (define-key compose-map "ss"    [ssharp])
  579.  
  580. (define-key compose-map "th"    [thorn])
  581.  
  582. (define-key compose-map "u`"    [ugrave])
  583. (define-key compose-map "u'"    [uacute])
  584. (define-key compose-map "u^"    [ucircumflex])
  585. (define-key compose-map "u\""    [udiaeresis])
  586. (define-key compose-map "u/"    [mu])
  587.  
  588. (define-key compose-map "x0"    [currency])
  589. (define-key compose-map "xO"    [currency])
  590. (define-key compose-map "xo"    [currency])
  591. (define-key compose-map "xx"    [multiply])
  592.  
  593. (define-key compose-map "y-"    [yen])
  594. (define-key compose-map "y="    [yen])
  595. (define-key compose-map "y'"    [yacute])
  596. (define-key compose-map "y\""    [ydiaeresis])
  597.  
  598. (define-key compose-map "|C"    [cent])
  599. (define-key compose-map "|c"    [cent])
  600. (define-key compose-map "||"    [brokenbar])
  601.  
  602.  
  603. ;;; Providing help in the middle of a compose sequence.  (Way cool.)
  604.  
  605. (defun compose-help ()
  606.   (interactive)
  607.   (let* ((keys (apply 'vector
  608.               (nreverse
  609.                (cdr (nreverse (append (this-command-keys) nil))))))
  610.      (map (or (key-binding keys)
  611.           (error (format "can't find map?  %s" (this-command-keys)))))
  612.      (event (allocate-event))
  613.      old-ctl-arrow)
  614.     (with-output-to-temp-buffer "*Help*"
  615.       (set-buffer "*Help*")
  616.       (erase-buffer)
  617.       (message "Working...")
  618.       (setq ctl-arrow 'compose) ; non-t-non-nil
  619.       (insert "You are typing a compose sequence.  So far you have typed: ")
  620.       (insert (key-description keys))
  621.       (insert "\nCompletions from here are:\n\n")
  622.       (map-keymap 'compose-help-mapper map t)
  623.       (message "? "))
  624.     (while (keymapp
  625.         (setq map (lookup-key map (vector (next-command-event event))))))
  626.     (if map
  627.     (command-execute map)
  628.       (setq unread-command-event event))))
  629.  
  630. (put 'compose-help 'isearch-command t)    ; so that it doesn't terminate isearch
  631.  
  632. (defun compose-help-mapper (key binding)
  633.   (if (and (symbolp key)
  634.        (get key character-set-property))
  635.       (setq key (get key character-set-property)))
  636.   (if (eq binding 'compose-help) ; suppress that...
  637.       nil
  638.     (if (keymapp binding)
  639.     (let ((p (point)))
  640.       (map-keymap 'compose-help-mapper binding t)
  641.       (goto-char p)
  642.       (while (not (eobp))
  643.         (if (numberp key)
  644.         (insert (make-string 1 key))
  645.           (insert (single-key-description key)))
  646.         (insert " ")
  647.         (forward-line 1)))
  648.       (if (numberp key)
  649.       (insert (make-string 1 key))
  650.     (insert (single-key-description key)))
  651.       (indent-to 16)
  652.       (let ((code (and (vectorp binding)
  653.                (= 1 (length binding))
  654.                (get (aref binding 0) character-set-property))))
  655.     (if code
  656.         (insert (make-string 1 code))
  657.       (if (stringp binding)
  658.           (insert binding)
  659.         (insert (prin1-to-string binding)))))
  660.       (if (and (vectorp binding) (= 1 (length binding)))
  661.       (progn
  662.         (indent-to 32)
  663.         (insert (symbol-name (aref binding 0))))))
  664.     (insert "\n")))
  665.  
  666. ;; define it at top-level in the compose map...
  667. (define-key compose-map '(control h) 'compose-help)
  668. (define-key compose-map 'help 'compose-help)
  669. ;; and then define it in each sub-map of the compose map.
  670. (map-keymap
  671.  (function (lambda (key binding)
  672.          (if (keymapp binding)
  673.          (progn
  674.            (define-key binding '(control h) 'compose-help)
  675.            (define-key binding 'help 'compose-help)))))
  676.  compose-map nil)
  677.  
  678. ;; Make display display the accented letters
  679. (if (memq (default-value 'ctl-arrow) '(t nil))
  680.     (setq-default ctl-arrow 'iso-8859/1))
  681.  
  682.  
  683. (provide 'x-compose)
  684.