jjd@BBN.COM (James J Dempsey) (08/05/89)
Brian Fox writes: >> Whoops. No, there are no user-level generic keymap manipulation >> commands. This is an interesting situation, and I haven't yet decided >> what to do about it. In addition to user-level keymap manipulation commands I would also like to see a builtin which can list the current keymap, similar to the GNU Emacs C-h B command. This can be a great help especially to novice users. It gives them a way to find out about commands they don't know about and to find out where others they do know about are located. >> also, what is the extent of the keymaps and bindings? Can one bind a key >> to a bash function? >> >> No, although this wouldn't be to difficult to implement. Votes please. I would vote for both user level keymap manipulation commands and for binding bash functions to keystrokes. I have already had users ask me for both. --Jim Dempsey-- BBN Communications jjd@bbn.com (ARPA Internet) ..!{decvax, harvard, wjh12, linus}!bbn!jjd
nickson@comp.vuw.ac.nz (Ray Nickson) (08/06/89)
From: bfox@aurel.caltech.EDU
Date: Fri, 4 Aug 89 11:35:35 PDT
Also, what is the extent of the keymaps and bindings? Can one bind a key
to
a bash function?
No, although this wouldn't be to difficult to implement. Votes please.
My vote is certainly for something like this. It is a feature I have
long looked forward to in a shell.
Other features I expect to find are the ability to do interactive key
binding, and to bind to `key sequences' - that is, to have
heirarchical keymaps like emacs (so I can bind to C-X C-A if I want).
In fact, along with a few others here, I wanted these features so much
that I decided to see what sort of effort would be required to
implement them. A readline keymap is currently a 256-element array of
pointers to (C) functions; I've effectively made it an array of unions
with a type field and a pointer. This allows me to bind keys to
things other than readline functions, in particular I can bind a key
to a keymap, so in my (renamed) .inputrc, I can write
bind \C-X\C-X accept-line
bind \F-ku previous-history
The latter causes `ku' to be looked up (in the TERMCAP) at startup
time and binds the function to the appropriate string of keys (I'm
rather proud of this!). Note that I haven't actually done binding to
shell functions yet (macros would actually be much easier, and might
have better semantics), although I have lots of ideas to talk about.
I've only made this work under More/BSD on an HP300 (should of course
be OK on any BSD system) - i.e. I haven't thought about terminfo.
I've included the comment from the start of my readline.c; I'd be
pleased to see some feedback on whether people think any of my
ideas/code are interesting or useful.
/* readline.c -- a general facility for reading lines of input
with emacs style editing and completion. */
/*
* This version of readline has been massively modified by rgn, Ray
* Nickson, nickson@comp.vuw.ac.nz. It is based on the version of
* readline distributed with bash-1.02. It differs from standard readline
* in the following ways:
* 1. I allow keymaps within keymaps; for example, the keymap entry for
* control-X can itself be a keymap, so the user can bind a function
* to control-X control-A.
* 2. I think we should give readline complete control of the
* keyboard. To this end, I save the UNIX terminal driver special
* characters (the tchars, like ERASE, SUSP etc) before going into
* readline, remove their special meaning, and then restore tham
* on exit. To achieve the old behaviour, I supply the readline
* functions `signal-interrupt', `signal-stop' and `signal-quit',
* which the user binds to the keys of her choice.
* 3. I've massively changed the format of (and renamed) the startup
* file (was ~/.inputrc). Read the comment before the
* `rl_read_init_file' for details. I'll supply an
* emacs-lisp program to convert an inputrc to a keymaprc.
* Important extensions allow binding to key sequences (instead of
* just single keystrokes), and the use of termcap names for
* function keys.
* 4. I advertise a function to allow readline's caller to
* interactively change bindings, without knowing about readline's
* internal structure.
* 5. It should be possible to add new facilities (`keyboard macros';
* binding to things that have meaning to readline's caller, but
* not to readline [such as shell functions] etc.) more easily
* than is the case with standard readline.
* 6. I haven't done vi mode; I don't think it would be excessively
* hard to do.
* 7. I haven't tried to make it work with terminfo; what I have
* done has been tried only on BSD.
*/
-rgn
--
Ray Nickson, Dept. Comp. Sci., Victoria University of Wellington, New Zealand.
nickson@comp.vuw.ac.nz ...!uunet!vuwcomp!nickson + 64 4 721000x8593