1993-09-14 16:51:54 +00:00
|
|
|
|
;;; iso-acc.el -- minor mode providing electric accent keys
|
1994-05-03 23:47:06 +00:00
|
|
|
|
;;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
|
1993-09-14 16:51:54 +00:00
|
|
|
|
|
|
|
|
|
;; Author: Johan Vromans <jv@mh.nl>
|
1993-11-16 06:33:45 +00:00
|
|
|
|
;; Version: 1.7 (modified)
|
1993-11-07 10:28:22 +00:00
|
|
|
|
;; Maintainer: FSF
|
|
|
|
|
;; Keywords: i18n
|
1993-09-14 16:51:54 +00:00
|
|
|
|
|
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
|
|
|
|
|
;; GNU Emacs is free software; you can redistribute it and/or modify
|
|
|
|
|
;; it under the terms of the GNU General Public License as published by
|
|
|
|
|
;; the Free Software Foundation; either version 2, or (at your option)
|
|
|
|
|
;; any later version.
|
|
|
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
|
|
|
|
;; along with GNU Emacs; see the file COPYING. If not, write to
|
|
|
|
|
;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
1994-10-28 19:03:03 +00:00
|
|
|
|
;; Function `iso-accents-mode' activates a minor mode in which
|
|
|
|
|
;; typewriter "dead keys" are emulated. The purpose of this emulation
|
|
|
|
|
;; is to provide a simple means for inserting accented characters
|
|
|
|
|
;; according to the ISO-8859-1 character set.
|
1993-09-14 16:51:54 +00:00
|
|
|
|
;;
|
1994-10-28 19:03:03 +00:00
|
|
|
|
;; In `iso-accents-mode', pseudo accent characters are used to
|
1995-01-30 22:46:37 +00:00
|
|
|
|
;; introduce accented keys. The pseudo-accent characters are:
|
1993-09-14 16:51:54 +00:00
|
|
|
|
;;
|
|
|
|
|
;; ' (minute) -> grave accent
|
|
|
|
|
;; ` (backtick) -> acute accent
|
|
|
|
|
;; " (second) -> diaeresis
|
1993-11-07 10:28:22 +00:00
|
|
|
|
;; ^ (caret) -> circumflex
|
|
|
|
|
;; ~ (tilde) -> tilde over the character
|
|
|
|
|
;; / (slash) -> slash through the character.
|
1993-11-16 06:33:45 +00:00
|
|
|
|
;; Also: /A is A-with-ring and /E is AE ligature.
|
1993-09-14 16:51:54 +00:00
|
|
|
|
;;
|
|
|
|
|
;; The action taken depends on the key that follows the pseudo accent.
|
|
|
|
|
;; In general:
|
|
|
|
|
;;
|
|
|
|
|
;; pseudo-accent + appropriate letter -> accented letter
|
|
|
|
|
;; pseudo-accent + space -> pseudo-accent
|
|
|
|
|
;; pseudo-accent + pseudo-accent -> accent (if available)
|
|
|
|
|
;; pseudo-accent + other -> pseudo-accent + other
|
|
|
|
|
;;
|
|
|
|
|
;; If the pseudo-accent is followed by anything else than a
|
|
|
|
|
;; self-insert-command, the dead-key code is terminated, the
|
|
|
|
|
;; pseudo-accent inserted 'as is' and the bell is rung to signal this.
|
|
|
|
|
;;
|
1993-09-14 18:20:59 +00:00
|
|
|
|
;; Function `iso-accents-mode' can be used to enable the iso accents
|
|
|
|
|
;; minor mode, or disable it.
|
1993-11-21 22:54:37 +00:00
|
|
|
|
|
|
|
|
|
;; If you want only some of these characters to serve as accents,
|
|
|
|
|
;; set iso-accents-enable to the list of characters that should be special.
|
1993-09-14 16:51:54 +00:00
|
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
|
|
(provide 'iso-acc)
|
|
|
|
|
|
|
|
|
|
(defvar iso-accents-list
|
|
|
|
|
'(((?' ?A) ?\301)
|
|
|
|
|
((?' ?E) ?\311)
|
|
|
|
|
((?' ?I) ?\315)
|
|
|
|
|
((?' ?O) ?\323)
|
|
|
|
|
((?' ?U) ?\332)
|
1993-11-07 10:28:22 +00:00
|
|
|
|
((?' ?Y) ?\335)
|
1993-09-14 16:51:54 +00:00
|
|
|
|
((?' ?a) ?\341)
|
|
|
|
|
((?' ?e) ?\351)
|
|
|
|
|
((?' ?i) ?\355)
|
|
|
|
|
((?' ?o) ?\363)
|
|
|
|
|
((?' ?u) ?\372)
|
1993-11-18 05:25:21 +00:00
|
|
|
|
((?' ?y) ?\375)
|
1993-09-14 16:51:54 +00:00
|
|
|
|
((?' ?') ?\264)
|
|
|
|
|
((?' ? ) ?')
|
|
|
|
|
((?` ?A) ?\300)
|
|
|
|
|
((?` ?E) ?\310)
|
|
|
|
|
((?` ?I) ?\314)
|
|
|
|
|
((?` ?O) ?\322)
|
|
|
|
|
((?` ?U) ?\331)
|
|
|
|
|
((?` ?a) ?\340)
|
|
|
|
|
((?` ?e) ?\350)
|
|
|
|
|
((?` ?i) ?\354)
|
|
|
|
|
((?` ?o) ?\362)
|
|
|
|
|
((?` ?u) ?\371)
|
|
|
|
|
((?` ? ) ?`)
|
|
|
|
|
((?` ?`) ?`) ; no special code?
|
1993-11-07 10:37:57 +00:00
|
|
|
|
((?^ ?A) ?\302)
|
1993-09-14 16:51:54 +00:00
|
|
|
|
((?^ ?E) ?\312)
|
|
|
|
|
((?^ ?I) ?\316)
|
|
|
|
|
((?^ ?O) ?\324)
|
|
|
|
|
((?^ ?U) ?\333)
|
|
|
|
|
((?^ ?a) ?\342)
|
|
|
|
|
((?^ ?e) ?\352)
|
|
|
|
|
((?^ ?i) ?\356)
|
|
|
|
|
((?^ ?o) ?\364)
|
|
|
|
|
((?^ ?u) ?\373)
|
|
|
|
|
((?^ ? ) ?^)
|
|
|
|
|
((?^ ?^) ?^) ; no special code?
|
|
|
|
|
((?\" ?A) ?\304)
|
|
|
|
|
((?\" ?E) ?\313)
|
|
|
|
|
((?\" ?I) ?\317)
|
|
|
|
|
((?\" ?O) ?\326)
|
|
|
|
|
((?\" ?U) ?\334)
|
|
|
|
|
((?\" ?a) ?\344)
|
|
|
|
|
((?\" ?e) ?\353)
|
|
|
|
|
((?\" ?i) ?\357)
|
|
|
|
|
((?\" ?o) ?\366)
|
1993-11-18 05:45:07 +00:00
|
|
|
|
((?\" ?s) ?\337)
|
1993-09-14 16:51:54 +00:00
|
|
|
|
((?\" ?u) ?\374)
|
1993-11-07 10:28:22 +00:00
|
|
|
|
((?\" ?y) ?\377)
|
1993-09-14 16:51:54 +00:00
|
|
|
|
((?\" ? ) ?\")
|
|
|
|
|
((?\" ?\") ?\250)
|
1993-11-07 10:28:22 +00:00
|
|
|
|
((?\~ ?A) ?\303)
|
|
|
|
|
((?\~ ?C) ?\307)
|
|
|
|
|
((?\~ ?D) ?\320)
|
|
|
|
|
((?\~ ?N) ?\321)
|
|
|
|
|
((?\~ ?O) ?\325)
|
1995-01-30 22:46:37 +00:00
|
|
|
|
((?\~ ?T) ?\336)
|
1993-11-07 10:28:22 +00:00
|
|
|
|
((?\~ ?a) ?\343)
|
1993-11-18 05:25:21 +00:00
|
|
|
|
((?\~ ?c) ?\347)
|
1993-11-07 10:28:22 +00:00
|
|
|
|
((?\~ ?d) ?\360)
|
|
|
|
|
((?\~ ?n) ?\361)
|
|
|
|
|
((?\~ ?o) ?\365)
|
1995-01-30 22:46:37 +00:00
|
|
|
|
((?\~ ?t) ?\376)
|
1993-11-07 10:37:57 +00:00
|
|
|
|
((?\~ ?>) ?\273)
|
|
|
|
|
((?\~ ?<) ?\253)
|
1995-04-24 15:02:12 +00:00
|
|
|
|
((?\~ ?!) ?\241) ;; Inverted exclamation mark
|
|
|
|
|
((?\~ ??) ?\277) ;; Inverted question mark
|
1994-03-19 04:32:52 +00:00
|
|
|
|
((?\~ ?\ ) ?\~)
|
|
|
|
|
((?\~ ?\~) ?\270) ;; cedilla accent
|
1993-11-16 06:33:45 +00:00
|
|
|
|
((?\/ ?A) ?\305) ;; A-with-ring (Norwegian and Danish)
|
|
|
|
|
((?\/ ?E) ?\306) ;; AE-ligature (Norwegian and Danish)
|
1993-11-07 10:28:22 +00:00
|
|
|
|
((?\/ ?O) ?\330)
|
1993-11-16 06:33:45 +00:00
|
|
|
|
((?\/ ?a) ?\345) ;; a-with-ring (Norwegian and Danish)
|
|
|
|
|
((?\/ ?e) ?\346) ;; ae-ligature (Norwegian and Danish)
|
1993-11-07 10:28:22 +00:00
|
|
|
|
((?\/ ?o) ?\370)
|
1994-03-19 04:32:52 +00:00
|
|
|
|
((?\/ ?\ ) ?\/)
|
|
|
|
|
((?\/ ?\/) ?\260) ;; ring accent (actually degree sign?)
|
1993-09-14 16:51:54 +00:00
|
|
|
|
)
|
1993-09-14 18:20:59 +00:00
|
|
|
|
"Association list for ISO accent combinations.")
|
1993-09-14 16:51:54 +00:00
|
|
|
|
|
1994-10-28 19:03:03 +00:00
|
|
|
|
(defvar iso-accents-mode nil
|
1993-11-07 21:23:36 +00:00
|
|
|
|
"*Non-nil enables ISO Accents mode.
|
1993-09-17 16:49:28 +00:00
|
|
|
|
Setting this variable makes it local to the current buffer.
|
1994-10-28 19:03:03 +00:00
|
|
|
|
See function `iso-accents-mode'.")
|
|
|
|
|
(make-variable-buffer-local 'iso-accents-mode)
|
1993-09-14 16:51:54 +00:00
|
|
|
|
|
1993-10-24 23:21:21 +00:00
|
|
|
|
(defun iso-accents-accent-key (prompt)
|
|
|
|
|
"Modify the following character by adding an accent to it."
|
|
|
|
|
;; Pick up the accent character.
|
1994-10-28 19:03:03 +00:00
|
|
|
|
(if iso-accents-mode
|
1993-10-24 23:21:21 +00:00
|
|
|
|
(iso-accents-compose prompt)
|
|
|
|
|
(char-to-string last-input-char)))
|
1993-09-17 16:49:28 +00:00
|
|
|
|
|
1993-10-24 23:21:21 +00:00
|
|
|
|
(defun iso-accents-compose-key (prompt)
|
|
|
|
|
"Modify the following character by adding an accent to it."
|
|
|
|
|
;; Pick up the accent character.
|
|
|
|
|
(let ((combined (iso-accents-compose prompt)))
|
|
|
|
|
(if unread-command-events
|
|
|
|
|
(let ((unread unread-command-events))
|
|
|
|
|
(setq unread-command-events nil)
|
|
|
|
|
(error "Characters %s and %s cannot be composed"
|
|
|
|
|
(single-key-description (aref combined 0))
|
|
|
|
|
(single-key-description (car unread)))))
|
|
|
|
|
combined))
|
|
|
|
|
|
|
|
|
|
(defun iso-accents-compose (prompt)
|
|
|
|
|
(let* ((first-char last-input-char)
|
|
|
|
|
;; Wait for the second key and look up the combination.
|
|
|
|
|
(second-char (if (or prompt
|
|
|
|
|
(not (eq (key-binding "a")
|
|
|
|
|
'self-insert-command)))
|
|
|
|
|
(progn
|
|
|
|
|
(message "%s%c"
|
|
|
|
|
(or prompt "Compose with ")
|
|
|
|
|
first-char)
|
|
|
|
|
(read-event))
|
|
|
|
|
(insert first-char)
|
|
|
|
|
(prog1 (read-event)
|
|
|
|
|
(delete-region (1- (point)) (point)))))
|
|
|
|
|
(entry (assoc (list first-char second-char) iso-accents-list)))
|
|
|
|
|
(if entry
|
|
|
|
|
;; Found it: delete the first character and insert the combination.
|
|
|
|
|
(concat (list (nth 1 entry)))
|
|
|
|
|
;; Otherwise, advance and schedule the second key for execution.
|
|
|
|
|
(setq unread-command-events (list second-char))
|
|
|
|
|
(vector first-char))))
|
|
|
|
|
|
1993-11-21 22:54:37 +00:00
|
|
|
|
(defvar iso-accents-enable '(?' ?` ?^ ?\" ?~ ?/)
|
|
|
|
|
"*List of accent keys that become prefixes in ISO Accents mode.
|
|
|
|
|
The default is (?' ?` ?^ ?\" ?~ ?/), which contains all the supported
|
|
|
|
|
accent keys. For certain languages, you might want to remove some of
|
|
|
|
|
those characters that are not actually used.")
|
|
|
|
|
|
1993-10-24 23:21:21 +00:00
|
|
|
|
(or key-translation-map (setq key-translation-map (make-sparse-keymap)))
|
|
|
|
|
;; For sequences starting with an accent character,
|
1994-10-28 19:03:03 +00:00
|
|
|
|
;; use a function that tests iso-accents-mode.
|
1993-11-21 22:54:37 +00:00
|
|
|
|
(if (memq ?' iso-accents-enable)
|
|
|
|
|
(define-key key-translation-map "'" 'iso-accents-accent-key))
|
|
|
|
|
(if (memq ?` iso-accents-enable)
|
|
|
|
|
(define-key key-translation-map "`" 'iso-accents-accent-key))
|
|
|
|
|
(if (memq ?^ iso-accents-enable)
|
|
|
|
|
(define-key key-translation-map "^" 'iso-accents-accent-key))
|
|
|
|
|
(if (memq ?\" iso-accents-enable)
|
|
|
|
|
(define-key key-translation-map "\"" 'iso-accents-accent-key))
|
|
|
|
|
(if (memq ?~ iso-accents-enable)
|
|
|
|
|
(define-key key-translation-map "~" 'iso-accents-accent-key))
|
|
|
|
|
(if (memq ?/ iso-accents-enable)
|
|
|
|
|
(define-key key-translation-map "/" 'iso-accents-accent-key))
|
1993-09-17 16:49:28 +00:00
|
|
|
|
|
1993-09-14 16:51:54 +00:00
|
|
|
|
;; It is a matter of taste if you want the minor mode indicated
|
|
|
|
|
;; in the mode line...
|
1993-09-17 16:49:28 +00:00
|
|
|
|
;; If so, uncomment the next four lines.
|
1994-10-28 19:03:03 +00:00
|
|
|
|
;; (or (assq 'iso-accents-mode minor-mode-map-alist)
|
1993-09-14 16:51:54 +00:00
|
|
|
|
;; (setq minor-mode-alist
|
|
|
|
|
;; (append minor-mode-alist
|
1994-10-28 19:03:03 +00:00
|
|
|
|
;; '((iso-accents-mode " ISO-Acc")))))
|
1993-09-14 16:51:54 +00:00
|
|
|
|
|
|
|
|
|
;;;###autoload
|
1993-09-14 18:20:59 +00:00
|
|
|
|
(defun iso-accents-mode (&optional arg)
|
1993-11-07 21:23:36 +00:00
|
|
|
|
"Toggle ISO Accents mode, in which accents modify the following letter.
|
1993-09-14 18:20:59 +00:00
|
|
|
|
This permits easy insertion of accented characters according to ISO-8859-1.
|
|
|
|
|
When Iso-accents mode is enabled, accent character keys
|
1993-11-07 10:28:22 +00:00
|
|
|
|
\(`, ', \", ^, / and ~) do not self-insert; instead, they modify the following
|
1993-09-14 18:20:59 +00:00
|
|
|
|
letter key so that it inserts an ISO accented letter.
|
|
|
|
|
|
1993-11-21 22:54:37 +00:00
|
|
|
|
The variable `iso-accents-enable' specifies the list of characters to
|
|
|
|
|
enable as accents. If you don't need all of them, remove the ones you
|
|
|
|
|
don't need from that list.
|
|
|
|
|
|
1993-11-07 10:28:22 +00:00
|
|
|
|
Special combinations: ~c gives a c with cedilla,
|
1995-01-30 22:46:37 +00:00
|
|
|
|
~d gives an Icelandic eth (d with dash).
|
|
|
|
|
~t gives an Icelandic thorn.
|
1993-11-18 05:45:07 +00:00
|
|
|
|
\"s gives German sharp s.
|
|
|
|
|
/a gives a with ring.
|
|
|
|
|
/e gives an a-e ligature.
|
1993-11-07 10:37:57 +00:00
|
|
|
|
~< and ~> give guillemets.
|
1993-11-07 10:28:22 +00:00
|
|
|
|
|
1993-11-21 22:54:37 +00:00
|
|
|
|
With an argument, a positive argument enables ISO Accents mode,
|
1993-09-14 18:20:59 +00:00
|
|
|
|
and a negative argument disables it."
|
1993-09-14 16:51:54 +00:00
|
|
|
|
|
|
|
|
|
(interactive "P")
|
|
|
|
|
|
1993-09-14 18:20:59 +00:00
|
|
|
|
(if (if arg
|
|
|
|
|
;; Negative arg means switch it off.
|
|
|
|
|
(<= (prefix-numeric-value arg) 0)
|
|
|
|
|
;; No arg means toggle.
|
1994-10-28 19:03:03 +00:00
|
|
|
|
iso-accents-mode)
|
|
|
|
|
(setq iso-accents-mode nil)
|
1993-09-14 16:51:54 +00:00
|
|
|
|
|
|
|
|
|
;; Enable electric accents.
|
1994-10-28 19:03:03 +00:00
|
|
|
|
(setq iso-accents-mode t)))
|
1993-09-14 16:51:54 +00:00
|
|
|
|
|
|
|
|
|
;;; iso-acc.el ends here
|