changeset 6000:03f32cdd842a

Initial revision
author Richard M. Stallman <rms@gnu.org>
date Fri, 18 Feb 1994 22:40:27 +0000
parents b135bb2b4bfe
children 7caad7f2269a
files lisp/double.el
diffstat 1 files changed, 192 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/double.el	Fri Feb 18 22:40:27 1994 +0000
@@ -0,0 +1,192 @@
+;;; double.el - Support for keyboard remapping with double clicking.
+
+;; Copyright (C) 1994 Per Abrahamsen.
+
+;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
+;; Version: $Id: double.el,v 5.2 1994/02/03 17:18:49 amanda Exp $
+;; Keywords: i18n
+;; Bogus-Bureaucratic-Cruft: How 'bout ESR and the LCD people agreed
+;; 	on a common format?
+
+;; LCD Archive Entry:
+;; double|Per Abrahamsen|abraham@iesd.auc.dk|
+;; Support keyboard remapping with double clicking|
+;; $Date: 1994/02/03 17:18:49 $|$Revision: 5.2 $|~/modes/double.el.Z|
+;;
+;; This program 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.
+;; 
+;; This program 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 this program; if not, write to the Free Software
+;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Commentary:
+
+;; This mode is intended for use with languages that adds a small
+;; number of extra letters not available on the keyboard.
+;; 
+;; Examples includes Scandinavian and German with an US keyboard.
+;;
+;; The idea is that certain keys are overloaded.  When you press it
+;; once it will insert one string, and when you press it twice the
+;; string will be replaced by another.  This can be used for mapping
+;; keys on a US keyboard to generate characters according to the local
+;; keyboard convention when pressed once, and according to US keyboard
+;; convetion when pressed twice. 
+;;
+;; To use this mode, you must define the variable `double-map' and
+;; then enable double mode with `M-x double-mode'.  Read the
+;; documentation for both of them.
+;;
+;; The default mapping is for getting Danish/Norwegian keyboard layout
+;; using ISO Latin 1 on a US keyboard.
+;;
+;; Requires FSF Emacs 19.20 or later.
+;;
+;; Imprtant node: While I would like to hear comments, bug reports,
+;; suggestions, please do @strong{not} expect me to put other mappings
+;; that the default into this file.  There are billions and billions
+;; of such mappings, and just supporting the most common would
+;; increase the size of this nice small file manyfold.
+
+;;; ChangeLog: 
+
+;; * 1994-02-03		Per Abrahamsen
+;;	Created.
+
+;;; Code:
+
+(defvar double-map
+  '((?\; "\346" ";")
+    (?\' "\370" "'")
+    (?\[ "\345" "[")
+    (?\: "\306" ":")
+    (?\" "\330" "\"")
+    (?\{ "\305" "{"))
+  "Alist of key translations activated by double mode.
+
+Each entry is a list with three elements:
+1. The key activating the translation.
+2. The string to be inserted when the key is pressed once.
+3. The string to be inserted when the key is pressed twice.")
+
+;;; Read Event
+
+(defvar double-last-event nil)
+;; The last key that generated a double key event.
+
+(defun double-read-event (prompt)
+  ;; Read an event
+  (if isearch-mode (isearch-update))
+  (if prompt
+      (prog2 (message "%s%c" prompt double-last-event)
+	  (read-event)
+	(message ""))
+    (read-event)))
+
+(global-set-key [ ignore ] '(lambda () (interactive)))
+
+(or (boundp 'isearch-mode-map)
+    (load-library "isearch"))
+
+(define-key isearch-mode-map [ ignore ] 
+  (function (lambda () (interactive) (isearch-update))))
+
+(defun double-translate-key (prompt)
+  ;; Translate input events using double map.
+  (let ((key last-input-char))
+    (cond (unread-command-events
+	   ;; Artificial event, ignore it.
+	   (vector key))
+	  ((eq key 'magic-start)
+	   ;; End of generated event.  See if he will repeat it...
+	   (let ((new (double-read-event prompt))
+		 (entry (assoc double-last-event double-map)))
+	     (if (eq new double-last-event)
+		 (progn 
+		   (setq unread-command-events
+			 (append (make-list (1- (length (nth 1 entry)))
+					    'delete)
+				 (nth 2 entry)
+				 '(magic-end)))
+		   (vector 127))
+	       (setq unread-command-events (list new))
+	       [ ignore ])))
+	  ((eq key 'magic-end)
+	   ;; End of double event.  Ignore.
+	   [ ignore ])
+	  (t
+	   ;; New key.
+	   (let ((exp (nth 1 (assoc key double-map))))
+	     (setq double-last-event key)
+	     (setq unread-command-events
+		   (append (substring exp 1) '(magic-start)))
+	     (vector (aref exp 0)))))))
+
+;;; Key Translation Map
+
+(defvar default-key-translation-map
+  (or key-translation-map (make-sparse-keymap))
+  "Key translation you want to have effect, regardless of double mode.
+This will default to the value of `key-translation-map' when double was
+first loaded.")
+
+(make-variable-buffer-local 'key-translation-map)
+
+(defun double-setup ()
+  ;; Setup key-translation-map as indicated by `double-map'.
+  (setq key-translation-map (copy-keymap default-key-translation-map))
+  (mapcar (function (lambda (entry)
+            (define-key key-translation-map (vector (nth 0 entry))
+	                'double-translate-key)))
+	  (append double-map '((magic-start) (magic-end)))))
+
+;;; Mode
+
+(defvar double-mode nil)
+;; Indicator for the double mode.
+  (make-variable-buffer-local 'double-mode)
+
+(or (assq 'double-mode minor-mode-alist)
+    (setq minor-mode-alist
+	  (cons '(double-mode (" " double-mode-name)) minor-mode-alist)))
+
+(defvar double-mode-name "Double")
+;; Name of current double mode.
+  (make-variable-buffer-local 'double-mode-name)
+
+;;;###autoload
+(defun double-mode (arg)
+  "Toggle double mode.
+With prefix arg, turn double mode on iff arg is positive.
+
+When double mode is on, some keys will insert will insert different
+strings when pressed twice.  See variable `double-map' for details."
+  (interactive "P")
+  (if (or (and (null arg) double-mode)
+	  (<= (prefix-numeric-value arg) 0))
+      ;; Turn it off
+      (if double-mode
+	  (progn
+	    (let ((double-map))
+	      (double-setup))
+	    (setq double-mode nil)
+	    (set-buffer-modified-p (buffer-modified-p))))
+    ;;Turn it on
+    (if double-mode
+	()
+      (double-setup)
+      (setq double-mode t)
+      (set-buffer-modified-p (buffer-modified-p)))))
+
+(provide 'double)
+
+;;; double.el ends here
+