roseann@polyof.poly.edu (RoseAnn Ammendolea) (10/20/90)
I am working on a senior project to rewrite the history function for UNIX. My goal is to have the new history functon work like it does in MS_DOS. i.e. I want to be able to call up past commands and edit them by using the control <hjkl> characters. Additionally, I would like to write this as a stand alone program so that I do not have to rewrite the shell. The main approach I will use will be to store the previous commands in alinked list. My only problem is that I do not know how to intercept the commandonce it has been entered, before it gets executed. Likewise, I do ont know how to execute the command once I have retreived it form the list. i.e. I want to display the command for possible editting and execute it when the carriage return is pressed. If there is anyone out there that has some ideas or suggestions, they would be greatly appreciated. Also if anyone knows where I might be able to find the source code for the present HISTORY function or the R function I would like to know so I can look at it and gain some insight to my project. P.S. Please do not send replys to posters address use the address in the reply-to header. Thank You. Mark
avg@hq.demos.su (Vadim G. Antonov) (10/20/90)
In article <1990Oct19.170143.7674@polyof.poly.edu> mhoffman@george.poly.edu writes: > > I am working on a senior project to rewrite the history function for UNIX. My goal is to have the new history functon work like it does in MS_DOS. >i.e. I want to be able to call up past commands and edit them by using the >control <hjkl> characters. Additionally, I would like to write this as a stand alone program so that I do not have to rewrite the shell. I've written the such program (it's about 50 lines :-) sorry but I haven't it handy. To use it one should add the following alias to .cshrc: alias r 'eval `history | redo`' so if you want to edit previous lines you should enter the command r. This program was died because we (Sergey Ryzhkov & I) have made our own revision of csh with builtin line-editing facility. (So there is no need to enter commands to go to editing mode). It was not so simple because Unix tty drivers handle modes switching in the very *ugly* way - I've spent a week trying to make a sequence allowing do it without flushing characters. (Oh I use to type commands *before* a prompt appears :-). Another problem was the proper processing of ^Z and ^Y - some our ttys used this chars (as well as ^Q and ^S) in escape sequences. We decided to read all characters as ordinary ones and process it in program - and I had to hack tty driver to allow TIOCSTART and TIOCSTOP to work with ordinary ttys as well as with ptys. Problem with ^Z/^Y was solved by non-trivial hack in csh's internals. Anyway it was done and works under DEMOS 2.2. Thus I suggest you to do the thing in the first way, it's much simplier and practically as suitable as the second for an endluser. Vadim Antonov DEMOS, Moscow, USSR
ping@cubmol.bio.columbia.edu (Shiping Zhang) (10/22/90)
In article <1990Oct19.170143.7674@polyof.poly.edu> mhoffman@george.poly.edu writes: > I am working on a senior project to rewrite the history function for UNIX. My goal is to have the new history functon work like it does in MS_DOS. >i.e. I want to be able to call up past commands and edit them by using the >control <hjkl> characters. Additionally, I would like to write this as a stand alone program so that I do not have to rewrite the shell. We have a shell script which lets you edit history commands before they are reexecuted. -ping
oscarh@hpdmd48.boi.hp.com (Oscar Herrera) (10/22/90)
The main approach I will use will be to store the previous commands in alinked list. My only problem is that I do not know how to intercept the commandonce it has been entered, before it gets executed. Likewise, I do ont know how to execute the command once I have retreived it form the list. i.e. I want to display the command for possible editting and execute it when the carriage return is pressed. Thank You. Mark ---------- If your version of un*x supports the command script, you may extract the history from the script output file. script is a terminal session recorder.
tchrist@convex.COM (Tom Christiansen) (10/23/90)
In article <1990Oct21.010205.24695@cbnewsh.att.com> wcs@cbnewsh.att.com (Bill Stewart 201-949-0705 erebus.att.com!wcs) writes: >The old Bourne shell (/bin/sh) doesn't do history. >The C shell does, with the ugly !! command-based interface. >The Korn shell (ksh) does history, stores it in a file, and gives > you an editor-interface as well as a command-based interface. >Various intellectual derivatives like BASH and tcsh are similar. >The 9th edition shell gave you something lean, mean, and clean, as always. >The adventure shell doesn't have history, but it has xyzzy. :-) I want *both* real history editing, as in ksh's real vi mode and not tcsh's abortion of the same, as well as expression history (!f:s/x/b), which may be ugly, but is quite convenient. But ksh won't do asynch job notification, key rebinding, or spelling correction, so I'm stuck with an abomination of a shell. --tom
gwyn@smoke.BRL.MIL (Doug Gwyn) (10/25/90)
In article <107567@convex.convex.com> tchrist@convex.COM (Tom Christiansen) writes: >But ksh won't do asynch job notification, key rebinding, or spelling >correction, so I'm stuck with an abomination of a shell. Those are all available (spelling correction only for "cd" targets, though) in the BRL edition of the Bourne shell, available to SVR2 source licensees.
pbm@hpfcdc.HP.COM (Peter McLain) (10/26/90)
>which may be ugly, but is quite convenient. But ksh won't do asynch job >notification, key rebinding, or spelling correction, so I'm stuck with an >abomination of a shell. You can get asynch job notification in ksh88 by doing: trap "jobs -n" CHLD Peter McLain Hewlett-Packard 3404 East Harmony Road pbm%hpfclj@hplabs.HP.COM Fort Collins UUCP: hplabs!hpfcla!pbm CO 80525-9599
shannon@datsun.Sun.COM (Bill Shannon) (10/28/90)
Several people suggested: > You can get asynch job notification in ksh88 by doing: > > trap "jobs -n" CHLD This is almost, but not quite, good enough for what I want. I want to be able to emulate both the csh "set notify" command and the csh "notify" command. The above emulates only the "set notify" command. Here's a message I set to Korn on this subject some time ago: From shannon Sat May 27 02:24:58 1989 To: dgk@ulysses.att.com Subject: traps I'm playing around with trapping SIGCHLD to emulate the csh notify command. the following code in io_intr() causes a newline to be printed every time you execute the trap handler, even if it produces no other output. if(sh.trapnote&TRAPSET) { newline(); fp = st.standin; sh_chktrap(); io_clear(fp); return(0); } for example, do trap true CHLD sleep 5 & there might be cases where the newline is helpful, but in this case it makes it impossible for me to do what I want to do. (that coupled with the fact that functions can't effect the traps of the mainline shell. otherwise I could set and unset the trap when necessary and that might be good enough.) how do you feel about removing that call to newline(), or at least making it conditional on something so it won't happen when catching SIGCHLD? FYI, here's as far as I've gotten with my notify emulation. this works pretty well, but I think there's other problems in the shell that prevent it from working perfectly. for instance, if I do sleep 5 & sleep 5 & notify %1 %2 sometimes it tells me about both jobs and sometimes it loses one of the jobs. any ideas what else could be wrong? trap _notify CHLD NOTIFY_ALL=false unset NOTIFY_LIST _notify() { typeset i j if $NOTIFY_ALL then jobs -n else for i in ${NOTIFY_LIST[*]} do j=`jobs -n %$i` if [ "$j" ] then echo "$j" unset NOTIFY_LIST[$i] fi done fi } notify() { typeset i j if (($# == 0)) then NOTIFY_ALL=true else for i in "$@" do # turn any valid job specification into a job number j=`jobs "$i"` case "$j" in \[*) j=${j%% *} j=${j%\]} j=${j#\[} NOTIFY_LIST[$j]=$j ;; esac done fi } unnotify() { if (($# == 0)) then NOTIFY_ALL=false else # XXX - not done yet : fi }