X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/48a0ae63d2f85fe7aec62d7b1864bd3ed675e0dd..db8d59365b5ccdca367ace2d4df5b8a2242e5765:/lisp/double.el diff --git a/lisp/double.el b/lisp/double.el index c64ab007f5..e869ca323e 100644 --- a/lisp/double.el +++ b/lisp/double.el @@ -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 +;; Author: Per Abrahamsen ;; Keywords: i18n ;; This file is part of GNU Emacs. @@ -18,14 +19,15 @@ ;; 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 @@ -42,24 +44,19 @@ ;; The default mapping is for getting Danish/Norwegian keyboard layout ;; using ISO Latin 1 on a US keyboard. ;; -;; 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-06-21 Per Abrahamsen -;; Added `double-prefix-only'. -;; * 1994-02-28 Per Abrahamsen -;; Use 127 instead of 'delete to delete a character. -;; * 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" "[") @@ -71,12 +68,18 @@ 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")))) -(defvar double-prefix-only t +(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.") +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 @@ -97,7 +100,7 @@ but not `C-u X' or `ESC X' since the X is not the prefix key.") (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) @@ -114,8 +117,9 @@ but not `C-u X' or `ESC X' since the X is not the prefix key.") ;; 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))) 127) @@ -137,27 +141,37 @@ but not `C-u X' or `ESC X' since the X is not the prefix key.") ;;; 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 defaults 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 @@ -174,8 +188,8 @@ first loaded.") "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)) @@ -183,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 -