jrmacmillan@watdragon.waterloo.edu (John R. MacMillan) (09/12/88)
This is one of those "I wonder if that would work..." programs. It did; if you're in emacs or gmacs mode of the ksh, this lets you use the function keys. It's none too pretty; I'm posting it in the hope that some inventive soul can think of something genuinely useful to do with it. #!/bin/sh # This is a shar file. To extract, sh this file # # Contents: # README # Makefile # demo # fkey.c # # Wrapped by john@mystic ; Sun Sep 11 20:55:43 EST 1988 # if [ -f "README" ] ; then echo "shar: Will not overwrite existing file README" else echo "shar: extracting README (1686 characters)" sed 's/^X//' <<'BOP_BOP_A_LOO_WOP_BO_LOP_BAM_BOOM' > README XThis is a quick hack to let UNIXpc users who use the ksh in emacs (or Xgmacs) mode use the function keys. A wee bit specialized, but... X XThe idea is that ksh lets you alias _O to something, and expands it if Xyou type ESC O (O can be any letter ksh isn't already using). The Xeight function keys on the UNIXpc put out ESC O [c-j] (unshifted). XSo with an appropriate _O alias, you can get the function keys to do Xthings. X XFkey lets you do this. Usage is "fkey [name]". Fkey reads one char Xfrom stdin (the extra character that the function key put out), and Xgets the value of the environment variable "name_c" where name is Xargv[1] or argv[0] and c is the character read. X XIf the first character of name_c is a '$', fkey assumes the rest is Xname of another environment variable, and prints it. If the first Xcharacter is not a '$', fkey execs 'ksh -c "name_c"'. X XThis is easier to demonstrate than explain (for me, anyway!) so make Xsure you're in ksh [eg]macs mode, and source the file "demo". The Xfunction keys and the Rfrsh key should now do things. Take a look at Xdemo to see what's going on. X XNote that since the function is executing in a subshell, things like Xcd won't be effective. X XNote that you can use this with a bunch of the other keys on the XUNIXpc. There are a bunch other than the function keys that use ESC O, Xand some use ESC N and ESC P. Some however (eg. cursor keys) use XESC [ which won't work. X XI wrote this as an educational exercise (to see if it would work), and Xdecided to post it to see if anyone more ingenious than myself can Xmake it do anything truly useful. X XSuggestions welcome. X XJohn R. MacMillan Xjohn%mystic@math.waterloo.edu X...!watmath!mystic!john BOP_BOP_A_LOO_WOP_BO_LOP_BAM_BOOM set -- `wc -c README` if [ "$1" != "1686" ] ; then echo "shar: README unpacked with wrong size!" fi fi if [ -f "Makefile" ] ; then echo "shar: Will not overwrite existing file Makefile" else echo "shar: extracting Makefile (131 characters)" sed 's/^X//' <<'BOP_BOP_A_LOO_WOP_BO_LOP_BAM_BOOM' > Makefile XCFLAGS=-O XLDFLAGS=-s X Xfkey: fkey.o X $(LD) $(LDFLAGS) /lib/crt0s.o -o $@ fkey.o /lib/shlib.ifile X Xclean: X rm -f fkey *.o core *.out BOP_BOP_A_LOO_WOP_BO_LOP_BAM_BOOM set -- `wc -c Makefile` if [ "$1" != "131" ] ; then echo "shar: Makefile unpacked with wrong size!" fi fi if [ -f "demo" ] ; then echo "shar: Will not overwrite existing file demo" else echo "shar: extracting demo (598 characters)" sed 's/^X//' <<'BOP_BOP_A_LOO_WOP_BO_LOP_BAM_BOOM' > demo X# X# Sample uses of fkey for ESC O c keys (function keys and others) X# X Xset -o emacs X Xalias _O='fkey X' X XClear=`tput clear` X Xfkey_c='$PWD' Xfkey_d='$Clear' Xfkey_e='ls -l' X Xfkey_f='echo *.c' Xfkey_g="ps -fu$LOGNAME" X Xfkey_h='date' Xfkey_i='du' Xfkey_j='echo I could not think of anything to put on this key' X Xexport Clear fkey_c fkey_d fkey_e fkey_f fkey_g fkey_h fkey_i fkey_j X X# X# Use of parameter to fkey; in this case, allow Clear/Rfrsh key to do X# a clear. Instead of doing it this way, you could link fkey to nkey X# (say) and use it as above X# X Xalias _N='fkey NKEY X' X XNKEY_a='clear' X Xexport NKEY_a BOP_BOP_A_LOO_WOP_BO_LOP_BAM_BOOM set -- `wc -c demo` if [ "$1" != "598" ] ; then echo "shar: demo unpacked with wrong size!" fi fi if [ -f "fkey.c" ] ; then echo "shar: Will not overwrite existing file fkey.c" else echo "shar: extracting fkey.c (1880 characters)" sed 's/^X//' <<'BOP_BOP_A_LOO_WOP_BO_LOP_BAM_BOOM' > fkey.c X/* X * Allow use of the UNIXpc function keys when using ksh in X * emacs or gmacs mode. X * X * Usage: fkey [name] X * X * combined with alias _O='fkey X * ' X * and environment var(s) fkey_c, executes the value of fkey_c when the X * function key that generates ESC O c is pressed. X * X * If "name" is specified, use environment var name_c. X * X * John R. MacMillan X */ X X#include <sys/termio.h> X#include <string.h> X X#ifndef NULL X# define NULL (0) X#endif X#define BUFSIZE 50 X#define MAXARGS 100 X Xmain( argc, argv ) Xint argc; Xchar **argv; X{ X struct termio old, new; X char key, *name, buffer[BUFSIZE], *bufp, *cmd; X int nchars, status; X char *strcpy(), *getenv(); X int ioctl(), read(), strlen(), puts(), fork(), execl(), wait(); X void exit(); X X if ( argc == 1 ) X name = *argv; X else X name = *++argv; X X /* X * Set up the terminal to read the char that should be buffered X */ X X if ( ioctl( 0, TCGETA, &old ) == -1 ) X exit( -1 ); X new = old; X new.c_lflag &= ~ICANON; X new.c_cc[VMIN]=1; X new.c_cc[VTIME]=0; X if ( ioctl( 0, TCSETA, &new ) == -1 ) X exit( -1 ); X X /* X * Read the char and reset the terminal X */ X X nchars = read( 0, &key, 1 ); X if ( ioctl( 0, TCSETA, &old ) == -1 ) X exit( -1 ); X X if ( nchars != 1 ) X exit( nchars ); X X /* X * Create the name of the environment variable X */ X X bufp = strcpy( buffer, name ); X bufp += strlen( buffer ); X *bufp++ = '_'; X *bufp++ = key; X *bufp = '\0'; X X /* X * Get the variable X */ X X if ( (cmd = getenv( buffer )) == NULL ) X exit( 1 ); X X if ( *cmd == '$' ) { X /* X * Print an environment variable X */ X cmd = getenv( ++cmd ); X (void) puts( cmd ); X } else { X /* X * Get the ksh to execute it X */ X switch( fork() ) { X case -1: X exit( -1 ); X break; X case 0: X (void) execl( "/bin/ksh", "ksh", "-c", cmd, 0 ); X exit( -1 ); X break; X default: X (void) wait( &status ); X exit( status>>8 ); X } X } X exit( 0 ); X X/*NOTREACHED*/ X} BOP_BOP_A_LOO_WOP_BO_LOP_BAM_BOOM set -- `wc -c fkey.c` if [ "$1" != "1880" ] ; then echo "shar: fkey.c unpacked with wrong size!" fi fi exit -- John R. MacMillan jrmacmillan@dragon.waterloo.edu If the universe fits, wear it. ...!watmath!dragon!jrmacmillan