]> code.delx.au - gnu-emacs/blobdiff - lisp/double.el
(mh-insert-x-mailer): Strip build number from version in X-Mailer
[gnu-emacs] / lisp / double.el
index e0e3071463d5a78b6f2ec61640bdebfc27ec5f73..e869ca323e774d793c3df53c7aee7567d10d4835 100644 (file)
@@ -1,8 +1,9 @@
-;;; double.el - Support for keyboard remapping with double clicking.
+;;; double.el --- support for keyboard remapping with double clicking
 
-;; Copyright (C) 1994 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1997, 1998, 2002, 2003, 2004,
+;;   2005, 2006 Free Software Foundation, Inc.
 
-;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
+;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: i18n
 
 ;; This file is part of GNU Emacs.
 ;; 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.
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, 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
@@ -33,7 +35,7 @@
 ;; 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
 
@@ -85,12 +95,12 @@ Each entry is a list with three elements:
        (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)
@@ -99,23 +109,28 @@ Each entry is a list with three elements:
     (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))
                 (entry (assoc double-last-event double-map)))
+            (force-window-update (selected-window))
             (if (eq new double-last-event)
-                (progn 
+                (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))))
@@ -126,43 +141,55 @@ Each entry is a list with three elements:
 
 ;;; 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))
@@ -170,17 +197,17 @@ strings when pressed twice.  See variable `double-map' for details."
       (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)
 
+;;; arch-tag: 2e170036-44cb-4493-bc32-ada0a4395221
 ;;; double.el ends here
-