(defvar iso-transl-dead-key-alist
'((?\' . mute-acute)
(?\` . mute-grave)
(?\" . mute-diaeresis)
(?^ . mute-asciicircum)
(?\~ . mute-asciitilde)
(?\' . dead-acute)
(?\` . dead-grave)
(?\" . dead-diaeresis)
(?^ . dead-asciicircum)
(?\~ . dead-asciitilde)
(?^ . dead-circum)
(?^ . dead-circumflex)
(?\~ . dead-tilde)
;; Someone reports that these keys don't work if shifted.
;; This might fix it--no word yet.
(?\' . S-dead-acute)
(?\` . S-dead-grave)
(?\" . S-dead-diaeresis)
(?^ . S-dead-asciicircum)
(?\~ . S-dead-asciitilde)
(?^ . S-dead-circum)
(?^ . S-dead-circumflex)
(?\~ . S-dead-tilde))
"Mapping of ASCII characters to their corresponding dead-key symbols.")
;; The two-character mnemonics are intended to be available in all languages.
;; The ones beginning with `*' have one-character synonyms, but a
;; language-specific table might override the short form for its own use.
(defvar iso-transl-char-map
'(("* " . [? ])
(" " . [? ])
("*!" . [?¡])
("!" . [?¡])
("\"\"" . [?¨])
("\"A" . [?Ä])
("\"E" . [?Ë])
("\"I" . [?Ï])
("\"O" . [?Ö])
("\"U" . [?Ü])
("\"a" . [?ä])
("\"e" . [?ë])
("\"i" . [?ï])
("\"o" . [?ö])
("\"s" . [?ß])
("\"u" . [?ü])
("\"y" . [?ÿ])
("''" . [?´])
("'A" . [?Á])
("'E" . [?É])
("'I" . [?Í])
("'O" . [?Ó])
("'U" . [?Ú])
("'Y" . [?Ý])
("'a" . [?á])
("'e" . [?é])
("'i" . [?í])
("'o" . [?ó])
("'u" . [?ú])
("'y" . [?ý])
("*$" . [?¤])
("$" . [?¤])
("*+" . [?±])
("+" . [?±])
(",," . [?¸])
(",C" . [?Ç])
(",c" . [?ç])
("*-" . [?])
("-" . [?])
("*." . [?·])
("." . [?·])
("//" . [?÷])
("/A" . [?Å])
("/E" . [?Æ])
("/O" . [?Ø])
("/a" . [?å])
("/e" . [?æ])
("/o" . [?ø])
("1/2" . [?½])
("1/4" . [?¼])
("3/4" . [?¾])
("*<" . [?«])
("<" . [?«])
("*=" . [?¯])
("=" . [?¯])
("*>" . [?»])
(">" . [?»])
("*?" . [?¿])
("?" . [?¿])
("*C" . [?©])
("C" . [?©])
("*L" . [?£])
("L" . [?£])
("*P" . [?¶])
("P" . [?¶])
("*R" . [?®])
("R" . [?®])
("*S" . [?§])
("S" . [?§])
("*Y" . [?¥])
("Y" . [?¥])
("^1" . [?¹])
("^2" . [?²])
("^3" . [?³])
("^A" . [?Â])
("^E" . [?Ê])
("^I" . [?Î])
("^O" . [?Ô])
("^U" . [?Û])
("^a" . [?â])
("^e" . [?ê])
("^i" . [?î])
("^o" . [?ô])
("^u" . [?û])
("_a" . [?ª])
("_o" . [?º])
("`A" . [?À])
("`E" . [?È])
("`I" . [?Ì])
("`O" . [?Ò])
("`U" . [?Ù])
("`a" . [?à])
("`e" . [?è])
("`i" . [?ì])
("`o" . [?ò])
("`u" . [?ù])
("*c" . [?¢])
("c" . [?¢])
("*o" . [?°])
("o" . [?°])
("*u" . [?µ])
("u" . [?µ])
("*m" . [?µ])
("m" . [?µ])
("*x" . [?×])
("x" . [?×])
("*|" . [?¦])
("|" . [?¦])
("~A" . [?Ã])
("~D" . [?Ð])
("~N" . [?Ñ])
("~O" . [?Õ])
("~T" . [?Þ])
("~a" . [?ã])
("~d" . [?ð])
("~n" . [?ñ])
("~o" . [?õ])
("~t" . [?þ])
("~~" . [?¬])
("' " . "'")
("` " . "`")
("\" " . "\"")
("^ " . "^")
("~ " . "~"))
"Alist of character translations for entering ISO characters.
Each element has the form (STRING . VECTOR).
The sequence STRING of ASCII chars translates into the
sequence VECTOR. (VECTOR is normally one character long.)")
(defvar iso-transl-language-alist
'(("Esperanto"
("C" . [?Æ])
("G" . [?Ø])
("H" . [?¦])
("J" . [?¬])
("S" . [?Þ])
("U" . [?Ý])
("c" . [?æ])
("g" . [?ø])
("h" . [?¶])
("j" . [?¼])
("s" . [?þ])
("u" . [?ý]))
("French"
("C" . [?Ç])
("c" . [?ç]))
("German"
("A" . [?Ä])
("O" . [?Ö])
("U" . [?Ü])
("a" . [?ä])
("o" . [?ö])
("s" . [?ß])
("u" . [?ü]))
("Portuguese"
("C" . [?Ç])
("c" . [?ç]))
("Spanish"
("!" . [?¡])
("?" . [?¿])
("N" . [?Ñ])
("n" . [?ñ]))))
(defvar iso-transl-ctl-x-8-map nil
"Keymap for C-x 8 prefix.")
(or iso-transl-ctl-x-8-map
(fset 'iso-transl-ctl-x-8-map
(setq iso-transl-ctl-x-8-map (make-sparse-keymap))))
(or key-translation-map
(setq key-translation-map (make-sparse-keymap)))
(define-key key-translation-map "\C-x8" iso-transl-ctl-x-8-map)
(defun iso-transl-define-keys (alist)
(while alist
(let ((translated-vec (cdr (car alist))))
(define-key iso-transl-ctl-x-8-map (car (car alist)) translated-vec)
(let ((inchar (aref (car (car alist)) 0))
(vec (vconcat (car (car alist))))
(tail iso-transl-dead-key-alist))
(aset vec 0 (logior (aref vec 0) ?\A-\^@))
(define-key key-translation-map vec translated-vec)
(define-key isearch-mode-map (vector (aref vec 0)) nil)
(while tail
(if (eq (car (car tail)) inchar)
(let ((deadvec (copy-sequence vec))
(deadkey (cdr (car tail))))
(aset deadvec 0 deadkey)
(define-key isearch-mode-map (vector deadkey) nil)
(define-key key-translation-map deadvec translated-vec)))
(setq tail (cdr tail)))))
(setq alist (cdr alist))))
(defun iso-transl-set-language (lang)
(interactive (list (let ((completion-ignore-case t))
(completing-read "Set which language? "
iso-transl-language-alist nil t))))
(iso-transl-define-keys (cdr (assoc lang iso-transl-language-alist))))
(iso-transl-define-keys iso-transl-char-map)
(define-key isearch-mode-map "\C-x" nil)
(define-key isearch-mode-map [?\C-x t] 'isearch-other-control-char)
(define-key isearch-mode-map "\C-x8" nil)
(provide 'iso-transl)