-;;; double.el - Support for keyboard remapping with double clicking.
+;;; double.el --- support for keyboard remapping with double clicking
-;; Copyright (C) 1994 Per Abrahamsen.
+;; Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc.
-;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
-;; Version: $Id: double.el,v 5.2 1994/02/03 17:18:49 amanda Exp $
+;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; 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
+;; 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.
-;;
-;; This program is distributed in the hope that it will be useful,
+
+;; 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 this program; if not, write to the Free Software
-;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
;;; Commentary:
;; 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.
+;; convention 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
;; 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,
+;; Important 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
+;; than 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
+(defgroup double nil
+ "Remap keyboard, but get original by typing the same key twice."
+ :group 'i18n)
+
+(defcustom double-map
'((?\; "\346" ";")
(?\' "\370" "'")
(?\[ "\345" "[")
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.")
+3. The string to be inserted when the key is pressed twice."
+ :group 'double
+ :type '(repeat (list (character :tag "Key")
+ (string :tag "Once")
+ (string :tag "Twice"))))
+
+(defcustom double-prefix-only t
+ "*Non-nil means that Double mode mapping only works for prefix keys.
+That is, for any key `X' in `double-map', `X' alone will be mapped
+but not `C-u X' or `ESC X' since the X is not the prefix key."
+ :group 'double
+ :type 'boolean)
;;; Read Event
(message ""))
(read-event)))
-(global-set-key [ ignore ] '(lambda () (interactive)))
+(global-set-key [ignore] '(lambda () (interactive)))
(or (boundp 'isearch-mode-map)
(load-library "isearch"))
-(define-key isearch-mode-map [ ignore ]
+(define-key isearch-mode-map [ignore]
(function (lambda () (interactive) (isearch-update))))
(defun double-translate-key (prompt)
(cond (unread-command-events
;; Artificial event, ignore it.
(vector key))
+ ((and double-prefix-only
+ (> (length (this-command-keys)) 1))
+ ;; This is not a prefix key, ignore it.
+ (vector key))
((eq key 'magic-start)
;; End of generated event. See if he will repeat it...
(let ((new (double-read-event prompt))
(progn
(setq unread-command-events
(append (make-list (1- (length (nth 1 entry)))
- 'delete)
+ 127)
(nth 2 entry)
'(magic-end)))
(vector 127))
(setq unread-command-events (list new))
- [ ignore ])))
+ [ignore])))
((eq key 'magic-end)
;; End of double event. Ignore.
- [ ignore ])
+ [ignore])
(t
;; New key.
(let ((exp (nth 1 (assoc key double-map))))
;;; 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)))))
+(defun double-setup (enable-flag)
+ (if enable-flag
+ (progn
+ ;; Set up key-translation-map as indicated by `double-map'.
+ (kill-local-variable 'key-translation-map)
+ (make-local-variable 'key-translation-map)
+ (setq key-translation-map (if (keymapp key-translation-map)
+ (copy-keymap key-translation-map)
+ (make-sparse-keymap)))
+ (mapcar (function (lambda (entry)
+ (define-key key-translation-map
+ (vector (nth 0 entry))
+ 'double-translate-key)))
+ (append double-map '((magic-start) (magic-end)))))
+ (kill-local-variable 'key-translation-map)))
;;; Mode
-(defvar double-mode nil)
-;; Indicator for the double mode.
- (make-variable-buffer-local 'double-mode)
+;;;###autoload
+(defcustom double-mode nil
+ "Toggle Double mode.
+Setting this variable directly does not take effect;
+use either \\[customize] or the function `double-mode'."
+ :set (lambda (symbol value)
+ (double-mode (if value 1 0)))
+ :initialize 'custom-initialize-default
+ :link '(emacs-commentary-link "double")
+ :type 'boolean
+ :require 'double
+ :group 'double)
+(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)))
+ (cons '(double-mode " Double") minor-mode-alist)))
-(defvar double-mode-name "Double")
-;; Name of current double mode.
- (make-variable-buffer-local 'double-mode-name)
+;; This feature seemed useless and it confused describe-mode,
+;; so I deleted it.
+;;;(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.
+ "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."
+When Double mode is on, some keys 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))
(if double-mode
(progn
(let ((double-map))
- (double-setup))
+ (double-setup nil))
(setq double-mode nil)
- (set-buffer-modified-p (buffer-modified-p))))
+ (force-mode-line-update)))
;;Turn it on
(if double-mode
()
- (double-setup)
+ (double-setup t)
(setq double-mode t)
- (set-buffer-modified-p (buffer-modified-p)))))
+ (force-mode-line-update))))
(provide 'double)
;;; double.el ends here
-