summaryrefslogtreecommitdiff
path: root/lisp/international
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1993-09-14 16:51:54 +0000
committerRichard M. Stallman <rms@gnu.org>1993-09-14 16:51:54 +0000
commitbf4de26a0372ae78c53a9a405f298844b9b40ad9 (patch)
treeeadd4fc5de1ba330fe25ed07672943747b61b278 /lisp/international
parentedb0cf8d8d015b1a07f33e64e10706068c9b0162 (diff)
downloademacs-bf4de26a0372ae78c53a9a405f298844b9b40ad9.tar.gz
Initial revision
Diffstat (limited to 'lisp/international')
-rw-r--r--lisp/international/iso-acc.el192
1 files changed, 192 insertions, 0 deletions
diff --git a/lisp/international/iso-acc.el b/lisp/international/iso-acc.el
new file mode 100644
index 00000000000..26d55ab1e30
--- /dev/null
+++ b/lisp/international/iso-acc.el
@@ -0,0 +1,192 @@
+;;; iso-acc.el -- minor mode providing electric accent keys
+;;; Copyright (C) 1993 Free Software Foundation, Inc.
+
+;; Author: Johan Vromans <jv@mh.nl>
+;; Version: 1.4
+
+;; 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:
+
+;; Function `iso-accents' activates a minor mode (`iso-accents-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.
+;;
+;; In `iso-accents-minor-mode', pseudo accent characters are used to
+;; introduce accented keys. The pseudo-accent characterss are:
+;;
+;; ' (minute) -> grave accent
+;; ` (backtick) -> acute accent
+;; " (second) -> diaeresis
+;; ^ (caret) -> circonflexe
+;;
+;; 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.
+;;
+;; Function `iso-accents' can be used to enable the iso accents
+;; minor mode, or disable it when called with a non-null argument.
+
+;;; Code:
+
+(provide 'iso-acc)
+
+(defvar iso-accents-list
+ '(((?' ?A) ?\301)
+ ((?' ?E) ?\311)
+ ((?' ?I) ?\315)
+ ((?' ?O) ?\323)
+ ((?' ?U) ?\332)
+ ((?' ?a) ?\341)
+ ((?' ?e) ?\351)
+ ((?' ?i) ?\355)
+ ((?' ?o) ?\363)
+ ((?' ?u) ?\372)
+ ((?' ?') ?\264)
+ ((?' ? ) ?')
+ ((?` ?A) ?\300)
+ ((?` ?E) ?\310)
+ ((?` ?I) ?\314)
+ ((?` ?O) ?\322)
+ ((?` ?U) ?\331)
+ ((?` ?a) ?\340)
+ ((?` ?e) ?\350)
+ ((?` ?i) ?\354)
+ ((?` ?o) ?\362)
+ ((?` ?u) ?\371)
+ ((?` ? ) ?`)
+ ((?` ?`) ?`) ; no special code?
+ ((?` ?A) ?\302)
+ ((?^ ?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)
+ ((?\" ?u) ?\374)
+ ((?\" ? ) ?\")
+ ((?\" ?\") ?\250)
+ )
+ "Association list for iso accent combinations.")
+
+(defun iso-accents-dead-key ()
+ "Emulate typewriter dead keys."
+ (interactive)
+
+ ;; Pick up the dead-key.
+ (let ((first-char last-command-char))
+
+ ;; Display it and backup.
+ (insert first-char)
+ (backward-char 1)
+
+ ;; Wait for the second key and look up the combination in the list.
+ (let* ((second-char (read-event))
+ (entry (assoc (list first-char second-char) iso-accents-list)))
+ (if entry
+ ;; Found it: delete the first character and insert the combination.
+ (progn
+ (delete-char 1)
+ (insert (car (cdr entry))))
+
+ ;; Otherwise, advance and schedule the second key for execution.
+ (forward-char 1)
+ (setq unread-command-events (list second-char))
+
+ ;; If it is not a self-insert-command, ring the terminal bell.
+ (or (eq (key-binding (make-vector 1 second-char)) 'self-insert-command)
+ (beep 1))))))
+
+(defvar iso-accents-minor-mode nil
+ "Buffer local variable that denotes 'dead key' minor mode.")
+
+(defvar iso-accents-prefix-map nil
+ "Keymap for 'dead key' minor mode.")
+
+;; It is a matter of taste if you want the minor mode indicated
+;; in the mode line...
+;; If so, uncomment the next three lines.
+;; (or (assq 'iso-accents-minor-mode minor-mode-map-alist)
+;; (setq minor-mode-alist
+;; (append minor-mode-alist
+;; '((iso-accents-minor-mode " ISO-Acc")))))
+
+;;;###autoload
+(defun iso-accents (&optional arg)
+ "Allow easy insertion of accented characters according to ISO-8859-1.
+When called without an argument, or with a null argument, pseudo-accent
+keys (', \", ^ and ~) will behave like dead typewriter keys: when
+followed by an appropriate character the combination will be replaced
+by the corresponding ISO character code for the accented character.
+Calling `iso-accents' with an argument will make all keys normal again."
+;; When called, a buffer local variable iso-accents-minor-mode is created
+;; to record iso-accents-minor-mode status.
+;; A minor mode map `iso-accents-prefix-map' is used to activate the dead
+;; key handling dependend on the value of iso-accents-minor-mode.
+
+ (interactive "P")
+
+ ;; Create buffer local variable iso-accents-minor-mode.
+ (make-local-variable 'iso-accents-minor-mode)
+
+ (if arg
+ ;; Switch it off.
+ (setq iso-accents-minor-mode nil)
+
+ ;; Enable electric accents.
+ (setq iso-accents-minor-mode t)
+
+ ;; Create the minor-mode keymap, if needed.
+ (or iso-accents-prefix-map
+ (progn
+ (setq iso-accents-prefix-map (make-sparse-keymap))
+ (define-key iso-accents-prefix-map "'" 'iso-accents-dead-key)
+ (define-key iso-accents-prefix-map "`" 'iso-accents-dead-key)
+ (define-key iso-accents-prefix-map "^" 'iso-accents-dead-key)
+ (define-key iso-accents-prefix-map "\"" 'iso-accents-dead-key)
+
+ ;; Add the dead key minor mode map to the minor mode maps.
+ (or (assq 'iso-accents-minor-mode minor-mode-map-alist)
+ (setq minor-mode-map-alist
+ (cons (cons 'iso-accents-minor-mode iso-accents-prefix-map)
+ minor-mode-map-alist)))))))
+
+;;; iso-acc.el ends here
+