123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- (defvar autoarg-mode-map
- (let ((map (make-sparse-keymap)))
-
- (dotimes (i 10)
- (define-key map `[,(+ ?0 i)] 'digit-argument)
- (define-key map `[(control ,(+ ?0 i))] 'self-insert-command))
- (define-key map " " 'autoarg-terminate)
- map)
- "Keymap for Autoarg mode.")
- (defvar autoarg-kp-digits
- (let (alist)
- (dotimes (i 10 alist)
- (push (cons (intern (format "kp-%d" i)) i) alist))))
- (defun autoarg-kp-digit-argument (arg)
- "Part of the numeric argument for the next command, like `digit-argument'."
- (interactive "P")
- (let ((digit (cdr (assq last-command-event autoarg-kp-digits))))
- (cond ((integerp arg)
- (setq prefix-arg (+ (* arg 10)
- (if (< arg 0) (- digit) digit))))
- ((eq arg '-)
-
- (setq prefix-arg (if (zerop digit) '- (- digit))))
- (t
- (setq prefix-arg digit))))
- (setq universal-argument-num-events (length (this-command-keys)))
- (setq overriding-terminal-local-map universal-argument-map))
- (defvar autoarg-kp-mode-map
- (let ((map (make-sparse-keymap)))
-
- (dotimes (i 10)
- (let ((sym (intern (format "kp-%d" i))))
- (define-key map (vector sym) 'autoarg-kp-digit-argument)))
- (define-key map [kp-subtract] 'negative-argument)
- map)
- "Keymap for Autoarg-KP mode.")
- (define-minor-mode autoarg-mode
- "Toggle Autoarg mode, a global minor mode.
- With a prefix argument ARG, enable Autoarg mode if ARG is
- positive, and disable it otherwise. If called from Lisp, enable
- the mode if ARG is omitted or nil.
- \\<autoarg-mode-map>
- In Autoarg mode, digits are bound to `digit-argument', i.e. they
- supply prefix arguments as C-DIGIT and M-DIGIT normally do.
- Furthermore, C-DIGIT inserts DIGIT.
- \\[autoarg-terminate] terminates the prefix sequence and inserts
- the digits of the autoarg sequence into the buffer.
- Without a numeric prefix arg, the normal binding of \\[autoarg-terminate]
- is invoked, i.e. what it would be with Autoarg mode off.
- For example:
- `6 9 \\[autoarg-terminate]' inserts `69' into the buffer, as does `C-6 C-9'.
- `6 9 a' inserts 69 `a's into the buffer.
- `6 9 \\[autoarg-terminate] \\[autoarg-terminate]' inserts `69' into the buffer and
- then invokes the normal binding of \\[autoarg-terminate].
- `C-u \\[autoarg-terminate]' invokes the normal binding of \\[autoarg-terminate] four times.
- \\{autoarg-mode-map}"
- nil " Aarg" autoarg-mode-map :global t :group 'keyboard)
- (define-minor-mode autoarg-kp-mode
- "Toggle Autoarg-KP mode, a global minor mode.
- With a prefix argument ARG, enable Autoarg-KP mode if ARG is
- positive, and disable it otherwise. If called from Lisp, enable
- the mode if ARG is omitted or nil.
- \\<autoarg-kp-mode-map>
- This is similar to `autoarg-mode' but rebinds the keypad keys
- `kp-1' etc. to supply digit arguments.
- \\{autoarg-kp-mode-map}"
- nil " Aakp" autoarg-kp-mode-map :global t :group 'keyboard
- (if autoarg-kp-mode
- (dotimes (i 10)
- (let ((sym (intern (format "kp-%d" i))))
- (define-key universal-argument-map (vector sym)
- 'autoarg-kp-digit-argument)))
- (dotimes (i 10)
- (let ((sym (intern (format "kp-%d" i))))
- (define-key universal-argument-map (vector sym) nil)))))
- (defun autoarg-terminate (n)
- "Maybe terminate a digit prefix sequence.
- With a non-negative numeric prefix arg, insert the digits comprising
- the arg into the current buffer. Otherwise use the binding of the key
- which invoked this function, excluding the Autoarg keymap."
- (interactive "P")
- (if (numberp n)
- (insert (number-to-string n))
- (let* ((autoarg-mode nil)
- (binding (key-binding (this-single-command-keys))))
- (if binding (call-interactively binding)))))
- (provide 'autoarg)
|