bbc@rice.edu (04/07/89)
There's been some recent discussion on this list about key bindings for
function and keypad keys, especially Suns. The obvious first solution is to
use global-set-key or define-key, but these functions won't overwrite an
existing binding. The character sequences transmitted by function keys
often have a prefix that matches an existing binding, eg. "\e[", and so
global-set-key or define-key alone is inadequate. There are several ways
around this, but of course, I chose to write some functions that will
overwrite an existing binding.
rebind-key is like define-key, but more studly.
global-rebind-key is like global-set-key, but more studly.
local-rebind-key is like local-set-key, but more studly.
rebind-this-key is wonderfully convenient for people who can't decide
which function should be assigned to each key, or
just like to have some spare keys waiting for
one-shot functions. Note that rebind-this-key could
call define-key rather than rebind-key, if you're
not interested in the rest of this.
As a testimonial, I bind rebind-this-key to all the keys on the left-hand
keypad of Suns. (I use X, rather than SunView, and so these keys are
available.)
I don't claim to be much of an emacs-lisp hacker (yet?), so constructive
criticism and fixes to my lisp are welcome, but don't waste our time with
flames. Thanks are in order for super-apropos for helping me find things.
Ben Chase, Computer Science, Rice University, Houston, Texas
ps: Another .sig might be hiding at the end... Please pardon the legal
litany. They tell me it's for the greater common good.
;--------------------
; 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.
;
(provide 'rebind-key)
(provide 'global-rebind-key)
(provide 'local-rebind-key)
(provide 'rebind-this-key)
; 'define-key is wimpy, and will not destroy existing bindings to make
; way for keymaps. Here are some more powerful key binding functions.
;
; History:
; Benjamin B. Chase <bbc@rice.edu>
; first verion of rebind-key, global-rebind-key, local-rebind-key,
; and rebind-this-key
(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:
kKey sequence:
CFunction: ")
(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:
CFunction:")
(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:
CFunction:")
(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)
; this-command-keys wouldn't behave to suit my porpoises. Head-standing
; ensues...
(let (
(tck (this-command-keys))
(rtk-helper '(lambda (COMMAND)
""
(interactive "CFuntion to bind to this key: ")
COMMAND))
)
(rebind-key global-map tck (command-execute rtk-helper))))
Ben Chase, Computer Science, Rice University, Houston, Texas