home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume7 / kashe < prev    next >
Text File  |  1989-07-28  |  19KB  |  708 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v07i109: kashe - change directory by menu
  3. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  4. Reply-To: jack@cs.glasgow.ac.uk
  5.  
  6. Posting-number: Volume 7, Issue 109
  7. Submitted-by: jack@cs.glasgow.ac.uk
  8. Archive-name: kashe
  9.  
  10. The following stuff saves me a LOT of typing directory names.  Needs the
  11. Korn shell.  I've been using it unchanged for months, but it's only been
  12. tested on Sun 3 machines.  Much easier to use than to describe.
  13.  
  14. RTFM before trying to use it - it helps to have 'lc', and your environment
  15. needs to be set up right.  The details on using it if ksh isn't your login
  16. shell are there to help proselytize for ksh among users of other shells.
  17.  
  18. best wishes - jack
  19.  
  20. #--------------------------------CUT HERE-------------------------------------
  21. #! /bin/sh
  22. #
  23. # This is a shell archive.  Save this into a file, edit it
  24. # and delete all lines above this comment.  Then give this
  25. # file to sh by executing the command "sh file".  The files
  26. # will be extracted into the current directory owned by
  27. # you with default permissions.
  28. #
  29. # The files contained herein are:
  30. #
  31. # -rw-r-----  1 jack         9439 Jul 28 19:10 kashe.1
  32. # -rw-r-----  1 jack         6819 Jul 28 19:24 .kshenv
  33. #
  34. echo 'x - kashe.1'
  35. if test -f kashe.1; then echo 'shar: not overwriting kashe.1'; else
  36. sed 's/^X//' << '________This_Is_The_END________' > kashe.1
  37. X.TH KASHE 1 "7 January 1989" "Jack Campin" "KSH(1) FUNCTIONS"
  38. X
  39. X.SH NAME
  40. X
  41. Xu, d, c, g, p, csort, cdrop, cwipe, csave, cload, cgrep, chelp \- quicker ways
  42. Xto change directory
  43. X
  44. X.SH SYNOPSIS
  45. X
  46. X.B u
  47. X.LP
  48. X.B d
  49. X[
  50. X.I directory
  51. X]
  52. X.LP
  53. X.B c
  54. X[
  55. X.I directory
  56. X]
  57. X.LP
  58. X.B g
  59. X.I number
  60. X.LP
  61. X.B p
  62. X.I pattern
  63. X.LP
  64. X.B csort
  65. X.LP
  66. X.B cdrop
  67. X.LP
  68. X.B cwipe
  69. X[
  70. X.I pattern
  71. X]
  72. X.LP
  73. X.B csave
  74. X[
  75. X.I file
  76. X]
  77. X.LP
  78. X.B cload
  79. X[
  80. X.I file
  81. X]
  82. X.LP
  83. X.B cgrep
  84. X.I pattern
  85. X.LP
  86. X.B chelp
  87. X
  88. X.SH DESCRIPTION
  89. X
  90. XThis is a collection of Korn shell (
  91. X.I ksh (1)
  92. X) functions I wrote after having to
  93. Xswitch between different directories a lot.  I am a pretty hopeless typist,
  94. Xand even with
  95. X.I ksh's
  96. Xcommand-edit-and-retry features, it was getting boring
  97. Xentering something like
  98. X
  99. X.br
  100. X    cd /bakcuppisa/users/jack/oscar/parse
  101. X
  102. Xand then having to change the "kc" to "ck".
  103. X
  104. XSo these functions give you a zippy menu interface to
  105. X.I cd.
  106. XTheir rationale is that most people most of the time only switch between a
  107. Xrelatively small "working set" of directories; these functions are intended to
  108. Xmake this set easily accessible.  By far the most frequent commands in Unix are
  109. X.I cd, pwd,
  110. Xand
  111. X.I ls;
  112. Xthese functions improve the interface to all of these.  I use them together
  113. Xwith a prompt line that displays my current directory, hence the "<pathname>\ $
  114. X" prompts below.  The functions fall into two groups; the first maintains a
  115. Xcache of "interesting" directories, which you might use like this (assuming
  116. Xthe 3 directories below are in the cache already):
  117. X
  118. X.br
  119. X    /pisa/users/jack $ c
  120. X.br
  121. X    1) /usr/spool/news/comp/binaries/mac
  122. X.br
  123. X    2) /usr/lib/tex
  124. X.br
  125. X    3) /backuppisa/users/jack
  126. X.br
  127. X    4) New...
  128. X.br
  129. X    number? 1
  130. X.br
  131. X    /usr/spool/news/comp/binaries/mac $
  132. X
  133. XThose directories might have got there by the following session, starting from
  134. Xempty:
  135. X
  136. X.br
  137. X    /pisa/users/jack $ c
  138. X.br
  139. X    directory? /usr/spool/news/comp/binaries/mac
  140. X.br
  141. X    /usr/spool/news/comp/binaries/mac $ cd /usr/lib
  142. X.br
  143. X    /usr/lib $ c tex
  144. X.br
  145. X    /usr/lib/tex $ cd /backuppisa/users/jack
  146. X.br
  147. X    /backuppisa/users/jack $ c
  148. X.br
  149. X    1) /usr/spool/news/comp/binaries/mac
  150. X.br
  151. X    2) /usr/lib/tex
  152. X.br
  153. X    3) New...
  154. X.br
  155. X    number? 3
  156. X.br
  157. X    directory? .
  158. X.br
  159. X    /backuppisa/users/jack $ cd
  160. X.br
  161. X    /pisa/users/jack $
  162. X
  163. XExtra items can be added at any time.  Directories can be specified any way
  164. Xyou like, including tilde aliases.  Directories in the cache are represented
  165. Xby absolute pathname.
  166. X.PP
  167. XThus
  168. X.B c
  169. Xhas three modes of operation -
  170. X.I cd
  171. Xto a cached directory by menu; add a new one to the cache when prompted and
  172. X.I cd
  173. Xto it; or add
  174. X.I directory
  175. Xto the cache and
  176. X.I cd
  177. Xto it, sidestepping the menu.  Only valid directories can be added this way.
  178. XThus you can use it where you would previously have used
  179. X.I cd,
  180. Xto load your cache.
  181. X.PP
  182. XThere is also a "goto" for use when you know the menu item number you want
  183. X(typically, just after you've typed the wrong number to
  184. X.B c
  185. Xand still have the menu in front of you):
  186. X
  187. X.br
  188. X    /pisa/users/jack $ g 2
  189. X.br
  190. X    /usr/lib/tex $
  191. X
  192. XAnd a "goto by pattern" which scans the cache looking for a match:
  193. X
  194. X.br
  195. X    /usr/lib/tex $ p mac
  196. X.br
  197. X    /usr/spool/news/comp/binaries/mac $
  198. X
  199. X.B  p
  200. Xwill give you a menu if more than one directory in the cache matches the
  201. Xpattern.  The pattern syntax is as for
  202. X.I egrep (1).
  203. XYou will usually be able to find a very short string that uniquely identifies
  204. Xyour target.  I find this more useful than
  205. X.B g.
  206. X.PP
  207. X.B csort
  208. Xsorts the cache, eliminating duplicated entries.
  209. X.B cdrop
  210. Xdeletes directories from it; enter the numbers of the items to delete when
  211. Xprompted.
  212. X.B cwipe
  213. Xwill either clear it completely, or, if given a pattern argument, will just
  214. Xremove items matching that pattern.
  215. X.B csave
  216. Xsaves the cache to a file.
  217. X.B cload
  218. Xreloads it, appending the file to your current cache.
  219. X.PP
  220. XA less generally useful function in the same group,
  221. X.B cgrep,
  222. Xtakes a string and adds to the
  223. Xcache all accessible directories below your current directory whose pathnames
  224. Xhave a last component containing that string.  It then gives you a menu
  225. Xlike
  226. X.B c.
  227. XIt's intended for finding your way around pieces of software
  228. Xthat scatter themselves in undocumented places all over the file system but use
  229. Xrelated names for all those places.  You won't use this often, and it's slow
  230. X(because of the
  231. X.I ls -R
  232. Xembedded in it) but it will save you much frustration with
  233. X.I find
  234. Xand the like on the rare occasions when you want
  235. Xit.  The string is an
  236. X.I egrep
  237. Xpattern.  Since
  238. X.B cgrep
  239. Xembeds the string in a larger search pattern, some patterns will not work, in
  240. Xparticular those containing "^" or "$" as unescaped metacharacters, or "/".
  241. X.B cgrep
  242. X"" puts the entire tree below the current directory into the cache.
  243. X.PP
  244. XYou can ^C out of a menu selection leaving your directory unchanged.  The
  245. Xcache is kept in a shell variable, so changes to it will not persist when
  246. Xreturning from a subshell unless you
  247. X.B csave
  248. Xbefore exiting and then
  249. X.B cload
  250. Xin the outer shell.
  251. X.PP
  252. XThe second group is a pair of functions that tries to emulate the way you move
  253. Xaround the file system on the Mac - a function
  254. X.B u
  255. Xto go up and
  256. X.B d
  257. Xto go down.  (Originally inspired by my infuriatingly frequent typing of "cd.."
  258. Xfor "cd ..").  It's usually a lot more convenient to use
  259. X.B d
  260. Xin "unknown territory" than to manually list subdirectories and then do
  261. X.I cd;
  262. Xfor one thing,
  263. X.B d
  264. Xfilters out non-directories from its display.  If the target directory has no
  265. Xsubdirectories,
  266. X.B d
  267. Xacts like
  268. X.I cd.
  269. XThere are two alternative forms of
  270. X.B d
  271. Xprovided depending on whether the fast file lister
  272. X.I lc,
  273. X(written by gamiddleton@watmath.uucp and posted to comp.sources.unix in
  274. X1987) is available; comment out the one you don't want.
  275. X.PP
  276. XFinally,
  277. X.B chelp
  278. Xprints out a command synopsis.
  279. X.PP
  280. XBy using both groups of functions, you can move to any point in the file
  281. Xsystem without ever typing a directory name, and get back to it from anywhere
  282. Xwith four or five keystrokes.
  283. X
  284. X.SH ENVIRONMENT
  285. X
  286. XTo get all these into your environment, put them into a file called, say,
  287. X.I .kshenv.
  288. XThe Korn shell finds this file from the variable
  289. X.B ENV.
  290. X(
  291. X.B chelp
  292. Xuses
  293. X.B ENV
  294. Xto find the text it displays.)  The file read or written by
  295. X.B cload
  296. Xand
  297. X.B csave
  298. Xis specified by the filename parameter if one is given; if not, by
  299. X.B KSHDIRFILE
  300. Xif that is set; and as a default, the file
  301. X.I .kshenvdirs
  302. Xin the home directory (this is OK if you always use the same domain).  These
  303. Xfunctions use a shell variable
  304. X.B NL
  305. Xwhich should always contain a newline.  This is simply to make the code easier
  306. Xto read.
  307. X.PP
  308. XHow you set up this environment depends on what
  309. Xyour login shell is.
  310. X
  311. X.PP
  312. X.B Korn shell:
  313. Xadd the lines
  314. X
  315. X.br
  316. X    ENV=.kshenv \ \ export ENV
  317. X.br
  318. X    KSHDIRFILE=~/.`domainname`-dirs \ \ export KSHDIRFILE
  319. X
  320. Xto your
  321. X.I .profile.
  322. XTo get the prompt line, also add
  323. X
  324. X.br
  325. X    PS1='${PWD} $' \ \ export PS1
  326. X.PP
  327. XTo preload the cache at login time, also add to your
  328. X.I .profile
  329. Xthe lines
  330. X
  331. X.br
  332. X    .\ \ $ENV
  333. X.br
  334. X    cload
  335. X
  336. X.PP
  337. X.B C shell:
  338. Xadd the lines
  339. X
  340. X.br
  341. X    setenv ENV .kshenv
  342. X.br
  343. X    setenv KSHDIRFILE \ \  ~/.`domainname`-dirs
  344. X
  345. Xto your
  346. X.I .login
  347. Xand add
  348. X
  349. X.br
  350. X    PS1='${PWD} $' \ \ export PS1
  351. X
  352. Xto your
  353. X.I .kshenv.
  354. X
  355. X.PP
  356. X.B Bourne shell:
  357. Xadd the lines
  358. X
  359. X.br
  360. X    ENV=.kshenv \ \ export ENV
  361. X.br
  362. X    KSHDIRFILE=~/.`domainname`-dirs \ \ export KSHDIRFILE
  363. X
  364. Xto your
  365. X.I .profile
  366. Xand add
  367. X
  368. X.br
  369. X    PS1='${PWD} $' \ \ export PS1
  370. X
  371. Xto your
  372. X.I .kshenv.
  373. X
  374. X.SH FILE FORMAT
  375. X
  376. XA cache file is simply a list of full pathnames of directories terminated by
  377. Xnewlines.
  378. X
  379. X.SH DIAGNOSTICS
  380. X
  381. XError messages are printed if these functions are called with the wrong number
  382. Xof parameters, if files can't be read or written, or if commands used by the
  383. Xfunctions fail.  The exit code returned is 1 when a failure or a signal is
  384. Xdetected, otherwise 0.
  385. X
  386. X.SH BUGS
  387. X
  388. XIf you have more directories in the cache than will fit on the screen
  389. X(this might happen after using
  390. X.B cgrep
  391. X) you'll have problems seeing them with
  392. X.B c
  393. Xor
  394. X.B cdrop.
  395. XThere is no way to avoid this as far as I know.  The workaround is to
  396. X.B csave,
  397. Xedit the file, and then
  398. X.B cload
  399. Xagain.
  400. X.PP
  401. XYou will sometimes get insane error messages if you enter random
  402. Xstrings instead of numbers.  This is
  403. X.I ksh's
  404. Xfault and nothing can be done about it.
  405. X.PP
  406. XThese functions don't handle directory names with embedded newlines.  Embedded
  407. Xspaces are OK, though; embedded tabs are invisible in the menus but otherwise
  408. Xseem to work (and if you embed tabs in directory names you deserve to have
  409. Xproblems, anyway).
  410. X.PP
  411. XIf anyone has bug reports or ideas for improvement, let me know.  I suspect
  412. Xsymbolic links may not be handled quite right, but haven't found a definite
  413. Xbug there yet.  The same ideas can be used for maintaining caches of strings
  414. Xin general; it would not be trivial to modify these into a general-purpose
  415. Xstring cache manager but might be worth doing someday.
  416. X.PP
  417. XAn undo facility would be easy enough to add; anyone want it?
  418. X
  419. X.SH KLUDGE
  420. X
  421. XYou need multiple cache files if you log in from more than one server, given
  422. Xthe inconsistencies in Glasgow's present NFS naming scheme - the same
  423. Xdirectory has pathname
  424. X.I /pisa
  425. Xfrom a login on vanuata and
  426. X.I /vanuata.pisa
  427. Xfrom a login on hawaii.  Hence the need for the
  428. X.B KSHDIRFILE
  429. Xvariable, to say which is the right cache file for the domain you're logged
  430. Xin to.  If you only ever use one domain you can ignore this.
  431. X
  432. X.SH SECTARIAN BRAG
  433. X
  434. XYou don't have a prayer of adapting these to the antediluvian C or Bourne
  435. Xshells while still getting useful speed.
  436. X
  437. X.SH AUTHOR
  438. X
  439. XJack Campin, Glasgow University Computing Science Department, 17 Lilybank
  440. XGardens, Glasgow G12 8QQ, Scotland (jack@cs.glasgow.ac.uk)
  441. ________This_Is_The_END________
  442. if test `wc -c < kashe.1` -ne 9439; then
  443.     echo 'shar: kashe.1 was damaged during transit (should have been 9439 bytes)'
  444. fi
  445. fi        ; : end of overwriting check
  446. echo 'x - .kshenv'
  447. if test -f .kshenv; then echo 'shar: not overwriting .kshenv'; else
  448. sed 's/^X//' << '________This_Is_The_END________' > .kshenv
  449. X# ".kshenv" (or rename to whatever ENV is set to).
  450. X
  451. X# An assortment of functions for moving around the file
  452. X# system with fewer keystrokes, using a menu interface.
  453. X
  454. X# Jack Campin, 1988
  455. X
  456. X##  u             - up
  457. X##  d [directory] - down [from "directory"]
  458. X##  c [directory] - cd to a cached (or new) directory by menu,
  459. X##                  or add "directory" to the cache and cd to it
  460. X##  g number      - cd to a cached directory by number rather than menu
  461. X##  p pattern     - cd to a cached directory containing "pattern"
  462. X##  csort           - sort directory cache, removing duplicate entries
  463. X##  cdrop           - remove entries from cache; enter number(s) when prompted
  464. X##  cwipe [pattern] - empty the cache, or remove the items matching "pattern"
  465. X##  csave [file]    - write cache to a file, default $KSHDIRFILE or .kshenvdirs
  466. X##  cload [file]    - read cache from a file, default $KSHDIRFILE or .kshenvdirs
  467. X##  cgrep pattern   - cd to a menu-given directory below the current directory
  468. X##                    whose last component contains "pattern", adding all such
  469. X##                    directories to the cache
  470. X##  chelp           - print this synopsis
  471. X
  472. X# These use a cache of newline-separated directories in a variable KSHENVDIRS.
  473. X
  474. Xalias -t awk cat egrep lc ls sed sort tr  # speeds things up a bit
  475. X
  476. XNL="
  477. X"  export NL    # newline, used for IFS; variable used for readability
  478. X
  479. Xfunction c {
  480. X    typeset ifs="$IFS"  ps3="$PS3"
  481. X    trap 'IFS="$ifs" ;  PS3="$ps3"  ;  return 1'  1 2 3 4 5 6 7 8 14 15
  482. X    typeset j  i  val=1  ;  IFS="$NL"
  483. X    if    [ $# != 0 ]
  484. X    then    j=$1
  485. X    else    if    [ "$KSHENVDIRS" != "" ]
  486. X        then    PS3="number? "
  487. X            select i in $KSHENVDIRS New...
  488. X            do    [ "$i" = "New..." ]        &&  break
  489. X                test -n "$i"  &&   cd $i   ||  continue
  490. X                IFS="$ifs"  ;  PS3="$ps3"  ;   return 0
  491. X            done
  492. X        fi
  493. X        read j?"directory? "
  494. X    fi
  495. X    if    [ "$j" != "" ]    # not interrupted while reading
  496. X    then    if    eval cd $j    # makes tilde substitution work
  497. X        then    # avoid introducing a duplicate
  498. X            typeset x="$PWD"
  499. X            for i in $KSHENVDIRS
  500. X            do    [ "$x" = "$i" ]  &&  x=""  &&  break
  501. X            done
  502. X            KSHENVDIRS="$KSHENVDIRS$x$NL"  export KSHENVDIRS
  503. X            val=0
  504. X        fi
  505. X    fi
  506. X    IFS="$ifs"  ;  PS3="$ps3"  ;  return $val
  507. X}
  508. X
  509. Xfunction g {
  510. X    typeset ifs="$IFS"
  511. X    trap 'IFS="$ifs"  ;  return 1'  1 2 3 4 5 6 7 8 14 15
  512. X    IFS="$NL"
  513. X    if    [ $# != 1 ]
  514. X    then    print "Usage: g <number>" 1>&2
  515. X    else    typeset -i n=0  ;  typeset j
  516. X        for j in $KSHENVDIRS
  517. X        do    (( n = $n + 1 ))
  518. X            [ $n = $1 ]  ||  continue
  519. X            cd $j  &&  IFS="$ifs"  &&  return 0
  520. X            IFS="$ifs"  ;  return 1
  521. X        done
  522. X        print "g: no directory number $1" 1>&2
  523. X    fi
  524. X    IFS="$ifs"  ;  return 1
  525. X}
  526. X
  527. Xfunction p {
  528. X    [ $# != 1 ]    &&  print "Usage: p pattern" 1>&2  &&  return 1
  529. X    [ "$1" = "" ]  &&  print "p: null argument" 1>&2  &&  return 1
  530. X    typeset ifs="$IFS"  ps3=$PS3
  531. X    trap 'IFS="$ifs"  ;  PS3="$ps3"  ;  return 1'  1 2 3 4 5 6 7 8 14 15
  532. X    typeset i val=1 dirs="`print "$KSHENVDIRS" | egrep "$1"`"  ;  IFS="$NL"
  533. X    if    [ "$dirs" = "" ]
  534. X    then    print "p: no match found for '""$1""'" 1>&2
  535. X    else    set $dirs
  536. X        if    [ ${#*} = 1 ]
  537. X        then    cd $dirs  ;  val=0
  538. X        else    PS3="number? "
  539. X            select i in $dirs
  540. X            do    cd $i  &&  val=0  &&  break
  541. X            done
  542. X        fi
  543. X    fi
  544. X    IFS="$ifs"  ;  PS3=$ps3
  545. X    return $val
  546. X}
  547. X
  548. Xfunction csort {
  549. X    typeset ifs="$IFS"
  550. X    trap 'IFS=" "  ;  return 1'  1 2 3 4 5 6 7 8 14 15
  551. X    IFS="$NL"
  552. X    KSHENVDIRS=`print "$KSHENVDIRS" | sort -u`$NL   export KSHENVDIRS
  553. X    IFS="$ifs"
  554. X}
  555. X
  556. Xfunction cdrop {
  557. X    [ "$KSHENVDIRS" = "" ]   &&  print "cdrop: nothing to drop" 1>&2  &&  return 0
  558. X    typeset ifs="$IFS"  ps3="$PS3"  i
  559. X    trap 'IFS="$ifs"  ;  PS3="$ps3"  ;  return 1'  1 2 3 4 5 6 7 8 14 15
  560. X    PS3="numbers to drop? "  ;  IFS="$NL"
  561. X    select i in $KSHENVDIRS
  562. X    do    typeset -i m=0  ;  typeset y="$KSHENVDIRS"
  563. X        for m in `print $REPLY | tr ' \011' '\012'`  # sidestep IFS
  564. X        do    typeset x=""  ;  typeset j  ;  typeset -i n=0
  565. X            for j in $y
  566. X            do    (( n = $n + 1 ))
  567. X                if    [ $m = $n ]
  568. X                then    x="$x@$NL"    # tombstone value
  569. X                else    x="$x$j$NL"
  570. X                fi
  571. X            done
  572. X            y="$x"
  573. X        done
  574. X        typeset tmp=""
  575. X        for i in $y    # edit out the tombstones
  576. X        do    [ $i != "@" ]  &&  tmp="$tmp$i$NL"
  577. X        done
  578. X        KSHENVDIRS="$tmp"  export KSHENVDIRS
  579. X        IFS="$ifs"  ;  PS3="$ps3"  ;  break
  580. X    done
  581. X}
  582. X
  583. Xfunction csave {
  584. X    typeset x
  585. X    case $# in
  586. X    0)    if    [ "$KSHDIRFILE" != "" ]
  587. X        then    x=$KSHDIRFILE
  588. X        else    x=~/.kshenvdirs
  589. X        fi  ;;
  590. X    1)    x=$1  ;;
  591. X    *)    print "Usage: csave [filename]" 1>&2  ;  return 1  ;;
  592. X    esac
  593. X    print "$KSHENVDIRS" > $x
  594. X}
  595. X
  596. Xfunction cload {
  597. X    typeset x
  598. X    case $# in
  599. X    0)    if    [ "$KSHDIRFILE" != "" ]
  600. X        then    x=$KSHDIRFILE
  601. X        else    x=~/.kshenvdirs
  602. X        fi  ;;
  603. X    1)    x=$1  ;;
  604. X    *)    print "Usage: cload [filename]" 1>&2  ;  return 1  ;;
  605. X    esac
  606. X    if    test -r $x
  607. X    then    typeset i  here="$PWD"  tmp="$KSHENVDIRS"  ifs="$IFS"
  608. X        trap 'IFS="$ifs"  ;  return 1'  1 2 3 4 5 6 7 8 14 15
  609. X        IFS="$NL"
  610. X        for i in `cat $x`
  611. X        do    cd "$i"  &&  tmp="$tmp$i$NL"
  612. X            cd "$here"
  613. X        done
  614. X        KSHENVDIRS="$tmp"  export KSHENVDIRS
  615. X    else    print "cload: $x unreadable" 1>&2  ;  IFS="$ifs"  ;  return 1
  616. X    fi
  617. X    IFS="$ifs"
  618. X}
  619. X
  620. Xfunction cwipe {
  621. X    case $# in
  622. X    0)    KSHENVDIRS="" export KSHENVDIRS  ;  return 0   ;;
  623. X    1)    typeset ifs="$IFS"  ;  IFS="$NL"
  624. X        trap 'IFS="$ifs"  ;  return 1'  1 2 3 4 5 6 7 8 14 15
  625. X        typeset i  j  y="$KSHENVDIRS"  tmp=""
  626. X        for j in `print "$KSHENVDIRS" | egrep $1`
  627. X        do    typeset x=""
  628. X            for i in $y
  629. X            do    if    [ "$i" = "$j" ]
  630. X                then    x="$x@$NL"
  631. X                else    x="$x$i$NL"
  632. X                fi
  633. X            done
  634. X            y="$x"
  635. X        done
  636. X        for i in $y    # edit out tombstones
  637. X        do    [ "$i" = "@" ]  ||  tmp="$tmp$i$NL"
  638. X        done
  639. X        KSHENVDIRS="$tmp" export KSHENVDIRS
  640. X        IFS="$ifs"  ;;
  641. X    *)    print "Usage: cwipe [pattern]" 1>&2  ;  return 1  ;;
  642. X    esac
  643. X}
  644. X
  645. Xfunction cgrep {
  646. X    typeset ifs="$IFS"  ps3="$PS3"
  647. X    trap 'IFS="$ifs"  ;  PS3="$ps3"  ;  return 1'  1 2 3 4 5 6 7 8 14 15
  648. X    if    [ $# != 1 ]
  649. X    then    print "Usage: cgrep pattern" 1>&2  ;  return 1
  650. X    fi
  651. X    typeset x="`ls -R        |
  652. X        sed -n '/:$/s/://p'    |
  653. X        egrep '(.*/)*.*'"${1}"'.*([~/])*$'`"
  654. X    typeset i  y=""  here="$PWD"  ;  PS3="number? "  IFS="$NL"
  655. X    for i in $x
  656. X    do    cd $i  &&  y="$y$PWD$NL"  &&  cd $here
  657. X    done
  658. X    KSHENVDIRS="$KSHENVDIRS$y"  export KSHENVDIRS
  659. X    select i in $KSHENVDIRS
  660. X    do    cd $i  &&  break
  661. X    done
  662. X    IFS="$ifs"  ;  PS3=$ps3
  663. X}
  664. X
  665. Xfunction u {
  666. X    cd ..
  667. X}
  668. X
  669. Xfunction d {
  670. X    typeset ifs="$IFS"  ps3="$PS3"  tmp="$PWD"  val=1  i
  671. X    trap 'IFS="$ifs" ; PS3="$ps3" ; cd "$tmp" ; return 1' 1 2 3 4 5 6 7 8 14 15
  672. X    case $# in
  673. X    0)    ;;
  674. X    1)    cd "$1"  ||  return 1  ;;    # test if target is a directory
  675. X    *)    print "Usage: d [directory]" 1>&2  ;  return 1  ;;
  676. X    esac
  677. X    PS3="number? "  ;  IFS="$NL"
  678. X    select i in `lc -d1`
  679. X# slower alternative if "lc" is not available
  680. X# the gross pattern is (empirically) faster than the obvious one
  681. X#    select i in `ls -al |
  682. X#        sed -n '/^d.*/{
  683. X#            s/[^ ]*[ ]*//
  684. X#            s/[^ ]*[ ]*//
  685. X#            s/[^ ]*[ ]*//
  686. X#            s/[^ ]*[ ]*//
  687. X#            s/[^ ]*[ ]*//
  688. X#            s/[^ ]*[ ]*//
  689. X#            s/[^ ]*[ ]*//
  690. X#            s/^\.*$//
  691. X#            p
  692. X#            }'`
  693. X    do    [ "$i" != "" ]  &&  cd $i  &&  val=0  &&  break
  694. X    done
  695. X    IFS="$ifs"  ;  PS3=$ps3  ;  return $val
  696. X}
  697. X
  698. Xfunction chelp {
  699. X    sed -n '/^##/s/^##//p' < $ENV
  700. X}
  701. ________This_Is_The_END________
  702. if test `wc -c < .kshenv` -ne 6819; then
  703.     echo 'shar: .kshenv was damaged during transit (should have been 6819 bytes)'
  704. fi
  705. fi        ; : end of overwriting check
  706. exit 0
  707.  
  708.