comparison lisp/emulation/keypad.el @ 45296:eb7082dc04a0

Improved commentary. (keypad-setup, keypad-shifted-setup): Added choice to setup Numeric keypad with decimal key; value is selected character. (keypad-decimal-key, keypad-shifted-decimal-key): Removed options. (keypad-numlock-setup, keypad-numlock-shifted-setup): New options. (keypad-setup): Arg list changed to support the new options.
author Kim F. Storm <storm@cua.dk>
date Tue, 14 May 2002 20:30:55 +0000
parents 358d42530d42
children 66857c2230b6
comparison
equal deleted inserted replaced
45295:48340cc8c24f 45296:eb7082dc04a0
26 26
27 ;; The keypad package allows easy binding of the keypad keys to 27 ;; The keypad package allows easy binding of the keypad keys to
28 ;; various commonly used sets of commands. 28 ;; various commonly used sets of commands.
29 ;; 29 ;;
30 ;; With the following setup, the keypad can be used for numeric data 30 ;; With the following setup, the keypad can be used for numeric data
31 ;; entry, or to give numeric prefix arguments to emacs commands. 31 ;; entry when NumLock is off, and to give numeric prefix arguments to
32 ;; 32 ;; emacs commands, when NumLock on on.
33 ;; (keypad-setup 'numeric) 33 ;;
34 ;; (keypad-setup 'prefix t) 34 ;; keypad-setup => Plain Numeric Keypad
35 ;; 35 ;; keypad-numlock-setup => Prefix numeric args
36 ;; +--------+--------+--------+ 36 ;;
37 ;; | M-7 | M-8 | M-9 | 37 ;; +--------+--------+--------+
38 ;; | 7 | 8 | 9 | 38 ;; | M-7 | M-8 | M-9 | <- numlock on
39 ;; | 7 | 8 | 9 | <- numlock off
39 ;; +--------+--------+--------+ 40 ;; +--------+--------+--------+
40 ;; | M-4 | M-5 | M-6 | 41 ;; | M-4 | M-5 | M-6 |
41 ;; | 4 | 5 | 6 | 42 ;; | 4 | 5 | 6 |
42 ;; +--------+--------+--------+ 43 ;; +--------+--------+--------+
43 ;; | M-1 | M-2 | M-3 | 44 ;; | M-1 | M-2 | M-3 |
45 ;; +--------+--------+--------+ 46 ;; +--------+--------+--------+
46 ;; | M-0 | M-- | 47 ;; | M-0 | M-- |
47 ;; | 0 | . | 48 ;; | 0 | . |
48 ;; +-----------------+--------+ 49 ;; +-----------------+--------+
49 50
50 ;; The following keypad setup is used for navigation: 51 ;; The following keypad setup is used for navigation together with
51 ;; 52 ;; modes like cua-mode which uses shifted movement keys to extend the
52 ;; (keypad-setup 'cursor) 53 ;; region.
53 ;; (keypad-setup 'S-cursor t) 54 ;;
54 ;; 55 ;; keypad-setup => Cursor keys
55 ;; +--------+--------+--------+ 56 ;; keypad-shifted-setup => Shifted cursor keys
56 ;; | S-home | S-up | S-PgUp | 57 ;;
57 ;; | Home | up | PgUp | 58 ;; +--------+--------+--------+
59 ;; | S-home | S-up | S-PgUp | <- shifted, numlock off
60 ;; | Home | up | PgUp | <- unshifted, numlock off
58 ;; +--------+--------+--------+ 61 ;; +--------+--------+--------+
59 ;; | S-left |S-space |S-right | 62 ;; | S-left |S-space |S-right |
60 ;; | left | space | right | 63 ;; | left | space | right |
61 ;; +--------+--------+--------+ 64 ;; +--------+--------+--------+
62 ;; | S-end | S-down | S-PgDn | 65 ;; | S-end | S-down | S-PgDn |
64 ;; +--------+--------+--------+ 67 ;; +--------+--------+--------+
65 ;; | S-insert |S-delete| 68 ;; | S-insert |S-delete|
66 ;; | insert | delete | 69 ;; | insert | delete |
67 ;; +-----------------+--------+ 70 ;; +-----------------+--------+
68 71
72 ;; The following setup binds the unshifted keypad keys to plain
73 ;; numeric keys when NumLock is either on or off, but the decimal key
74 ;; produces either a . (NumLock off) or a , (NumLock on). This is
75 ;; useful for e.g. Danish users where the decimal separator is a
76 ;; comma.
77 ;;
78 ;; keypad-setup => Plain Numeric Keypad
79 ;; keypad-numlock-setup => Numeric Keypad with Decimal key: ,
80 ;;
81 ;; +--------+--------+--------+
82 ;; | 7 | 8 | 9 | <- numlock on
83 ;; | 7 | 8 | 9 | <- numlock off
84 ;; +--------+--------+--------+
85 ;; | 4 | 5 | 6 |
86 ;; | 4 | 5 | 6 |
87 ;; +--------+--------+--------+
88 ;; | 1 | 2 | 3 |
89 ;; | 1 | 2 | 3 |
90 ;; +--------+--------+--------+
91 ;; | 0 | , |
92 ;; | 0 | . |
93 ;; +-----------------+--------+
69 94
70 ;;; Code: 95 ;;; Code:
71 96
72 (provide 'keypad) 97 (provide 'keypad)
73 98
74 ;;; Customization 99 ;;; Customization
75 100
76 ;;;###autoload 101 ;;;###autoload
77 (defcustom keypad-setup nil 102 (defcustom keypad-setup nil
78 "Specifies the keypad setup for unshifted keypad keys. 103 "Specifies the keypad setup for unshifted keypad keys when NumLock is off.
79 The options are: 104 When selecting the plain numeric keypad setup, the character returned by the
80 'prefix Numeric prefix argument, i.e. M-0 .. M-9 and M-- 105 decimal key must be specified."
81 'cursor Cursor movement keys. 106 :set (lambda (symbol value)
82 'S-cursor Shifted cursor movement keys. 107 (if value
83 'numeric Plain numeric, i.e. 0 .. 9 and . (or DECIMAL arg) 108 (keypad-setup value nil nil value)))
84 'none Removes all bindings for keypad keys in function-key-map. 109 :initialize 'custom-initialize-default
85 nil Keep existing bindings for the keypad keys." 110 :link '(emacs-commentary-link "keypad.el")
86 :set (lambda (symbol value) 111 :version "21.4"
87 (if value 112 :type '(choice (const :tag "Plain numeric keypad" numeric)
88 (keypad-setup value nil keypad-decimal-key))) 113 (character :tag "Numeric Keypad with Decimal Key"
89 :initialize 'custom-initialize-default 114 :match (lambda (widget value) (integerp value))
90 :set-after '(keypad-decimal-key) 115 :value ?.)
91 :require 'keypad 116 (const :tag "Numeric prefix arguments" prefix)
92 :link '(emacs-commentary-link "keypad.el") 117 (const :tag "Cursor keys" cursor)
93 :version "21.4" 118 (const :tag "Shifted cursor keys" S-cursor)
94 :type '(choice (const :tag "Numeric prefix arguments" prefix) 119 (const :tag "Remove bindings" none)
95 (const :tag "Cursor keys" cursor) 120 (other :tag "Keep existing bindings" nil))
96 (const :tag "Shifted cursor keys" S-cursor) 121 :group 'keyboard)
97 (const :tag "Plain Numeric Keypad" numeric) 122
98 (const :tag "Remove bindings" none) 123 ;;;###autoload
99 (other :tag "Keep existing bindings" :value nil)) 124 (defcustom keypad-numlock-setup nil
100 :group 'keyboard) 125 "Specifies the keypad setup for unshifted keypad keys when NumLock is on.
101 126 When selecting the plain numeric keypad setup, the character returned by the
102 (defcustom keypad-decimal-key ?. 127 decimal key must be specified."
103 "Character produced by the unshifted decimal key on the keypad." 128 :set (lambda (symbol value)
104 :type 'character 129 (if value
130 (keypad-setup value t nil value)))
131 :initialize 'custom-initialize-default
132 :link '(emacs-commentary-link "keypad.el")
133 :version "21.4"
134 :type '(choice (const :tag "Plain numeric keypad" numeric)
135 (character :tag "Numeric Keypad with Decimal Key"
136 :match (lambda (widget value) (integerp value))
137 :value ?.)
138 (const :tag "Numeric prefix arguments" prefix)
139 (const :tag "Cursor keys" cursor)
140 (const :tag "Shifted cursor keys" S-cursor)
141 (const :tag "Remove bindings" none)
142 (other :tag "Keep existing bindings" nil))
105 :group 'keyboard) 143 :group 'keyboard)
106 144
107 ;;;###autoload 145 ;;;###autoload
108 (defcustom keypad-shifted-setup nil 146 (defcustom keypad-shifted-setup nil
109 "Specifies the keypad setup for shifted keypad keys. 147 "Specifies the keypad setup for shifted keypad keys when NumLock is off.
110 See `keypad-setup' for available options." 148 When selecting the plain numeric keypad setup, the character returned by the
111 :set (lambda (symbol value) 149 decimal key must be specified."
112 (if value 150 :set (lambda (symbol value)
113 (keypad-setup value t keypad-shifted-decimal-key))) 151 (if value
114 :initialize 'custom-initialize-default 152 (keypad-setup value nil t value)))
115 :set-after '(keypad-shifted-decimal-key) 153 :initialize 'custom-initialize-default
116 :require 'keypad 154 :link '(emacs-commentary-link "keypad.el")
117 :link '(emacs-commentary-link "keypad.el") 155 :version "21.4"
118 :version "21.4" 156 :type '(choice (const :tag "Plain numeric keypad" numeric)
119 :type '(choice (const :tag "Numeric prefix arguments" prefix) 157 (character :tag "Numeric Keypad with Decimal Key"
120 (const :tag "Cursor keys" cursor) 158 :match (lambda (widget value) (integerp value))
121 (const :tag "Shifted cursor keys" S-cursor) 159 :value ?.)
122 (const :tag "Plain Numeric Keypad" numeric) 160 (const :tag "Numeric prefix arguments" prefix)
123 (const :tag "Remove bindings" none) 161 (const :tag "Cursor keys" cursor)
124 (other :tag "Keep existing bindings" :value nil)) 162 (const :tag "Shifted cursor keys" S-cursor)
125 :group 'keyboard) 163 (const :tag "Remove bindings" none)
126 164 (other :tag "Keep existing bindings" nil))
127 (defcustom keypad-shifted-decimal-key ?. 165 :group 'keyboard)
128 "Character produced by the unshifted decimal key on the keypad." 166
129 :type 'character 167 ;;;###autoload
130 :group 'keyboard) 168 (defcustom keypad-numlock-shifted-setup nil
131 169 "Specifies the keypad setup for shifted keypad keys when NumLock is off.
132 ;;;###autoload 170 When selecting the plain numeric keypad setup, the character returned by the
133 (defun keypad-setup (setup &optional numlock decimal) 171 decimal key must be specified."
172 :set (lambda (symbol value)
173 (if value
174 (keypad-setup value t t value)))
175 :initialize 'custom-initialize-default
176 :link '(emacs-commentary-link "keypad.el")
177 :version "21.4"
178 :type '(choice (const :tag "Plain numeric keypad" numeric)
179 (character :tag "Numeric Keypad with Decimal Key"
180 :match (lambda (widget value) (integerp value))
181 :value ?.)
182 (const :tag "Numeric prefix arguments" prefix)
183 (const :tag "Cursor keys" cursor)
184 (const :tag "Shifted cursor keys" S-cursor)
185 (const :tag "Remove bindings" none)
186 (other :tag "Keep existing bindings" nil))
187 :group 'keyboard)
188
189
190 ;;;###autoload
191 (defun keypad-setup (setup &optional numlock shift decimal)
134 "Set keypad bindings in function-key-map according to SETUP. 192 "Set keypad bindings in function-key-map according to SETUP.
135 If optional second argument NUMLOCK is non-nil, the NumLock On bindings 193 If optional second argument NUMLOCK is non-nil, the NumLock On bindings
136 are changed. Otherwise, the NumLock Off bindings are changed. 194 are changed. Otherwise, the NumLock Off bindings are changed.
195 If optional third argument SHIFT is non-nil, the shifted keypad
196 keys are bound.
137 197
138 Setup Binding 198 Setup Binding
139 ------------------------------------------------------------- 199 -------------------------------------------------------------
140 'prefix Command prefix argument, i.e. M-0 .. M-9 and M-- 200 'prefix Command prefix argument, i.e. M-0 .. M-9 and M--
141 'S-cursor Bind shifted keypad keys to the shifted cursor movement keys. 201 'S-cursor Bind shifted keypad keys to the shifted cursor movement keys.
142 'cursor Bind keypad keys to the cursor movement keys. 202 'cursor Bind keypad keys to the cursor movement keys.
143 'numeric Plain numeric, i.e. 0 .. 9 and . (or DECIMAL arg) 203 'numeric Plain numeric keypad, i.e. 0 .. 9 and . (or DECIMAL arg)
144 'none Removes all bindings for keypad keys in function-key-map. 204 'none Removes all bindings for keypad keys in function-key-map.
145 205
146 If SETUP is 'numeric and the optional third argument DECIMAL is non-nil, 206 If SETUP is 'numeric and the optional fourth argument DECIMAL is non-nil,
147 the decimal key on the keypad is mapped to DECIMAL instead of `.'" 207 the decimal key on the keypad is mapped to DECIMAL instead of `.'"
148 (let ((i 0) 208 (let* ((i 0)
149 (kp 209 (var (cond
150 (cond 210 ((and (not numlock) (not shift)) 'keypad-setup)
151 (numlock 211 ((and (not numlock) shift) 'keypad-shifted-setup)
152 [kp-decimal kp-0 kp-1 kp-2 kp-3 kp-4 212 ((and numlock (not shift)) 'keypad-numlock-setup)
153 kp-5 kp-6 kp-7 kp-8 kp-9]) 213 ((and numlock shift) 'keypad-numlock-shifted-setup)))
154 (t 214 (kp (cond
155 [kp-delete kp-insert kp-end kp-down kp-next kp-left 215 ((eq var 'keypad-setup)
156 kp-space kp-right kp-home kp-up kp-prior]))) 216 [kp-delete kp-insert kp-end kp-down kp-next kp-left
157 (bind 217 kp-space kp-right kp-home kp-up kp-prior])
158 (cond 218 ((eq var 'keypad-shifted-setup)
159 ((eq setup 'numeric) 219 [S-kp-decimal S-kp-0 S-kp-1 S-kp-2 S-kp-3 S-kp-4
160 (vector (or decimal ?.) ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9)) 220 S-kp-5 S-kp-6 S-kp-7 S-kp-8 S-kp-9])
161 ((eq setup 'prefix) 221 ((eq var 'keypad-numlock-setup)
162 [?\M-- ?\M-0 ?\M-1 ?\M-2 ?\M-3 ?\M-4 222 [kp-decimal kp-0 kp-1 kp-2 kp-3 kp-4
163 ?\M-5 ?\M-6 ?\M-7 ?\M-8 ?\M-9]) 223 kp-5 kp-6 kp-7 kp-8 kp-9])
164 ((eq setup 'cursor) 224 ((eq var 'keypad-numlock-shifted-setup)
165 [delete insert end down next left 225 [S-kp-delete S-kp-insert S-kp-end S-kp-down S-kp-next S-kp-left
166 space right home up prior]) 226 S-kp-space S-kp-right S-kp-home S-kp-up S-kp-prior])))
167 ((eq setup 'S-cursor) 227 (bind
168 [S-delete S-insert S-end S-down S-next S-left 228 (cond
169 S-space S-right S-home S-up S-prior]) 229 ((or (eq setup 'numeric)
170 ((eq setup 'none) 230 (char-valid-p setup))
171 nil) 231 (if (eq decimal 'numeric)
172 (t 232 (setq decimal nil))
173 (signal 'error (list "Unknown keypad setup: " setup)))))) 233 (vector (or decimal ?.) ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))
234 ((eq setup 'prefix)
235 [?\M-- ?\M-0 ?\M-1 ?\M-2 ?\M-3 ?\M-4
236 ?\M-5 ?\M-6 ?\M-7 ?\M-8 ?\M-9])
237 ((eq setup 'cursor)
238 [delete insert end down next left
239 space right home up prior])
240 ((eq setup 'S-cursor)
241 [S-delete S-insert S-end S-down S-next S-left
242 S-space S-right S-home S-up S-prior])
243 ((eq setup 'none)
244 nil)
245 (t
246 (signal 'error (list "Unknown keypad setup: " setup))))))
247
248 (set var setup)
174 249
175 ;; Bind the keys in KP list to BIND list in function-key-map. 250 ;; Bind the keys in KP list to BIND list in function-key-map.
176 ;; If BIND is nil, all bindings for the keys are removed. 251 ;; If BIND is nil, all bindings for the keys are removed.
177 (if (not (boundp 'function-key-map)) 252 (if (not (boundp 'function-key-map))
178 (setq function-key-map (make-sparse-keymap))) 253 (setq function-key-map (make-sparse-keymap)))