Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/5/84; site ur-cvsvax.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!think!harvard!seismo!rochester!ur-cvsvax!bill From: bill@ur-cvsvax.UUCP (Bill Vaughn) Newsgroups: net.unix Subject: Re: Useful csh prompts? (with code diffs) Message-ID: <229@ur-cvsvax.UUCP> Date: Fri, 4-Oct-85 11:21:24 EDT Article-I.D.: ur-cvsva.229 Posted: Fri Oct 4 11:21:24 1985 Date-Received: Mon, 7-Oct-85 02:42:05 EDT References: <1852@brl-tgr.ARPA> Organization: Center for Visual Science, U. of Rochester Lines: 403 > A lifelong ambition of mine has been to have csh give me the current > time as my prompt (Ok, current time, and history number, to get greedy). > > Would this involve source modification of csh? Or can I massage it? > > James Turner > (The Ringworld Engineer) > If one has the source code one might as well do it there. Here are some diffs for sh.c and sh.dir.c which will give you the time and/or current directory in your prompt (and of course the event number). I was originally doing this with very cumbersome aliases but I decided that if the '\!' has special meaning in the prompt why not other characters as well. It works like a charm. In fact, I had only added '@' to serve as a code for 'pwd'. It took me only a few minutes to install a change to display the time (code = '&'). Thanks for the idea. You really only have to change /usr/src/csh/sh.c and remake to install these changes. However, given that my original intention concerned putting the 'pwd' in the prompt, I needed to make some changes in /usr/src/csh/sh.dir.c to eliminate some redundancies. These changes supress the printing of the 'pwd' after the 'pushd' or 'popd' commands. The 'dirs' command can do that if you really want it. I use aliases. I also changed the output of the dirs command so that using 'pd +n' is easier. The fix posted by Chris Berten (pixutl!chris) almost a year ago to this day concerning the correct display of the 'pwd' for directories thru symbolic links is in there too; i.e. if, say, /usr/sys@->/sys then a 'cd /usr/sys ; pwd' displays /sys and NOT /usr/sys) The following diffs are against the original distribution code with those diffs irrelevant to present purposes deleted. Hence your line numbers may vary. I've also included some aliases I find useful in conjunction with these changes. Enjoy! *** orgs/sh.c Thu Oct 3 14:45:10 1985 --- sh.c Thu Oct 3 22:46:50 1985 *************** *** 2,5 #include "sh.h" #include /* --- 4,8 ----- #include "sh.h" + #include "sh.dir.h" #include /* *************** *** 18,21 char HIST = '!'; char HISTSUB = '^'; bool nofile; bool reenter; --- 26,32 ----- char HIST = '!'; char HISTSUB = '^'; + char CWD = '@'; + char BKSL = '\\'; + char TME = '&'; bool nofile; bool reenter; *************** *** 739,750 if (fseekp == feobp) if (!whyles) ! for (cp = value("prompt"); *cp; cp++) ! if (*cp == HIST) ! printf("%d", eventno + 1); ! else { ! if (*cp == '\\' && cp[1] == HIST) ! cp++; ! putchar(*cp | QUOTE); ! } else /* --- 754,758 ----- if (fseekp == feobp) if (!whyles) ! doprompt(); else /* *************** *** 841,844 } dosource(t) register char **t; --- 849,875 ----- } + doprompt() + { + char *cp; + + for (cp = value("prompt"); *cp; cp++) { + if (*cp == HIST) + printf("%d",eventno+1); + else if (*cp == CWD) + printf("%s",dcwd->di_name); + else if (*cp == TME) { + long l = (long)time(0); + struct tm *t = (struct tm *)localtime(&l); + printf("%02d:%02d",t->tm_hour,t->tm_min); + } + else { + char c = *(cp + 1); + if (*cp == BKSL && (c == HIST || c == CWD || c == TME)) + cp++; + putchar(*cp | QUOTE); + } + } + } + dosource(t) register char **t; *** orgs/sh.dir.c Wed Mar 27 13:27:00 1985 --- sh.dir.c Thu Oct 3 16:02:06 1985 *************** *** 14,17 static char *fakev[] = { "dirs", NOSTR }; /* * dinit - initialize current working directory --- 16,22 ----- static char *fakev[] = { "dirs", NOSTR }; + #define PRENABLE 0 /* change this back to 1 for old behavior */ + #define PRDISABLE 0 + /* * dinit - initialize current working directory *************** *** 38,42 dhead.di_next = dhead.di_prev = dp; dp->di_next = dp->di_prev = &dhead; ! printd = 0; dnewcwd(dp); } --- 43,47 ----- dhead.di_next = dhead.di_prev = dp; dp->di_next = dp->di_prev = &dhead; ! printd = PRDISABLE; dnewcwd(dp); } *************** *** 51,54 bool lflag; char *hp = value("home"); if (*hp == '\0') --- 56,60 ----- bool lflag; char *hp = value("home"); + register i; if (*hp == '\0') *************** *** 62,65 lflag = 0; dp = dcwd; do { if (dp == &dhead) --- 68,72 ----- lflag = 0; dp = dcwd; + i = 0; do { if (dp == &dhead) *************** *** 65,69 if (dp == &dhead) continue; ! if (!lflag && hp != NOSTR) { dtildepr(hp, dp->di_name); } else --- 72,77 ----- if (dp == &dhead) continue; ! printf("%d:",i++); /* This helps with pd +n commands */ ! if (!lflag && hp != NOSTR) dtildepr(hp, dp->di_name); else *************** *** 67,71 if (!lflag && hp != NOSTR) { dtildepr(hp, dp->di_name); ! } else printf("%s", dp->di_name); printf(" "); --- 75,79 ----- if (!lflag && hp != NOSTR) dtildepr(hp, dp->di_name); ! else printf("%s", dp->di_name); printf("\n"); *************** *** 69,73 } else printf("%s", dp->di_name); ! printf(" "); } while ((dp = dp->di_prev) != dcwd); printf("\n"); --- 77,81 ----- else printf("%s", dp->di_name); ! printf("\n"); } while ((dp = dp->di_prev) != dcwd); } *************** *** 71,75 printf(" "); } while ((dp = dp->di_prev) != dcwd); - printf("\n"); } --- 79,82 ----- printf("\n"); } while ((dp = dp->di_prev) != dcwd); } *************** *** 93,97 register struct directory *dp; ! printd = 0; if (*++v == NOSTR) { if ((cp = value("home")) == NOSTR || *cp == 0) --- 100,104 ----- register struct directory *dp; ! printd = PRDISABLE; if (*++v == NOSTR) { if ((cp = value("home")) == NOSTR || *cp == 0) *************** *** 101,105 cp = savestr(cp); } else if ((dp = dfind(*v)) != 0) { ! printd = 1; if (chdir(dp->di_name) < 0) Perror(dp->di_name); --- 108,112 ----- cp = savestr(cp); } else if ((dp = dfind(*v)) != 0) { ! printd = PRENABLE; if (chdir(dp->di_name) < 0) Perror(dp->di_name); *************** *** 130,133 register char **cdp; struct varent *c; cp = globone(cp); --- 137,141 ----- register char **cdp; struct varent *c; + char *realdname(); cp = globone(cp); *************** *** 143,147 strcat(buf, cp); if (chdir(buf) >= 0) { ! printd = 1; xfree(cp); cp = savestr(buf); --- 151,155 ----- strcat(buf, cp); if (chdir(buf) >= 0) { ! printd = PRENABLE; xfree(cp); cp = savestr(buf); *************** *** 157,161 xfree(cp); cp = savestr(dp); ! printd = 1; goto gotcha; } --- 165,169 ----- xfree(cp); cp = savestr(dp); ! printd = PRENABLE; goto gotcha; } *************** *** 173,176 cp = dp; } dcanon(cp); return (cp); --- 181,185 ----- cp = dp; } + cp = realdname(cp); dcanon(cp); return (cp); *************** *** 187,191 register struct directory *dp; ! printd = 1; if (*++v == NOSTR) { if ((dp = dcwd->di_prev) == &dhead) --- 196,200 ----- register struct directory *dp; ! printd = PRENABLE; if (*++v == NOSTR) { if ((dp = dcwd->di_prev) == &dhead) *************** *** 257,261 register struct directory *dp, *p; ! printd = 1; if (*++v == NOSTR) dp = dcwd; --- 266,270 ----- register struct directory *dp, *p; ! printd = PRENABLE; if (*++v == NOSTR) dp = dcwd; *************** *** 274,279 if (dp == dcwd) dnewcwd(p); - else - dodirs(fakev); dfree(dp); } --- 283,286 ----- if (dp == dcwd) dnewcwd(p); dfree(dp); } *************** *** 357,359 if (printd) dodirs(fakev); } --- 364,379 ----- if (printd) dodirs(fakev); + } + + char *realdname(d) + char *d; + { + struct stat st; + char *getwd(); + char path[BUFSIZ]; + + lstat(d, &st); + if((st.st_mode & S_IFMT) != S_IFLNK) + return(d); + return(savestr(getwd(path))); } ********************* Some useful aliases: alias d dirs alias pd pushd alias pp popd alias cd 'pushd \!* ; prune' alias pdd 'pushd ; dirs' alias ppd 'popd ; dirs' alias cdd 'pushd \!* ; prune ; dirs' # # The prune alias keeps the directory stack a constant size # alias prune 'set zqk = `dirs` ; @ zqk = $#zqk - 1 ; if($zqk \!= 0) popd +$zqk ; unset zqk' _________________________________ \ Bill Vaughn / \ Center for Visual Science / / University of Rochester \ /seismo!rochester!ur-cvsvax!bill\ / ur-cvsvax!bill@rochester.arpa \ -----------------------------------