X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/c9bba7edc4e15cdab8b11fe7a5b1f7aa8d484b91..139bbb9cc4db48696ce8c48b8dd6ce09c2c07594:/lisp/autoarg.el diff --git a/lisp/autoarg.el b/lisp/autoarg.el index 57e6b8cfae..aca22ace5b 100644 --- a/lisp/autoarg.el +++ b/lisp/autoarg.el @@ -1,25 +1,28 @@ ;;; autoarg.el --- make digit keys supply prefix args -;; Copyright (C) 1998 Free Software Foundation, Inc. +;; Copyright (C) 1998, 2000, 2002, 2003, 2004, +;; 2005 Free Software Foundation, Inc. ;; Author: Dave Love ;; Created: 1998-09-04 ;; Keywords: abbrev, emulations -;; Autoarg Mode is free software; you can redistribute it and/or modify +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. -;; Autoarg Mode is distributed in the hope that it will be useful, +;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; 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, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: @@ -35,40 +38,62 @@ ;; You probably don't really want to use this. +;; Also provides `autoarg-kp-mode' which is similar, but leaves the +;; digit keys alone and redefines the `keypad' keys, `kp-1' &c as +;; digit arguments. (Use `NumLock' if necessary to generate kp-N.) +;; You're more likely to want to use this. + ;;; Code: -;;;###autoload -(defcustom autoarg-mode nil - "Toggle Autoarg mode. - -You must modify via \\[customize] for this variable to have an effect." - :set (lambda (symbol vaautoarg-mode (or value 0))) - :initialize 'custom-initialize-default - :type 'boolean - :group 'editing - :require 'autoarg) -;; If you wanted a local mode: -;; (make-variable-buffer-local 'autoarg-mode) - -(defvar autoarg-mode-map (make-sparse-keymap) - "Keymap for Autoarg Mode.") - -;; Loop over digit characters to set up keymap. -(let ((i ?0)) - (while (<= i ?9) - (define-key autoarg-mode-map `[,i] 'digit-argument) - (define-key autoarg-mode-map `[(control ,i)] 'self-insert-command) - (setq i (1+ i)))) -(define-key autoarg-mode-map " " 'autoarg-terminate) +(defvar autoarg-mode-map + (let ((map (make-sparse-keymap))) + ;; Loop over digit characters to set up 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.") + ;; Logical additions: ;; (define-key autoarg-mode-map [?-] 'negative-argument) ;; (define-key autoarg-mode-map [(control ?-)] 'self-insert-command) ;; A sensible/addition? ;; (define-key autoarg-mode-map [?\r] 'autoarg-terminate) +(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 '-) + ;; Treat -0 as just -, so that -01 will work. + (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))) + ;; Loop over digit characters to set up 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.") + ;;;###autoload -(defun autoarg-mode (&optional arg) - "Toggle Autoarg mode minor mode globally. +(define-minor-mode autoarg-mode + "Toggle Autoarg minor mode globally. With ARG, turn Autoarg mode on if ARG is positive, off otherwise. \\ In Autoarg mode digits are bound to `digit-argument' -- i.e. they @@ -86,20 +111,29 @@ then invokes the normal binding of \\[autoarg-terminate]. `C-u \\[autoarg-terminate]' invokes the normal binding of \\[autoarg-terminate] four times. \\{autoarg-mode-map}" - (interactive "P") - (let ((old-mode autoarg-mode)) - (setq autoarg-mode (if (null arg) - (not autoarg-mode) - (> (prefix-numeric-value arg) 0)))) - (if (interactive-p) - (message "Autoarg mode %sabled" (if autoarg-mode "en" "dis")))) + nil " Aarg" autoarg-mode-map :global t :group 'keyboard) -(add-to-list 'minor-mode-alist '(autoarg-mode " Aarg")) -(add-to-list 'minor-mode-map-alist (cons 'autoarg-mode autoarg-mode-map)) +;;;###autoload +(define-minor-mode autoarg-kp-mode + "Toggle Autoarg-KP minor mode globally. +With ARG, turn Autoarg mode on if ARG is positive, off otherwise. +\\ +This is similar to \\[autoarg-mode] but rebinds the keypad keys `kp-1' +&c 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." @@ -112,4 +146,5 @@ which invoked this function, excluding the Autoarg keymap." (provide 'autoarg) +;;; arch-tag: 2ba2ab4f-d60e-402a-ae4d-37e29af723c2 ;;; autoarg.el ends here