(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-char 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 minor mode globally.
With ARG, turn Autoarg mode on if ARG is positive, off otherwise.
\\<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 -- and
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 minor mode globally.
With ARG, turn Autoarg mode on if ARG is positive, off otherwise.
\\<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)