bbc@titan.rice.edu (Benjamin Chase) (05/14/89)
Well, it's been a month, and only one person had comments and changes
to this package for rebinding keys, so I assume it's perfect now, and
safe for all the rest of you out there :-).
Here's the cleaned up and only slightly changed version.
(Don't forget to clip my .signature from the end.)
; ----------------------------------------
; Copyright (C) 1989 Benjamin B. Chase
; Permission is granted to copy, modify, and redistribute this
; software, but only under the conditions described in the
; GNU General Public License, Version 1, as published by the
; Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;
; This software is distributed without any warranty, and without any implied
; warranty of merchantibility or fitness. See the GNU General Public License
; for more details.
;
; 'define-key is wimpy, and will not destroy existing bindings to make
; way for keymaps. Here are some more powerful key binding functions.
;
; History:
;;; 7-Apr-89 Emacs Maint Acct (emacs@pawl.rpi.edu) (really tale@pawl.rpi.edu)
;;; Cleaned up the (provide)s.
;;; Fixed two problems with calling rebind-key interactively:
;;; o valid keymaps were signalled as errors because
;;; call-interactively quoted the symbol name. Works properly
;;; now for valid keymaps.
;;; o You couldn't type in a key sequence for anything other than
;;; the global-map. Example: I have an O prefix in the esc-map
;;; that I couldn't type to because the "k" specification reads
;;; the O as a valid (self-insert-command) key sequence. Now you
;;; can type the keys that belong to the map.
;;; Minor aesthetic changes, mostly with `let' and not quoting nil.
;;;
; Benjamin B. Chase <bbc@rice.edu>
; first verion of rebind-key, global-rebind-key, local-rebind-key,
; and rebind-this-key
(provide 'rebind)
(defun rebind-key (MAP KEYS COMMAND)
"Add the binding in MAP of string KEYS to COMMAND.
If a binding was overwritten, return the old command that was replaced,
and the key sequence that invoked it, as the pair (oldkeys . oldcommand).
Otherwise, return nil."
(interactive "SKeymap: \nsKey sequence: \nCFunction: ")
(if (not (keymapp MAP)) (setq MAP (symbol-value MAP)))
(if (null KEYS) nil
(let ((oldbinding (lookup-key MAP KEYS)) pKEYS pKEYSbinding)
(cond
((numberp oldbinding)
(setq pKEYS (substring KEYS 0 oldbinding))
(setq pKEYSbinding (lookup-key MAP pKEYS))
(define-key MAP pKEYS nil)
(define-key MAP KEYS COMMAND)
(cons pKEYS pKEYSbinding))
((null oldbinding)
(define-key MAP KEYS COMMAND)
nil)
(t
(define-key MAP KEYS COMMAND)
(cons KEYS oldbinding))))))
(defun global-rebind-key (KEYS COMMAND)
"Add the global binding of string KEYS to COMMAND.
If a binding was overwritten, return the old command that was replaced,
and the key sequence that invoked it, as the pair (oldkeys . oldcommand).
Otherwise, return nil."
(interactive "kKey sequence: \nCFunction:")
(rebind-key global-map KEYS COMMAND))
(defun local-rebind-key (KEYS COMMAND)
"Add the local binding of string KEYS to COMMAND.
If a binding was overwritten, return the old command that was replaced,
and the key sequence that invoked it, as the pair (oldkeys . oldcommand).
Otherwise, return nil."
(interactive "kKey sequence: \nCFunction:")
(rebind-key (current-local-map) KEYS COMMAND))
(defun rebind-this-key ()
"Ask for a new binding for the key sequence that invoked this function.
This function is a useful binding for unused or unallocated function keys."
(interactive)
(let ((tck (this-command-keys)))
(rebind-key global-map tck
(command-execute
'(lambda (func)
(interactive "CFunction to bind to this key: ") func)))))
--
Ben Chase, Computer Science, Rice University, Houston, Texas