home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume35 / zsh / part02 < prev    next >
Text File  |  1993-02-20  |  56KB  |  1,963 lines

  1. Newsgroups: comp.sources.misc
  2. From: zsh-list@cs.uow.edu.au (The Zsh Mailing List)
  3. Subject: v35i052:  zsh - The Z Shell, version 2.3.1, Part02/22
  4. Message-ID: <1993Feb20.211944.28059@sparky.imd.sterling.com>
  5. X-Md4-Signature: fdc3c4b0c4ed6f6b753a3d0016f32119
  6. Date: Sat, 20 Feb 1993 21:19:44 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: zsh-list@cs.uow.edu.au (The Zsh Mailing List)
  10. Posting-number: Volume 35, Issue 52
  11. Archive-name: zsh/part02
  12. Environment: UNIX
  13. Supersedes: zsh2.2: Volume 29, Issue 97-113
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  20. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  21. # Contents:  doc/intro.troff.01 dots/zshrc
  22. # Wrapped by mattson@odin on Sat Feb  6 14:41:51 1993
  23. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 2 (of 22)."'
  26. if test -f 'doc/intro.troff.01' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'doc/intro.troff.01'\"
  28. else
  29.   echo shar: Extracting \"'doc/intro.troff.01'\" \(49835 characters\)
  30.   sed "s/^X//" >'doc/intro.troff.01' <<'END_OF_FILE'
  31. X.nr PI 0
  32. X.nr HM .5i
  33. X.nr FM .5i
  34. X.de Ds
  35. X.DS L
  36. X.ft C
  37. X..
  38. X.de De
  39. X.DE
  40. X\fR
  41. X..
  42. X.de DZ
  43. X.DE
  44. X\fR
  45. X..
  46. X.TL
  47. XAn Introduction to the Z Shell
  48. X.AU
  49. XPaul Falstad
  50. Xpf@ttisms.com
  51. X.PP
  52. X\fBzsh\fR is a shell designed for interactive use, although it
  53. Xis also a powerful scripting language.  Many of the useful
  54. Xfeatures of bash, ksh, and tcsh were incorporated into zsh;
  55. Xmany original features were added.
  56. XThis document details some of the unique features of zsh.
  57. XIt assumes basic knowledge of the standard UNIX shells;
  58. Xthe intent is to show a reader already familiar with one of the
  59. Xother major shells what makes zsh more useful or more powerful.
  60. XThis document is not at all comprehensive; read the manual entry
  61. Xfor a description of the shell that is
  62. Xcomplete and concise,
  63. Xalthough somewhat overwhelming and devoid of examples.
  64. X.SH
  65. XFilename Generation
  66. X.PP
  67. XOtherwise known as \fIglobbing\fR, filename generation
  68. Xis quite extensive in zsh.  Of course, it has all the
  69. Xbasics:
  70. X.Ds
  71. X% ls
  72. XMakefile   file.pro   foo.o      main.o     q.c        run234     stuff
  73. Xbar.o      foo        link       morestuff  run123     run240     sub
  74. Xfile.h     foo.c      main.h     pipe       run2       run303
  75. X% ls *.c
  76. Xfoo.c  q.c
  77. X% ls *.[co]
  78. Xbar.o   foo.c   foo.o   main.o  q.c
  79. X% ls foo.?
  80. Xfoo.c  foo.o
  81. X% ls *.[^c]
  82. Xbar.o   file.h  foo.o   main.h  main.o
  83. X% ls *.[^oh]
  84. Xfoo.c  q.c
  85. X.DZ
  86. XAlso, if the \fIEXTENDEDGLOB\fR option is set,
  87. Xsome new features are activated.
  88. XFor example, the \fC^\fR character negates the pattern following it:
  89. X.Ds
  90. X% setopt extendedglob
  91. X% ls -d ^*.c
  92. XMakefile   file.pro   link       morestuff  run2       run303
  93. Xbar.o      foo        main.h     pipe       run234     stuff
  94. Xfile.h     foo.o      main.o     run123     run240     sub
  95. X% ls -d ^*.*
  96. XMakefile   link       pipe       run2       run240     stuff
  97. Xfoo        morestuff  run123     run234     run303     sub
  98. X% ls -d ^Makefile
  99. Xbar.o      foo        link       morestuff  run123     run240     sub
  100. Xfile.h     foo.c      main.h     pipe       run2       run303
  101. Xfile.pro   foo.o      main.o     q.c        run234     stuff
  102. X% ls -d *.^c
  103. X\&.rhosts   bar.o     file.h    file.pro  foo.o     main.h    main.o
  104. X.DZ
  105. XAn expression of the form
  106. X\fC<\fIx\fR\-\fIy\fC>\fR
  107. Xmatches a range of integers:
  108. X.Ds
  109. X% ls run<200-300>
  110. Xrun234  run240
  111. X% ls run<300-400>
  112. Xrun303
  113. X% ls run<-200>
  114. Xrun123  run2
  115. X% ls run<300->
  116. Xrun303
  117. X% ls run<>
  118. Xrun123  run2    run234  run240  run303
  119. X.DZ
  120. XGrouping is possible:
  121. X.Ds
  122. X% ls (foo|bar).*
  123. Xbar.o  foo.c  foo.o
  124. X% ls *.(c|o|pro)
  125. Xbar.o     file.pro  foo.c     foo.o     main.o    q.c
  126. X.DZ
  127. XAlso, the string \fC**/\fR forces a recursive search of
  128. Xsubdirectories:
  129. X.Ds
  130. X% ls -R
  131. XMakefile   file.pro   foo.o      main.o     q.c        run234     stuff
  132. Xbar.o      foo        link       morestuff  run123     run240     sub
  133. Xfile.h     foo.c      main.h     pipe       run2       run303
  134. X
  135. Xmorestuff:
  136. X
  137. Xstuff:
  138. Xfile  xxx   yyy
  139. X
  140. Xstuff/xxx:
  141. Xfoobar
  142. X
  143. Xstuff/yyy:
  144. Xfrobar
  145. X% ls **/*bar
  146. Xstuff/xxx/foobar  stuff/yyy/frobar
  147. X% ls **/f*
  148. Xfile.h            foo               foo.o             stuff/xxx/foobar
  149. Xfile.pro          foo.c             stuff/file        stuff/yyy/frobar
  150. X% ls *bar*
  151. Xbar.o
  152. X% ls **/*bar*
  153. Xbar.o             stuff/xxx/foobar  stuff/yyy/frobar
  154. X% ls stuff/**/*bar*
  155. Xstuff/xxx/foobar  stuff/yyy/frobar
  156. X.De
  157. X.PP
  158. XIt is possible to exclude certain files from the patterns using
  159. Xthe ~ character.  A pattern of the form \fC*.c~bar.c\fP lists all
  160. Xfiles matching \fC*.c\fP, except for the file \fCbar.c\fP.
  161. X.Ds
  162. X% ls *.c
  163. Xfoo.c    foob.c    bar.c
  164. X% ls *.c~bar.c
  165. Xfoo.c    foob.c
  166. X% ls *.c~f*
  167. Xbar.c
  168. X.De
  169. X.PP
  170. XOne can add a number of \fIqualifiers\fR to the end of
  171. Xany of these patterns, to restrict matches to certain
  172. Xfile types.  A qualified pattern is of the form
  173. X.DS
  174. X\fIpattern\fC(\fR...\fC)\fR
  175. X.De
  176. Xwith single-letter qualifiers inside the parentheses.
  177. X.Ds
  178. X% alias l='ls -dF'
  179. X% l *
  180. XMakefile    foo*        main.h      q.c         run240
  181. Xbar.o       foo.c       main.o      run123      run303
  182. Xfile.h      foo.o       morestuff/  run2        stuff/
  183. Xfile.pro    link@       pipe        run234      sub
  184. X% l *(/)
  185. Xmorestuff/  stuff/
  186. X% l *(@)
  187. Xlink@
  188. X% l *(*)
  189. Xfoo*        link@       morestuff/  stuff/
  190. X% l *(x)
  191. Xfoo*        link@       morestuff/  stuff/
  192. X% l *(X)
  193. Xfoo*        link@       morestuff/  stuff/
  194. X% l *(R)
  195. Xbar.o       foo*        link@       morestuff/  run123      run240
  196. Xfile.h      foo.c       main.h      pipe        run2        run303
  197. Xfile.pro    foo.o       main.o      q.c         run234      stuff/
  198. X.DZ
  199. XNote that \fC*(x)\fR and \fC*(*)\fR both match executables.
  200. X\fC*(X)\fR matches files executable by others, as opposed to
  201. X\fC*(x)\fR, which matches files executable by the owner.
  202. X\fC*(R)\fR and \fC*(r)\fR match readable files;
  203. X\fC*(W)\fR and \fC*(w)\fR, which checks for writable files.
  204. X\fC*(W)\fR is especially important, since it checks for world-writable
  205. Xfiles:
  206. X.Ds
  207. X% l *(w)
  208. Xbar.o       foo*        link@       morestuff/  run123      run240
  209. Xfile.h      foo.c       main.h      pipe        run2        run303
  210. Xfile.pro    foo.o       main.o      q.c         run234      stuff/
  211. X% l *(W)
  212. Xlink@   run240
  213. X% l -l link run240
  214. Xlrwxrwxrwx  1 pfalstad       10 May 23 18:12 link -> /bin/false*
  215. X-rw-rw-rw-  1 pfalstad        0 May 23 18:12 run240
  216. X.DZ
  217. XYou can filter out the symbolic links with the \fC^\fR character:
  218. X.Ds
  219. X% l *(W^@)
  220. Xrun240
  221. X% l *(x)
  222. Xfoo*        link@       morestuff/  stuff/
  223. X% l *(x^@/)
  224. Xfoo*
  225. X.DZ
  226. XTo find all plain files, you can use \fC.\fR:
  227. X.Ds
  228. X% l *(.)
  229. XMakefile  file.h    foo*      foo.o     main.o    run123    run234    run303
  230. Xbar.o     file.pro  foo.c     main.h    q.c       run2      run240    sub
  231. X% l *(^.)
  232. Xlink@       morestuff/  pipe        stuff/
  233. X% l s*(.)
  234. Xstuff/   sub
  235. X% l *(p)
  236. Xpipe
  237. X% l -l *(p)
  238. Xprw-r--r--  1 pfalstad        0 May 23 18:12 pipe
  239. X.DZ
  240. X\fC*(U)\fR matches all files owned by you.
  241. XTo search for all files not owned by you, use \fC*(^U)\fR:
  242. X.Ds
  243. X% l -l *(^U)
  244. X-rw-------  1 subbarao       29 May 23 18:13 sub
  245. X.DZ
  246. XThis searches for setuid files:
  247. X.Ds
  248. X% l -l *(s)
  249. X-rwsr-xr-x  1 pfalstad       16 May 23 18:12 foo*
  250. X.DZ
  251. XThis checks for a certain user's files:
  252. X.Ds
  253. X% ypmatch subbarao passwd
  254. Xsubbarao:*:3338:35:Kartik Subbarao:/u/subbarao:/usr/princeton/bin/zsh
  255. X% l -l *(u3338)
  256. X-rw-------  1 subbarao       29 May 23 18:13 sub
  257. X.De
  258. X.SH
  259. XStartup Files
  260. X.PP
  261. XThere are five startup files that zsh will read commands from:
  262. X.Ds
  263. X$ZDOTDIR/.zshenv
  264. X$ZDOTDIR/.zprofile
  265. X$ZDOTDIR/.zshrc
  266. X$ZDOTDIR/.zlogin
  267. X$ZDOTDIR/.zlogout
  268. X.DZ
  269. XIf \fBZDOTDIR\fR is not set, then the value of \fBHOME\fR is used;
  270. Xthis is the usual case.
  271. X.\".KE    <--- missing .KS or .KF above
  272. X.PP
  273. X\&\fC.zshenv\fR is sourced on all invocations of the shell,
  274. Xunless the \fC-f\fR option is set.  It should contain commands to set
  275. Xthe command search path, plus other important environment
  276. Xvariables.
  277. X\&\fC.zshenv\fR should not contain commands that produce output
  278. Xor assume the shell is attached to a tty.
  279. X.PP
  280. X\&\fC.zshrc\fR is sourced in interactive shells.  It should contain
  281. Xcommands to set up aliases, functions, options, key bindings, etc.
  282. X.PP
  283. X\&\fC.zlogin\fR is sourced in login shells.  It should contain
  284. Xcommands that should be executed only in login shells.
  285. X\&\fC.zlogout\fR is sourced when login shells exit.
  286. X\&\fC.zprofile\fR is similar to \fC.zlogin\fR, except that it is sourced before
  287. X\&\fC.zshrc\fR.
  288. X\&\fC.zprofile\fR is meant as an alternative to \fC.zlogin\fR for
  289. Xksh fans;
  290. Xthe two are not intended to be used together, although this
  291. Xcould certainly be done if desired.
  292. X\&\fC.zlogin\fR is not the place for alias definitions, options, environment
  293. Xvariable settings, etc.;
  294. Xas a general rule, it should not change the shell environment
  295. Xat all.  Rather, it should be used to set the terminal type
  296. Xand run a series of external commands (\fCfortune\fR, \fCmsgs\fR, etc).
  297. X.SH
  298. XShell Functions
  299. X.PP
  300. Xzsh also allows you to create your own commands by defining shell
  301. Xfunctions.  For example:
  302. X.Ds
  303. X% yp () {
  304. X>       ypmatch $1 passwd.byname
  305. X> }
  306. X% yp pfalstad
  307. Xpfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
  308. X.DZ
  309. XThis function looks up a user in the NIS password map.
  310. XThe \fC$1\fR expands to the first argument to \fCyp\fR.
  311. XThe function could have been equivalently defined in one of the following
  312. Xways:
  313. X.Ds
  314. X% function yp {
  315. X>       ypmatch $1 passwd.byname
  316. X> }
  317. X% function yp () {
  318. X>       ypmatch $1 passwd.byname
  319. X> }
  320. X% function yp () ypmatch $1 passwd.byname
  321. X.DZ
  322. XNote that aliases are expanded when the function definition is
  323. Xparsed, not when the function is executed.  For example:
  324. X.Ds
  325. X% alias ypmatch=echo
  326. X% yp pfalstad
  327. Xpfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
  328. X.DZ
  329. XSince the alias was defined after the function was parsed, it has
  330. Xno effect on the function's execution.
  331. XHowever, if we define the function again with the alias in place:
  332. X.Ds
  333. X% function yp () { ypmatch $1 passwd.byname }
  334. X% yp pfalstad
  335. Xpfalstad passwd.byname
  336. X.DZ
  337. Xit is parsed with the new alias definition in place.
  338. XTherefore, in general you must define aliases before functions.
  339. X.\".KE    <--- missing .KS or .KF above
  340. X.PP
  341. XWe can make the function take multiple arguments:
  342. X.Ds
  343. X% unalias ypmatch
  344. X% yp () {
  345. X>       for i
  346. X>       do ypmatch $i passwd.byname
  347. X>       done
  348. X> }
  349. X% yp pfalstad subbarao sukthnkr
  350. Xpfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
  351. Xsubbarao:*:3338:35:Kartik Subbarao:/u/subbarao:/usr/princeton/bin/zsh
  352. Xsukthnkr:*:1267:35:Rahul Sukthankar:/u/sukthnkr:/usr/princeton/bin/tcsh
  353. X.DZ
  354. XThe \fCfor i\fR loops through each of the function's arguments,
  355. Xsetting \fCi\fR equal to each of them in turn.
  356. XWe can also make the function do something sensible
  357. Xif no arguments are given:
  358. X.Ds
  359. X% yp () {
  360. X>       if (( $# == 0 ))
  361. X>       then echo usage: yp name ...; fi
  362. X>       for i; do ypmatch $i passwd.byname; done
  363. X> }
  364. X% yp
  365. Xusage: yp name ...
  366. X% yp pfalstad sukthnkr
  367. Xpfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
  368. Xsukthnkr:*:1267:35:Rahul Sukthankar:/u/sukthnkr:/usr/princeton/bin/tcsh
  369. X.DZ
  370. X\fC$#\fR is the number of arguments supplied to the function.
  371. XIf it is equal to zero, we print a usage message; otherwise,
  372. Xwe loop through the arguments, and \fCypmatch\fR all of them.
  373. X.\".KE    <--- missing .KS or .KF above
  374. X.PP
  375. XHere's a function that selects a random line from a file:
  376. X.Ds
  377. X% randline () {
  378. X>       integer z=$(wc -l <$1)
  379. X>       sed -n $[RANDOM % z + 1]p $1
  380. X> }
  381. X% randline /etc/motd
  382. XPHOENIX WILL BE DOWN briefly Friday morning, 5/24/91 from 8 AM to
  383. X% randline /etc/motd
  384. XSunOS Release 4.1.1 (PHOENIX) #19: Tue May 14 19:03:15 EDT 1991
  385. X% randline /etc/motd
  386. X| Please use the "msgs" command to read announcements.  Refer to the   |
  387. X% echo $z
  388. X
  389. X%
  390. X.De
  391. X\fCrandline\fR has a local variable, \fCz\fR, that holds the number of
  392. Xlines in the file.  \fC$[RANDOM % z + 1]\fR expands to a random number
  393. Xbetween 1 and \fCz\fR.  An expression of the form \fC$[\fR...\fC]\fR
  394. Xexpands to the value of the arithmetic expression within the brackets,
  395. Xand the \fBRANDOM\fR variable returns a random number each time it
  396. Xis referenced.  \fC%\fR is the modulus operator, as in C.
  397. XTherefore, \fCsed -n $[RANDOM%z+1]p\fR picks a random line from its
  398. Xinput, from 1 to \fCz\fR.
  399. X.PP
  400. XFunction definitions can be viewed with the \fCfunctions\fR builtin:
  401. X.Ds
  402. X% functions randline
  403. Xrandline () {
  404. X        integer z=$(wc -l <$1)
  405. X        sed -n $[RANDOM % z + 1]p $1
  406. X
  407. X}
  408. X% functions
  409. Xyp () {
  410. X        if let $# == 0 
  411. X        
  412. X        then
  413. X                echo usage: yp name ...
  414. X        
  415. X        fi
  416. X        for i
  417. X        do
  418. X                ypmatch $i passwd.byname
  419. X        
  420. X                done
  421. X
  422. X}
  423. Xrandline () {
  424. X        integer z=$(wc -l <$1)
  425. X        sed -n $[RANDOM % z + 1]p $1
  426. X
  427. X}
  428. X.DZ
  429. XHere's another one:
  430. X.Ds
  431. X% cx () { chmod +x $* }
  432. X% ls -l foo bar
  433. X-rw-r--r--  1 pfalstad       29 May 24 04:38 bar
  434. X-rw-r--r--  1 pfalstad       29 May 24 04:38 foo
  435. X% cx foo bar
  436. X% ls -l foo bar
  437. X-rwxr-xr-x  1 pfalstad       29 May 24 04:38 bar
  438. X-rwxr-xr-x  1 pfalstad       29 May 24 04:38 foo
  439. X.DZ
  440. XNote that this could also have been implemented as an alias:
  441. X.Ds
  442. X% chmod 644 foo bar
  443. X% alias cx='chmod +x'
  444. X% cx foo bar
  445. X% ls -l foo bar
  446. X-rwxr-xr-x  1 pfalstad       29 May 24 04:38 bar
  447. X-rwxr-xr-x  1 pfalstad       29 May 24 04:38 foo
  448. X.De
  449. X.PP
  450. XInstead of defining a lot of functions in your \fC.zshrc\fR,
  451. Xall of which you may not use,
  452. Xit is often better to use the \fCautoload\fR builtin.
  453. XThe idea is, you create a directory where function
  454. Xdefinitions are stored, declare the names in
  455. Xyour \fC.zshrc\fR, and tell the shell where to look for them.
  456. XWhenever you reference a function, the shell
  457. Xwill automatically load it into memory.
  458. X.Ds
  459. X% mkdir /tmp/funs
  460. X% cat >/tmp/funs/yp
  461. Xypmatch $1 passwd.byname
  462. X^D
  463. X% cat >/tmp/funs/cx
  464. Xchmod +x $*
  465. X^D
  466. X% FPATH=/tmp/funs
  467. X% autoload cx yp
  468. X% functions cx yp
  469. Xundefined cx ()
  470. Xundefined yp ()
  471. X% chmod 755 /tmp/funs/{cx,yp}
  472. X% yp egsirer
  473. Xegsirer:*:3214:35:Emin Gun Sirer:/u/egsirer:/bin/sh
  474. X% functions yp
  475. Xyp () {
  476. X        ypmatch $1 passwd.byname
  477. X}
  478. X.De
  479. XThis idea has other benefits.  By adding a \fC#!\fR header
  480. Xto the files, you can make them double as shell scripts.
  481. X(Although it is faster to use them as functions, since a
  482. Xseparate process is not created.)
  483. X.Ds
  484. X% ed /tmp/funs/yp
  485. X25
  486. Xi
  487. X#! /usr/local/bin/zsh
  488. X.
  489. Xw
  490. X42
  491. Xq
  492. X% </tmp/funs/yp
  493. X#! /usr/local/bin/zsh
  494. Xypmatch $1 passwd.byname
  495. X% /tmp/funs/yp sukthnkr
  496. Xsukthnkr:*:1267:35:Rahul Sukthankar:/u/sukthnkr:/usr/princeton/bin/tcsh
  497. X.De
  498. XNow other people, who may not use zsh, or who don't want to
  499. Xcopy all of your \fC.zshrc\fR, may use these functions as shell
  500. Xscripts.
  501. X.SH
  502. XDirectories
  503. X.PP
  504. XOne nice feature of zsh is the way it prints directories.
  505. XFor example, if we set the prompt like this:
  506. X.Ds
  507. Xphoenix% PROMPT='%~> '
  508. X~> cd src
  509. X~/src>
  510. X.De
  511. Xthe shell will print the current directory in the prompt,
  512. Xusing the \fC~\fR character.
  513. XHowever, zsh is smarter than most other shells in this respect:
  514. X.Ds
  515. X~/src> cd ~subbarao
  516. X~subbarao> cd ~maruchck
  517. X~maruchck> cd lib
  518. X~maruchck/lib> cd fun
  519. X~maruchck/lib/fun> foo=/usr/princeton/common/src
  520. X~maruchck/lib/fun> cd ~foo
  521. X~foo> cd ..
  522. X/usr/princeton/common> cd src
  523. X~foo> cd news/nntp
  524. X~foo/news/nntp> cd inews
  525. X~foo/news/nntp/inews>
  526. X.De
  527. XNote that zsh prints \fIother\fR users' directories 
  528. Xin the form \fC~user\fR.  Also note that you can
  529. Xset a parameter and use it as a directory name;
  530. Xzsh will act as if \fCfoo\fR is a user
  531. Xwith the login directory \fC/usr/princeton/common/src\fR.
  532. XThis is convenient, especially if you're sick of seeing
  533. Xprompts like this:
  534. X.Ds
  535. Xphoenix:/usr/princeton/common/src/X.V11R4/contrib/clients/xv/docs>
  536. X.DZ
  537. XIf you get stuck in this position, you can give the current
  538. Xdirectory a short name, like this:
  539. X.Ds
  540. X/usr/princeton/common/src/news/nntp/inews> inews=$PWD
  541. X/usr/princeton/common/src/news/nntp/inews> echo ~inews
  542. X/usr/princeton/common/src/news/nntp/inews
  543. X~inews>
  544. X.De
  545. XWhen you reference a directory in the form \fC~inews\fR,
  546. Xthe shell assumes that you want the directory displayed
  547. Xin this form; thus simply typing \fCecho ~inews\fR or
  548. X\fCcd ~inews\fR causes the prompt to be shortened.
  549. XYou can define a shell function for this purpose:
  550. X.Ds
  551. X~inews> namedir () { $1=$PWD ;  : ~$1 }
  552. X~inews> cd /usr/princeton/bin
  553. X/usr/princeton/bin> namedir pbin
  554. X~pbin> cd /var/spool/mail
  555. X/var/spool/mail> namedir spool
  556. X~spool> cd .msgs
  557. X~spool/.msgs>
  558. X.De
  559. XYou may want to add this one-line function to your \fC.zshrc\fR.
  560. X
  561. Xzsh can also put the current directory in your title bar,
  562. Xif you are using a windowing system.
  563. XOne way to do this is with the \fCchpwd\fR function, which is
  564. Xautomatically executed by the shell whenever you change
  565. Xdirectory.  If you are using xterm, this will work:
  566. X.Ds
  567. Xchpwd () { print -Pn '^[]2;%~^G' }
  568. X.De
  569. XThe \fC-P\fR option tells \fCprint\fR to treat its arguments like a prompt
  570. Xstring; otherwise the \fC%~\fR would not be expanded.
  571. XThe \fC-n\fR option suppresses the terminating newline, as with \fCecho\fR.
  572. X.PP
  573. XIf you are using an IRIS \fCwsh\fR, do this:
  574. X.Ds
  575. Xchpwd () { print -Pn '^[P1.y%~^[\' }
  576. X.DZ
  577. XThe \fCprint -D\fR command has other uses.  For example, to
  578. Xprint the current directory to standard output in short form,
  579. Xyou can do this:
  580. X.Ds
  581. X% print -D $PWD
  582. X~subbarao/src
  583. X.DZ
  584. Xand to print each component of the path in short form:
  585. X.Ds
  586. X% print -D $path
  587. X/bin /usr/bin ~locbin ~locbin/X11 ~/bin
  588. X.De
  589. X.SH
  590. XDirectory Stacks
  591. X.PP
  592. XIf you use csh, you may know about directory stacks.
  593. XThe \fCpushd\fR command puts the current directory on the
  594. Xstack, and changes to a new directory; the \fCpopd\fR command
  595. Xpops a directory off the stack and changes to it.
  596. X.Ds
  597. Xphoenix% cd 
  598. Xphoenix% PROMPT='Z %~> '
  599. XZ ~> pushd /tmp
  600. X/tmp ~
  601. XZ /tmp> pushd /usr/etc
  602. X/usr/etc /tmp ~
  603. XZ /usr/etc> pushd /usr/bin
  604. X/usr/bin /usr/etc /tmp ~
  605. XZ /usr/bin> popd
  606. X/usr/etc /tmp ~
  607. XZ /usr/etc> popd
  608. X/tmp ~
  609. XZ /tmp> pushd /etc
  610. X/etc /tmp ~
  611. XZ /etc> popd 
  612. X/tmp ~
  613. X.De
  614. Xzsh's directory stack commands work similarly.  One
  615. Xdifference is the way \fCpushd\fR is handled if no arguments
  616. Xare given.  As in csh, this exchanges the top two elements
  617. Xof the directory stack:
  618. X.Ds
  619. XZ /tmp> dirs
  620. X/tmp ~
  621. XZ /tmp> pushd
  622. X~ /tmp
  623. X.DZ
  624. Xunless the stack only has one entry:
  625. X.Ds
  626. XZ ~> popd
  627. X/tmp
  628. XZ /tmp> dirs
  629. X/tmp
  630. XZ /tmp> pushd
  631. X~ /tmp
  632. X.DZ
  633. Xor unless the \fIPUSHDTOHOME\fR option is set:
  634. X.Ds
  635. XZ ~> setopt pushdtohome
  636. XZ ~> pushd
  637. X~ ~ /tmp
  638. X.De
  639. X.PP
  640. XAs an alternative to using directory stacks in this manner,
  641. Xwe can get something like a \fIdirectory history\fR
  642. Xby setting a few more options and parameters:
  643. X.Ds
  644. X~> DIRSTACKSIZE=8
  645. X~> setopt autopushd pushdminus pushdsilent pushdtohome
  646. X~> alias dh='dirs -v'
  647. X~> cd /tmp
  648. X/tmp> cd /usr
  649. X/usr> cd bin
  650. X/usr/bin> cd ../pub
  651. X/usr/pub> dh
  652. X0       /usr/pub
  653. X1       /usr/bin
  654. X2       /usr
  655. X3       /tmp
  656. X4       ~
  657. X/usr/pub> cd -3
  658. X/tmp> dh
  659. X0       /tmp
  660. X1       /usr/pub
  661. X2       /usr/bin
  662. X3       /usr
  663. X4       ~
  664. X/tmp> ls =2/df
  665. X/usr/bin/df
  666. X/tmp> cd -4
  667. X~>
  668. X.De
  669. XNote that \fC=2\fR expanded to the second directory in the
  670. Xhistory list, and that \fCcd -3\fR recalled the third
  671. Xdirectory in the list.
  672. X.PP
  673. XYou may be wondering what all those options do.
  674. X\fIAUTOPUSHD\fR made \fCcd\fR act like \fCpushd\fR.
  675. X(\fCalias cd=pushd\fR is not sufficient, for various reasons.)
  676. X\fIPUSHDMINUS\fR swapped the meaning of \fCcd +1\fR and
  677. X\fCcd -1\fR; we want them to mean the opposite of what they mean in csh,
  678. Xbecause it makes more sense in this scheme, and it's easier to type:
  679. X.Ds
  680. X~> dh
  681. X0       ~
  682. X1       /tmp
  683. X2       /usr/pub
  684. X3       /usr/bin
  685. X4       /usr
  686. X~> unsetopt pushdminus
  687. X~> cd +1
  688. X/tmp> dh
  689. X0       /tmp
  690. X1       ~
  691. X2       /usr/pub
  692. X3       /usr/bin
  693. X4       /usr
  694. X/tmp> cd +2
  695. X/usr/pub>
  696. X.De
  697. X\fIPUSHDSILENT\fR keeps the shell from printing
  698. Xthe directory stack each time we do a \fCcd\fR,
  699. Xand \fIPUSHDTOHOME\fR we mentioned earlier:
  700. X.Ds
  701. X/usr/pub> unsetopt pushdsilent
  702. X/usr/pub> cd /etc
  703. X/etc /usr/pub /tmp ~ /usr/bin /usr
  704. X/etc> cd
  705. X~ /etc /usr/pub /tmp ~ /usr/bin /usr
  706. X~> unsetopt pushdtohome
  707. X~> cd
  708. X/etc ~ /usr/pub /tmp ~ /usr/bin /usr
  709. X/etc>
  710. X.DZ
  711. X\fBDIRSTACKSIZE\fR keeps the directory stack
  712. Xfrom getting too large, much like \fIHISTSIZE\fR:
  713. X.Ds
  714. X/etc> setopt pushdsilent
  715. X/etc> cd /
  716. X/> cd /
  717. X/> cd /
  718. X/> cd /
  719. X/> cd /
  720. X/> cd /
  721. X/> cd /
  722. X/> cd /
  723. X/> dh
  724. X0       /
  725. X1       /
  726. X2       /
  727. X3       /
  728. X4       /
  729. X5       /
  730. X6       /
  731. X7       /
  732. X.De
  733. X.SH
  734. XCommand/Process Substitution
  735. X.PP
  736. XCommand substitution in zsh can take two forms.
  737. XIn the traditional form, a command enclosed in
  738. Xbackquotes (\fC`\fR...\fC`\fR) is replaced on the command line with its output.
  739. XThis is the form used by the older shells.
  740. XNewer shells (like zsh) also provide another form,
  741. X\fC$(\fR...\fC)\fR.  This form is much easier to nest.
  742. X.Ds
  743. X% ls -l `echo /vmunix`
  744. X-rwxr-xr-x  1 root      1209702 May 14 19:04 /vmunix
  745. X% ls -l $(echo /vmunix)
  746. X-rwxr-xr-x  1 root      1209702 May 14 19:04 /vmunix
  747. X% who | grep mad
  748. Xsubbarao ttyt7   May 23 15:02   (mad55sx15.Prince)
  749. Xpfalstad ttyu1   May 23 16:25   (mad55sx14.Prince)
  750. Xsubbarao ttyu6   May 23 15:04   (mad55sx15.Prince)
  751. Xpfalstad ttyv3   May 23 16:25   (mad55sx14.Prince)
  752. X% who | grep mad | awk '{print $2}'
  753. Xttyt7
  754. Xttyu1
  755. Xttyu6
  756. Xttyv3
  757. X% cd /dev; ls -l $(who |
  758. X> grep $(echo mad) |
  759. X> awk '{ print $2 }')
  760. Xcrwx-w----  1 subbarao  20,  71 May 23 18:35 ttyt7
  761. Xcrw--w----  1 pfalstad  20,  81 May 23 18:42 ttyu1
  762. Xcrwx-w----  1 subbarao  20,  86 May 23 18:38 ttyu6
  763. Xcrw--w----  1 pfalstad  20,  99 May 23 18:41 ttyv3
  764. X.DZ
  765. XMany common uses of command substitution, however, are
  766. Xsuperseded by other mechanisms of zsh:
  767. X.Ds
  768. X% ls -l `tty`
  769. Xcrw-rw-rw-  1 root      20,  28 May 23 18:35 /dev/ttyqc
  770. X% ls -l $TTY
  771. Xcrw-rw-rw-  1 root      20,  28 May 23 18:35 /dev/ttyqc
  772. X% ls -l `which rn`
  773. X-rwxr-xr-x  1 root       172032 Mar  6 18:40 /usr/princeton/bin/rn
  774. X% ls -l =rn
  775. X-rwxr-xr-x  1 root       172032 Mar  6 18:40 /usr/princeton/bin/rn
  776. X.DZ
  777. XA command name with a \fC=\fR prepended is replaced with its full
  778. Xpathname.  This can be very convenient.  If it's not convenient
  779. Xfor you, you can turn it off:
  780. X.Ds
  781. X% ls
  782. X=foo    =bar
  783. X% ls =foo =bar
  784. Xzsh: foo not found
  785. X% setopt noequals
  786. X% ls =foo =bar
  787. X=foo    =bar
  788. X.De
  789. X.PP
  790. XAnother nice feature is process substitution:
  791. X.Ds
  792. X% who | fgrep -f =(print -l root lemke shgchan subbarao)
  793. Xroot     console May 19 10:41
  794. Xlemke    ttyq0   May 22 10:05   (narnia:0.0)
  795. Xlemke    ttyr7   May 22 10:05   (narnia:0.0)
  796. Xlemke    ttyrd   May 22 10:05   (narnia:0.0)
  797. Xshgchan  ttys1   May 23 16:52   (gaudi.Princeton.)
  798. Xsubbarao ttyt7   May 23 15:02   (mad55sx15.Prince)
  799. Xsubbarao ttyu6   May 23 15:04   (mad55sx15.Prince)
  800. Xshgchan  ttyvb   May 23 16:51   (gaudi.Princeton.)
  801. X.De
  802. XA command of the form \fC=(\fR...\fC)\fR is replaced with the name of a \fIfile\fR
  803. Xcontaining its output.  (A command substitution, on the other
  804. Xhand, is replaced with the output itself.)
  805. X\fCprint -l\fR is like \fCecho\fR, excepts that it prints its arguments
  806. Xone per line, the way \fCfgrep\fR expects them:
  807. X.Ds
  808. X% print -l foo bar
  809. Xfoo
  810. Xbar
  811. X.DZ
  812. XWe could also have written:
  813. X.Ds
  814. X% who | fgrep -f =(echo 'root
  815. X> lemke
  816. X> shgchan
  817. X> subbarao')
  818. X.DZ
  819. XUsing process substitution,
  820. Xyou can edit the output of a command:
  821. X.Ds
  822. X% ed =(who | fgrep -f ~/.friends)
  823. X355
  824. Xg/lemke/d
  825. Xw /tmp/filbar
  826. X226
  827. Xq
  828. X% cat /tmp/filbar
  829. Xroot     console May 19 10:41
  830. Xshgchan  ttys1   May 23 16:52   (gaudi.Princeton.)
  831. Xsubbarao ttyt7   May 23 15:02   (mad55sx15.Prince)
  832. Xsubbarao ttyu6   May 23 15:04   (mad55sx15.Prince)
  833. Xshgchan  ttyvb   May 23 16:51   (gaudi.Princeton.)
  834. X.DZ
  835. Xor easily read archived mail:
  836. X.Ds
  837. X% mail -f =(zcat ~/mail/oldzshmail.Z)
  838. X"/tmp/zsha06024": 84 messages, 0 new, 43 unread
  839. X>  1  U  TO: pfalstad, zsh (10)
  840. X   2  U  nytim!tim@uunet.uu.net, Re: Zsh on Sparc1 /SunOS 4.0.3
  841. X   3  U  JAM%TPN@utrcgw.utc.com, zsh fix (15)
  842. X   4  U  djm@eng.umd.edu, way to find out if running zsh? (25)
  843. X   5  U  djm@eng.umd.edu, Re: way to find out if running zsh? (17)
  844. X   6   r djm@eng.umd.edu, Meta . (18)
  845. X   7  U  jack@cs.glasgow.ac.uk, Re: problem building zsh (147)
  846. X   8  U  nytim!tim@uunet.uu.net, Re: Zsh on Sparc1 /SunOS 4.0.3
  847. X   9     ursa!jmd, Another fix... (61)
  848. X  10  U  pplacewa@bbn.com, Re: v18i084: Zsh 2.00 - A small complaint (36)
  849. X  11  U  lubkin@cs.rochester.edu, POSIX job control (34)
  850. X  12  U  yale!bronson!tan@uunet.UU.NET
  851. X  13  U  brett@rpi.edu, zsh (36)
  852. X  14  S  subbarao, zsh sucks!!!! (286)
  853. X  15  U  snibru!d241s008!d241s013!ala@relay.EU.net, zsh (165)
  854. X  16  U  nytim!tim@uunet.UU.NET, Re: Zsh on Sparc1 /SunOS 4.0.3
  855. X  17  U  subbarao, zsh is a junk shell (43)
  856. X  18  U  amaranth@vela.acs.oakland.edu, zsh (33)
  857. X43u/84 1: x
  858. X% ls -l /tmp/zsha06024
  859. X/tmp/zsha06024 not found
  860. X.DZ
  861. XNote that the shell creates a temporary file, and deletes it
  862. Xwhen the command is finished.
  863. X.Ds
  864. X% diff =(ls) =(ls -F)
  865. X3c3
  866. X< fortune
  867. X---
  868. X> fortune*
  869. X10c10
  870. X< strfile
  871. X---
  872. X> strfile*
  873. X.De
  874. XIf you read zsh's man page, you may notice that \fC<(\fR...\fC)\fR
  875. Xis another form of process substitution which is similar to
  876. X\fC=(\fR...\fC)\fR.
  877. XThere is an important difference between the two.
  878. XIn the \fC<(\fR...\fC)\fR case, the shell creates a named pipe (FIFO)
  879. Xinstead of a file.  This is better, since it does not
  880. Xfill up the file system; but it does not work in all cases.
  881. XIn fact, if we had replaced \fC=(\fR...\fC)\fR with \fC<(\fR...\fC)\fR in 
  882. Xthe examples above, all of them would have stopped working
  883. Xexcept for \fCfgrep -f <(\fR...\fC)\fR.
  884. XYou can not edit a pipe, or open it as a mail folder;
  885. X\fCfgrep\fR, however, has no problem with reading
  886. Xa list of words from a pipe.
  887. XYou may wonder why \fCdiff <(foo) bar\fR doesn't work, since
  888. X\fCfoo | diff - bar\fR works; this is because \fCdiff\fR creates
  889. Xa temporary file if it notices that one of its arguments
  890. Xis \fC-\fR, and then copies its standard input to the temporary
  891. Xfile.
  892. X.SH
  893. XAliasing
  894. X.PP
  895. XOften-used commands can be abbreviated with an alias:
  896. X.Ds
  897. X% alias uc=uncompress
  898. X% ls
  899. Xhanoi.Z
  900. X% uc hanoi
  901. X% ls
  902. Xhanoi
  903. X.DZ
  904. Xor commands with certain desired options:
  905. X.Ds
  906. X% alias fm='finger -m'
  907. X% fm root
  908. XLogin name: root                        In real life: Operator
  909. XDirectory: /                            Shell: /bin/csh
  910. XOn since May 19 10:41:15 on console     3 days 5 hours Idle Time
  911. XNo unread mail
  912. XNo Plan.
  913. X
  914. X% alias lock='lock -p -60000'
  915. X% lock
  916. Xlock: /dev/ttyr4 on phoenix. timeout in 60000 minutes
  917. Xtime now is Fri May 24 04:23:18 EDT 1991
  918. XKey: 
  919. X
  920. X% alias l='ls -AF'
  921. X% l /
  922. X\&.bash_history              kadb*
  923. X\&.bashrc                    lib@
  924. X\&.cshrc                     licensed/
  925. X\&.exrc                      lost+found/
  926. X\&.login                     macsyma
  927. X\fR...
  928. X.DZ
  929. XAliases can also be used to replace old commands:
  930. X.Ds
  931. X% alias grep=egrep ps=sps make=gmake
  932. X% alias whoami='echo root'
  933. X% whoami
  934. Xroot
  935. X.DZ
  936. Xor to define new ones:
  937. X.Ds
  938. X% cd /
  939. X% alias sz='ls -l | sort -n +3 | tail -10'
  940. X% sz
  941. Xdrwxr-sr-x  7 bin          3072 May 23 11:59 etc
  942. Xdrwxrwxrwx 26 root         5120 May 24 04:20 tmp
  943. Xdrwxr-xr-x  2 root         8192 Dec 26 19:34 lost+found
  944. Xdrwxr-sr-x  2 bin         14848 May 23 18:48 dev
  945. X-r--r--r--  1 root       140520 Dec 26 20:08 boot
  946. X-rwxr-xr-x  1 root       311172 Dec 26 20:08 kadb
  947. X-rwxr-xr-x  1 root      1209695 Apr 16 15:33 vmunix.old
  948. X-rwxr-xr-x  1 root      1209702 May 14 19:04 vmunix
  949. X-rwxr-xr-x  1 root      1209758 May 21 12:23 vmunix.new.kernelmap.old
  950. X-rwxr-xr-x  1 root      1711848 Dec 26 20:08 vmunix.org
  951. X% cd
  952. X% alias rable='ls -AFtrd *(R)' nrable='ls -AFtrd *(^R)'
  953. X% rable
  954. XREADME      func/       bin/        pub/        News/       src/
  955. Xnicecolors  etc/        scr/        tmp/        iris/       zsh*
  956. X% nrable
  957. XMailboxes/  mail/       notes
  958. X.De
  959. X(The pattern \fC*(R)\fR matches all readable files in the current
  960. Xdirectory, and \fC*(^R)\fR matches all unreadable files.)
  961. X.PP
  962. XMost other shells have aliases of this kind (\fIcommand\fR aliases).
  963. XHowever, zsh also has \fIglobal\fR aliases, which are substituted
  964. Xanywhere on a line.
  965. XGlobal aliases can be used to abbreviate frequently-typed
  966. Xusernames, hostnames, etc.
  967. X.Ds
  968. X% alias -g me=pfalstad gun=egsirer mjm=maruchck
  969. X% who | grep me
  970. Xpfalstad ttyp0   May 24 03:39   (mickey.Princeton)
  971. Xpfalstad ttyp5   May 24 03:42   (mickey.Princeton)
  972. X% fm gun
  973. XLogin name: egsirer                     In real life: Emin Gun Sirer
  974. XDirectory: /u/egsirer                   Shell: /bin/sh
  975. XLast login Thu May 23 19:05 on ttyq3 from bow.Princeton.ED
  976. XNew mail received Fri May 24 02:30:28 1991;
  977. X  unread since Fri May 24 02:30:27 1991
  978. X% alias -g phx=phoenix.princeton.edu warc=wuarchive.wustl.edu
  979. X% ftp warc
  980. XConnected to wuarchive.wustl.edu.
  981. X.DZ
  982. XHere are some more interesting uses.
  983. X.Ds
  984. X% alias -g M='| more' GF='| fgrep -f ~/.friends'
  985. X% who M   # \fIpipes the output of \fCwho\fI through \fCmore
  986. X% who GF  # \fIsee if your friends are on\fC
  987. X% w GF    # \fIsee what your friends are doing
  988. X.DZ
  989. XAnother example makes use of zsh's process substitution.
  990. XIf you run NIS, and you miss being able to do this:
  991. X.Ds
  992. X% grep pfalstad /etc/passwd
  993. X.DZ
  994. Xyou can define an alias that will seem more natural
  995. Xthan \fCypmatch pfalstad passwd\fR:
  996. X.Ds
  997. X% alias -g PASS='<(ypcat passwd)'
  998. X% grep pfalstad PASS
  999. Xpfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
  1000. X.DZ
  1001. XIf you're really crazy, you can even call it \fC/etc/passwd\fR:
  1002. X.Ds
  1003. X% alias -g /etc/passwd='<(ypcat passwd)'
  1004. X% grep pfalstad /etc/passwd
  1005. Xpfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh
  1006. X.De
  1007. XThe last example shows one of the perils of global aliases;
  1008. Xthey have a lot of potential to cause confusion.
  1009. XFor example, if you defined a global alias called \fC|\fR (which is
  1010. Xpossible), zsh would begin to act very strangely; every pipe
  1011. Xsymbol would be replaced with the text of your alias.
  1012. XTo some extent, global aliases are like macros in C;
  1013. Xdiscretion is advised in using them and in choosing names for them.
  1014. XUsing names in all caps is not a bad idea, especially
  1015. Xfor aliases which introduce shell metasyntax (like \fCM\fR and \fCGF\fR
  1016. Xabove).
  1017. X.PP
  1018. XNote that zsh aliases are not like csh aliases.  The syntax for
  1019. Xdefining them is different, and they do not have arguments.
  1020. XAll your favorite csh aliases will probably not work under zsh.
  1021. XFor example, if you try:
  1022. X.Ds
  1023. Xalias rm mv '\e!* /tmp/wastebasket'
  1024. X.De
  1025. Xno aliases will be defined, but zsh will not report an error.
  1026. XIn csh, this line defines an alias that makes \fCrm\fR safe---files
  1027. Xthat are \fCrm\fR'd will be moved to a temporary directory instead
  1028. Xof instantly destroyed.  In zsh's syntax, however, this line
  1029. Xasks the shell to print any existing alias definitions for \fCrm\fR, \fCmv\fR,
  1030. Xor \fC!* /tmp/wastebasket\fR.  Since there are none, most likely,
  1031. Xthe shell will not print anything, although \fCalias\fR will
  1032. Xreturn a nonzero exit code.
  1033. XThe proper syntax is this:
  1034. X.Ds
  1035. Xalias rm='mv \e!* /tmp/wastebasket'
  1036. X.DZ
  1037. XHowever, this won't work either:
  1038. X.Ds
  1039. X% rm foo.dvi
  1040. Xzsh: no matches found: !*
  1041. X.DZ
  1042. XWhile this makes \fCrm\fR safe, it is certainly not what the user
  1043. Xintended.  In zsh, you must use a shell function for this:
  1044. X.Ds
  1045. X% unalias rm
  1046. X% rm () { mv $* /tmp/wastebasket }
  1047. X% rm foo.dvi
  1048. X% ls /tmp/wastebasket
  1049. Xfoo.dvi
  1050. X.DZ
  1051. XWhile this is much cleaner and easier to read (I hope you will
  1052. Xagree), it is not csh-compatible.  Therefore, a script to convert
  1053. Xcsh aliases and variables has been provided.  You should only need to use it
  1054. Xonce, to convert all your csh aliases and parameters to zsh format:
  1055. X.Ds
  1056. X% csh
  1057. Xcsh> alias
  1058. Xl       ls -AF
  1059. Xmore    less
  1060. Xon      last -2 !:1 ; who | grep !:1
  1061. Xcsh> exit
  1062. X% c2z >neat_zsh_aliases
  1063. X% cat neat_zsh_aliases
  1064. Xalias l='ls -AF'
  1065. Xalias more='less'
  1066. Xon () { last -2 $1 ; who | grep $1 }
  1067. X\&...
  1068. X.De
  1069. XThe first two aliases were converted to regular zsh aliases, while
  1070. Xthe third, since it needed to handle arguments, was converted to
  1071. Xa function.  \fCc2z\fR can convert most aliases to zsh format without
  1072. Xany problems.  However, if you're using some really arcane csh tricks,
  1073. Xor if you have an alias with a name like \fCdo\fR (which is reserved
  1074. Xin zsh), you may have to fix some of the aliases by hand.
  1075. X.PP
  1076. XThe \fCc2z\fP script checks your csh setup, and produces a list
  1077. Xof zsh commands which replicate your aliases and parameter settings
  1078. Xas closely as possible.  You could include its output in your
  1079. Xstartup file, \fC.zshrc\fP.
  1080. X.SH
  1081. XHistory
  1082. X.PP
  1083. XThere are several ways to manipulate history in zsh.
  1084. XOne way is to use csh-style \fC!\fR history:
  1085. X.Ds
  1086. X% /usr/local/bin/!:0 !-2*:s/foo/bar/ >>!$
  1087. X.De
  1088. XIf you don't want to use this, you can turn it off
  1089. Xby typing \fCsetopt nobanghist\fR.
  1090. X.PP
  1091. XAnother way is to use the \fCfc\fR command.  For example,
  1092. Xif you type an erroneous command:
  1093. X.Ds
  1094. X% for i in `cat /etc/clients` 
  1095. X do 
  1096. X rpu $i 
  1097. X done
  1098. Xzsh: command not found: rpu
  1099. Xzsh: command not found: rpu
  1100. Xzsh: command not found: rpu
  1101. X\fR...
  1102. X.DZ
  1103. Xtyping \fCfc\fR will execute an editor on this command, allowing
  1104. Xyou to fix it.  (The default editor is \fCvi\fR, by the way,
  1105. Xnot \fCed\fR).
  1106. X.Ds
  1107. X% fc
  1108. X49
  1109. X/rpu/s//rup/p
  1110. X rup $i 
  1111. Xw
  1112. X49
  1113. Xq
  1114. Xfor i in `cat /etc/clients` 
  1115. X do 
  1116. X rup $i 
  1117. X done
  1118. X        beam    up  2 days, 10:17,    load average: 0.86, 0.80, 0.50
  1119. X         bow    up  4 days,  8:41,    load average: 0.91, 0.80, 0.50
  1120. X        burn    up          17:18,    load average: 0.91, 0.80, 0.50
  1121. X       burst    up  9 days,  1:49,    load average: 0.95, 0.80, 0.50
  1122. X         tan    up          11:14,    load average: 0.91, 0.80, 0.50
  1123. X       bathe    up  3 days, 17:49,    load average: 1.84, 1.79, 1.50
  1124. X        bird    up  1 day,   9:13,    load average: 1.95, 1.82, 1.51
  1125. X      bonnet    up  2 days, 21:18,    load average: 0.93, 0.80, 0.50
  1126. X\fR...
  1127. X.DZ
  1128. XA variant of the \fCfc\fR command is \fCr\fR, which redoes the last
  1129. Xcommand, with optional changes:
  1130. X.Ds
  1131. X% echo foo
  1132. Xfoo
  1133. X% r
  1134. Xecho foo
  1135. Xfoo
  1136. X
  1137. X% echo foo
  1138. Xfoo
  1139. X% r foo=bar
  1140. Xecho bar
  1141. Xbar
  1142. X.De
  1143. X.SH
  1144. XCommand Line Editing
  1145. X.PP
  1146. Xzsh's command line editor, \fBZLE\fP, is quite powerful.
  1147. XIt is designed to emulate either emacs or vi; the default
  1148. Xis emacs.  To set the bindings for vi mode, type \fCbindkey -v\fR.
  1149. X.PP
  1150. XIn addition to basic editing, the shell allows you to 
  1151. Xrecall previous lines in the history.  In emacs mode,
  1152. Xthis is done with \fI^P\fP (control-P):
  1153. X.Ds
  1154. X% ls ~
  1155. X-           README      file        mail        pub         tmp
  1156. XMailboxes   bin         func        nicecolors  scr         zsh
  1157. XNews        etc         iris        notes       src
  1158. X% echo foobar
  1159. Xfoobar
  1160. X% \fI^P\fC
  1161. X% echo foobar\fI^P\fC
  1162. X% ls ~_
  1163. X.De
  1164. XPressing \fI^P\fP once brings up the previous line (\fCecho foobar\fR);
  1165. Xpressing it again brings up the line before that (\fCls ~\fR).
  1166. XThe cursor is left at the end of the line, allowing you to
  1167. Xedit the line if desired before executing it.
  1168. XIn many cases, \fBZLE\fP eliminates the need for the \fCfc\fR command,
  1169. Xsince it is powerful enough to handle even multiline commands:
  1170. X.Ds
  1171. X% for i in a b c d e
  1172. X> do
  1173. X> echo $i
  1174. X> done
  1175. Xa
  1176. Xb
  1177. Xc
  1178. Xd
  1179. Xe
  1180. X% \fI^P\fC
  1181. X% for i in a b c d e 
  1182. X do 
  1183. X echo $i 
  1184. X done_
  1185. X.DZ
  1186. XNow you can just move up to the part you want to change...
  1187. X.Ds
  1188. X% for i in \kxa\l'|\nxu\(ul' b c d e
  1189. X do 
  1190. X echo $i 
  1191. X done
  1192. X.DZ
  1193. Xchange it, and execute the new command.
  1194. X.Ds
  1195. X% for i in f g h i j
  1196. X do 
  1197. X echo $i 
  1198. X done
  1199. Xf
  1200. Xg
  1201. Xh
  1202. Xi
  1203. Xj
  1204. X.DZ
  1205. XAlso, you can search the history for a certain command using
  1206. X\fIESC-P\fR:
  1207. X.Ds
  1208. X% set \fIESC-P\fC
  1209. X% setopt autolist \fIESC-P\fC
  1210. X% setopt nocorrect_
  1211. X.DZ
  1212. XAnother way is to do an incremental search, emacs-style:
  1213. X.Ds
  1214. X% \fI^R\fC
  1215. X% _
  1216. Xi-search:
  1217. X
  1218. X% l\kxs\l'|\nxu\(ul' /usr/bin
  1219. Xi-search: l
  1220. X
  1221. X% date > foofile\kx.\l'|\nxu\(ul'c
  1222. Xi-search: le
  1223. X.DZ
  1224. XAnother useful feature of the editor is command and filename completion.
  1225. X.Ds
  1226. X% comp\fITAB\fC
  1227. X% compress _
  1228. X
  1229. X% ls /nic\fITAB\fC
  1230. X% ls /nicecolors _
  1231. X
  1232. X% ls /usr/pr\fITAB\fC
  1233. X% ls /usr/princeton/_
  1234. X
  1235. X% ls -l =com\fITAB\fC
  1236. X% ls -l =compress _
  1237. X.DZ
  1238. XIf the completion is ambiguous, the editor will beep.
  1239. XYou can list possible completions by pressing \fI^D\fP:
  1240. X.Ds
  1241. X% ls /vmu\fITAB \(embeep\(em\fC
  1242. X% ls /vmunix_
  1243. X% ls /vmunix\fI^D\fC
  1244. Xvmunix                    vmunix.old                
  1245. Xvmunix.new.kernelmap.old  vmunix.org
  1246. X.DZ
  1247. XOr, you could just set the \fIAUTOLIST\fR option:
  1248. X.Ds
  1249. X% setopt autolist
  1250. X% ls /vmu\fITAB \(embeep\(em\fC
  1251. Xvmunix                    vmunix.old                
  1252. Xvmunix.new.kernelmap.old  vmunix.org
  1253. X% ls /vmunix_
  1254. X.De
  1255. XAnother option you could set is \fIRECEXACT\fR, which causes
  1256. Xexact matches to be accepted, even if there are other possible
  1257. Xcompletions:
  1258. X.Ds
  1259. X% setopt recexact
  1260. X% ls /vmu\fITAB \(embeep\(em\fC
  1261. Xvmunix                    vmunix.old                
  1262. Xvmunix.new.kernelmap.old  vmunix.org
  1263. X% ls /vmunix_\fITAB\fC
  1264. X% ls /vmunix _
  1265. X.DZ
  1266. XThe \fIfignore\fR variable lists suffixes of files to ignore
  1267. Xduring completion.
  1268. X.Ds
  1269. X% ls foo\fITAB \(embeep\(em\fC
  1270. Xfoofile.c  foofile.o
  1271. X% fignore=( .o \e~ .bak .junk )
  1272. X% ls foo\fITAB\fP
  1273. X% ls foofile.c _
  1274. X.De
  1275. XSince \fCfoofile.o\fR has a suffix that is in the \fCfignore\fR list,
  1276. Xit was not considered a possible completion of \fCfoo\fR.
  1277. X.PP
  1278. XUsername completion is also supported:
  1279. X.Ds
  1280. X% ls ~pfal\fITAB\fC
  1281. X% ls ~pfalstad/_
  1282. X.DZ
  1283. Xand parameter name completion:
  1284. X.Ds
  1285. X% echo $ORG\fITAB\fC
  1286. X% echo $ORGANIZATION _
  1287. X.DZ
  1288. Xand hostname completion, if you give the shell a list of hosts to
  1289. Xcomplete:
  1290. X.Ds
  1291. X% hosts=( phoenix.princeton.edu uunet.uu.net nic.ddn.mil
  1292. X> diskfarm.princeton.edu gnu.ai.mit.edu
  1293. X> eniac.seas.upenn.edu )
  1294. X% telnet disk\fITAB\fC
  1295. X% telnet diskfarm.princeton.edu _
  1296. X
  1297. X% ftp uu\fITAB\fC
  1298. X% ftp uunet.uu.net _
  1299. X
  1300. X% mail subbarao@ph\fITAB\fC
  1301. X% mail subbarao@phoenix.princeton.edu _
  1302. X.DZ
  1303. Xand option completion:
  1304. X.Ds
  1305. X% setopt nocl\fITAB\fC
  1306. X% setopt noclobber _
  1307. X.DZ
  1308. Xand binding completion:
  1309. X.Ds
  1310. X% bindkey '^X^X' pu\fITAB\fC
  1311. X% bindkey '^X^X' push-line _
  1312. X.De
  1313. X.PP
  1314. XThe \fCcompctl\fP command is used to control how completion works.
  1315. XFor example, to specify that certain commands show take
  1316. Xcommands as arguments, you use \fCcompctl -c\fP:
  1317. X.Ds
  1318. X% compctl -c man nohup
  1319. X% man upt\fITAB\fC
  1320. X% man uptime _
  1321. X.De
  1322. XTo specify that a command should complete filenames, you should use
  1323. X\fCcompctl -f\fP.  This is the default.  It can be combined with \fC-c\fP,
  1324. Xas well.
  1325. X.Ds
  1326. X% compctl -cf echo
  1327. X% echo upt\fITAB\fC
  1328. X% echo uptime _
  1329. X
  1330. X% echo fo\fITAB\fC
  1331. X% echo foo.c
  1332. X.De
  1333. XSimilarly, use \fC-h\fP to specify hostnames, \fC-o\fP to specify
  1334. Xoptions, \fC-v\fP to specify variables, and \fC-b\fP to specify bindings.
  1335. X.Ds
  1336. X% compctl -h rlogin
  1337. X% compctl -hfc rsh
  1338. X% compctl -b bindkey
  1339. X.De
  1340. XYou can also use \fC-k\fP to specify a custom list of keywords to use
  1341. Xin completion.
  1342. X.Ds
  1343. X% ftphosts=(ftp.uu.net wuarchive.wustl.edu)
  1344. X% compctl -k ftphosts ftp
  1345. X% ftp wu\fITAB\fC
  1346. X% ftp wuarchive.wustl.edu _
  1347. X
  1348. X% friends=(cpirazzi subbarao sukthnkr)
  1349. X% compctl -k friends mail finger su
  1350. X% finger cp\fITAB\fC
  1351. X% finger cpirazzi _
  1352. X.De
  1353. X.PP
  1354. XIn addition to completion, \fITAB\fP performs expansion
  1355. Xif possible.
  1356. X.Ds
  1357. X% ls *.c\fITAB\fC
  1358. X% ls foofile.c fortune.c rnd.c strfile.c unstr.c_
  1359. X.DZ
  1360. XFor example, suppose you have a bunch of weird files in an important
  1361. Xdirectory:
  1362. X.Ds
  1363. X% ls
  1364. X  * * *       ; & % $??foo  dspfok        foo.c
  1365. X  !"foo"!       ` \e `         foo           rrr
  1366. X.DZ
  1367. XYou want to remove them, but you don't want to damage \fCfoo.c\fR.
  1368. XHere is one way to do this:
  1369. X.Ds
  1370. X% rm *\fITAB\fC
  1371. X% rm \e \e \e*\e \e*\e \e*\e \e \e  \e!\e"foo\e"\e! \e;\e \e&\e %\e \e$'
  1372. X''
  1373. X'foo \e`\e \e\e\e \e` dspfok foo foo.c rrr_
  1374. X.DZ
  1375. XWhen you expand \fC*\fR, zsh inserts the names of all the files
  1376. Xinto the editing buffer, with proper shell quoting.
  1377. XNow, just move back and remove \fCfoo.c\fR from the buffer:
  1378. X.Ds
  1379. X% rm \e \e \e*\e \e*\e \e*\e \e \e  \e!\e"foo\e"\e! \e;\e \e&\e %\e \e$'
  1380. X''
  1381. X'foo \e`\e \e\e\e \e` dspfok foo \kxr\l'|\nxu\(ul'rr
  1382. X.De
  1383. Xand press return.
  1384. XEverything except \fCfoo.c\fR will be deleted from the directory.
  1385. X.PP
  1386. XHere's another trick; let's say you have typed this command in:
  1387. X.Ds
  1388. X% gcc -o x.out foob.c -g -Wpointer-arith -Wtrigraphs_
  1389. X.De
  1390. Xand you forget which library you want.  You need to escape
  1391. Xout for a minute and check by typing
  1392. X\fCls /usr/lib\fR, or some other such command;
  1393. Xbut you don't want to retype the whole command again,
  1394. Xand you can't press return now because the current command
  1395. Xis incomplete.
  1396. XIn zsh, you can put the line on the \fIbuffer stack\fR, using
  1397. X\fIESC-Q\fP, and type some other commands.  The next time a prompt is printed,
  1398. Xthe \fCgcc\fR line will be popped off the stack and put
  1399. Xin the editing buffer automatically; you can then enter the
  1400. Xproper library name and press return (or, \fIESC-Q\fP again and look
  1401. Xfor some other libraries whose names you forgot).
  1402. X.PP
  1403. XA similar situation: what if you forget the option to gcc that
  1404. Xfinds bugs using AI techniques?  You could either use \fIESC-Q\fP
  1405. Xagain, and type \fCman gcc\fR, or you could press \fIESC-H\fR, which
  1406. Xessentially does the same thing; it puts the current line on
  1407. Xthe buffer stack, and executes the command \fCrun-help gcc\fR,
  1408. Xwhere \fCrun-help\fR is an alias for \fCman\fR.
  1409. X.PP
  1410. XAnother interesting command is \fIESC-A\fR.  This executes the
  1411. Xcurrent line, but retains it in the buffer, so that it appears
  1412. Xagain when the next prompt is printed.
  1413. XAlso, the cursor stays in the same place.
  1414. XThis is useful for executing a series of similar commands:
  1415. X.Ds
  1416. X% cc grok.c -g -lc -lgl -lsun -lmalloc -Bstatic -o b.out
  1417. X% cc fubar.c -g -lc -lgl -lsun -lmalloc -Bstatic -o b.out
  1418. X% cc fooble.c -g -lc -lgl -lsun -lmalloc -Bstatic -o b.out
  1419. X.De
  1420. X.PP
  1421. XThe \fIESC-'\fR command is useful for managing the shell's quoting
  1422. Xconventions.  Let's say you want to print this string:
  1423. X.Ds
  1424. Xdon't do that; type 'rm -rf \e*', with a \e before the *.
  1425. X.DZ
  1426. XAll that is necessary is to type it into the editing buffer:
  1427. X.Ds
  1428. X% don't do that; type 'rm -rf \e*', with a \e before the *.
  1429. X.DZ
  1430. Xpress \fIESC-'\fR (escape-quote):
  1431. X.Ds
  1432. X% 'don'\e''t do that; type '\e''rm -rf \e*'\e'', with a \e before the *.'
  1433. X.DZ
  1434. Xthen move to the beginning and add the \fCecho\fR command.
  1435. X.Ds
  1436. X% echo 'don'\e''t do that; type '\e''rm -rf \e*'\e'', with a \e before the *.'
  1437. Xdon't do that; type 'rm -rf \e*', with a \e before the *.
  1438. X.DZ
  1439. XLet's say you want to create an alias to do this \fCecho\fR command.
  1440. XThis can be done by recalling the line with \fI^P\fP and pressing \fIESC-'\fR again:
  1441. X.Ds
  1442. X% 'echo '\e''don'\e''\e'\e'''\e''t do that; type '\e''\e'\e'''\e''rm -rf
  1443. X\e*'\e''\e'\e'''\e'', with a \e before the *.'\e'''
  1444. X.DZ
  1445. Xand then move to the beginning and add the command to create
  1446. Xan alias.
  1447. X.Ds
  1448. X% alias zoof='echo '\e''don'\e''\e'\e'''\e''t do that; type '\e''\e'\e'''\e''rm
  1449. X-rf \e*'\e''\e'\e'''\e'', with a \e before the *.'\e'''
  1450. X% zoof
  1451. Xdon't do that; type 'rm -rf \e*', with a \e before the *.
  1452. X.De
  1453. X.PP
  1454. XAnother interesting option is \fIMENUCOMPLETE\fR.  This affects the
  1455. Xway \fITAB\fP works.  Let's look at the \fC/vmunix\fR example again:
  1456. X.Ds
  1457. X% setopt menucomplete
  1458. X% ls /vmu\fITAB\fC
  1459. X% ls /vmunix\fITAB\fC
  1460. X% ls /vmunix.new.kernelmap.old\fITAB\fC
  1461. X% ls /vmunix.old_
  1462. X.De
  1463. XEach time you press \fITAB\fP, it displays the next possible completion.
  1464. XIn this way, you can cycle through the possible completions until
  1465. Xyou find the one you want.
  1466. X.PP
  1467. XThe \fIAUTOMENU\fR option makes
  1468. Xa nice compromise between this method of completion and the regular
  1469. Xmethod.  If you set this option, pressing the \fITAB\fP key repeatedly
  1470. Xafter an ambiguous completion will cycle through the possible
  1471. Xcompletions.
  1472. X.SH
  1473. XBindings
  1474. X.PP
  1475. XEach of the above editor commands was actually a function bound
  1476. Xby default to a certain key.  The real names of the commands are:
  1477. X.Ds
  1478. X\fCexpand-or-complete   \fITAB\fR
  1479. X\fCpush-line            \fIESC-Q\fR
  1480. X\fCrun-help             \fIESC-H\fR
  1481. X\fCaccept-and-hold      \fIESC-A\fR
  1482. X\fCquote-line           \fIESC-'\fR
  1483. X.DZ
  1484. XThese bindings are arbitrary; you could change them if you want.
  1485. XFor example, to bind \fCaccept-line\fR to \fI^Z\fP:
  1486. X.Ds
  1487. X% bindkey '^Z' accept-line
  1488. X.DZ
  1489. XAnother idea would be to bind the delete key to \fCdelete-char\fR;
  1490. Xthis might be convenient if you use \fI^H\fP for backspace.
  1491. X.Ds
  1492. X% bindkey '^?' delete-char
  1493. X.DZ
  1494. XOr, you could bind \fI^X\fP\fI^H\fP to \fCrun-help\fR:
  1495. X.Ds
  1496. X% bindkey '^X^H' run-help
  1497. X.DZ
  1498. XOther examples:
  1499. X.Ds
  1500. X% bindkey '^X^Z' universal-argument
  1501. X% bindkey ' ' magic-space
  1502. X% bindkey -s '^T' 'uptime
  1503. X> '
  1504. X.De
  1505. X\fCuniversal-argument\fR multiplies the next command by 4.
  1506. XThus \fI^X\fP\fI^Z\fP\fI^W\fP might delete the last four words on the line.
  1507. XIf you bind space to \fCmagic-space\fR, then csh-style history
  1508. Xexpansion is done on the line whenever you press the space bar.
  1509. X.PP
  1510. XThe \fC-s\fR flag to \fCbindkey\fR specifies that you are binding the key
  1511. Xto a string, not a command.  Thus \fCbindkey -s '^T' 'uptime\en'\fR
  1512. Xlets you VMS lovers get the load average whenever you press \fI^T\fP.
  1513. X.PP
  1514. XIf you have a NeXT keyboard, the one with the \fC|\fR and \fC\e\fR keys
  1515. Xvery inconveniently placed, the following
  1516. Xbindings may come in handy:
  1517. X.Ds
  1518. X% bindkey -s '\ee/' '\e\e'
  1519. X% bindkey -s '\ee=' '|'
  1520. X.De
  1521. XNow you can type \fIALT-/\fP to get a backslash, and \fIALT-=\fP to
  1522. Xget a vertical bar.  This only works inside zsh, of course;
  1523. X\fCbindkey\fR has no effect on the key mappings inside \fCtalk\fR
  1524. Xor \fCmail\fR, etc.
  1525. X.PP
  1526. XAnother use of the editor is to edit the value of variables.
  1527. XFor example, an easy way to change your path is to use
  1528. Xthe \fCvared\fR command:
  1529. X.Ds
  1530. X% vared PATH
  1531. X> /u/pfalstad/scr:/u/pfalstad/bin/sun4:/u/maruchck/scr:/u/subbarao/bin:/u/maruc
  1532. Xhck/bin:/u/subbarao/scripts:/usr/princeton/bin:/usr/ucb:/usr/bin:/bin:/usr/host
  1533. Xs:/usr/princeton/bin/X11:/./usr/lang:/./usr/etc:/./etc
  1534. X.De
  1535. XYou can now edit the path.  When you press return, the contents
  1536. Xof the edit buffer will be assigned to \fBPATH\fR.
  1537. X.SH
  1538. XParameter Substitution
  1539. X.PP
  1540. XIn zsh, parameters are set like this:
  1541. X.Ds
  1542. X% foo=bar
  1543. X% echo $foo
  1544. Xbar
  1545. X.DZ
  1546. XSpaces before or after the \fC=\fR are frowned upon:
  1547. X.Ds
  1548. X% foo = bar
  1549. Xzsh: command not found: foo
  1550. X.DZ
  1551. XAlso, \fCset\fR doesn't work for setting parameters:
  1552. X.Ds
  1553. X% set foo=bar
  1554. X% set foo = bar
  1555. X% echo $foo
  1556. X
  1557. X%
  1558. X.De
  1559. XNote that no error message was printed.  This is because both
  1560. Xof these commands were perfectly valid; the \fCset\fR builtin
  1561. Xassigns its arguments to the \fIpositional parameters\fR
  1562. X(\fC$1\fR, \fC$2\fR, etc.).
  1563. X.Ds
  1564. X% set foo=bar
  1565. X% echo $1
  1566. Xfoo=bar
  1567. X% set foo = bar
  1568. X% echo $3 $2
  1569. Xbar =
  1570. X.DZ
  1571. XIf you're really intent on using the csh syntax, define a
  1572. Xfunction like this:
  1573. X.Ds
  1574. X% set () {
  1575. X>    eval "$1$2$3"
  1576. X> }
  1577. X% set foo = bar
  1578. X% set fuu=brrr
  1579. X% echo $foo $fuu
  1580. Xbar brrr
  1581. X.De
  1582. XBut then, of course you can't use the form of \fCset\fR with
  1583. Xoptions, like \fCset -F\fR (which turns off filename generation).
  1584. XAlso, the \fCset\fR command by itself won't list all the parameters
  1585. Xlike it should.
  1586. XTo get around that you need a \fCcase\fR statement:
  1587. X.Ds
  1588. X% set () {
  1589. X>    case $1 in
  1590. X>    -*|+*|'') builtin set $* ;;
  1591. X>    *) eval "$1$2$3" ;;
  1592. X>    esac
  1593. X> }
  1594. X.De
  1595. XFor the most part, this should make csh users happy.
  1596. X.PP
  1597. XThe following sh-style operators are supported in zsh:
  1598. X.Ds
  1599. X% unset null
  1600. X% echo ${foo-xxx}
  1601. Xbar
  1602. X% echo ${null-xxx}
  1603. Xxxx
  1604. X% unset null
  1605. X% echo ${null=xxx}
  1606. Xxxx
  1607. X% echo $null
  1608. Xxxx
  1609. X% echo ${foo=xxx}
  1610. Xbar
  1611. X% echo $foo
  1612. Xbar
  1613. X% unset null
  1614. X% echo ${null+set}
  1615. X
  1616. X% echo ${foo+set}
  1617. Xset
  1618. X.DZ
  1619. XAlso, csh-style \fC:\fR modifiers may be appended to a parameter
  1620. Xsubstitution.
  1621. X.Ds
  1622. X% echo $PWD
  1623. X/home/learning/pf/zsh/zsh2.00/src
  1624. X% echo $PWD:h
  1625. X/home/learning/pf/zsh/zsh2.00
  1626. X% echo $PWD:h:h
  1627. X/home/learning/pf/zsh
  1628. X% echo $PWD:t
  1629. Xsrc
  1630. X% name=foo.c
  1631. X% echo $name
  1632. Xfoo.c
  1633. X% echo $name:r
  1634. Xfoo
  1635. X% echo $name:e
  1636. Xc
  1637. X.De
  1638. XThe equivalent constructs in ksh (which are also supported in zsh)
  1639. Xare a bit more general and easier to remember.
  1640. XWhen the shell expands \fC${foo#\fR\fIpat\fR\fC}\fR,
  1641. Xit checks to see if \fIpat\fR matches a substring at the beginning
  1642. Xof the value
  1643. Xof \fCfoo\fR.  If so, it removes that portion of \fCfoo\fR, using the shortest
  1644. Xpossible match.
  1645. XWith \fC${foo##\fR\fIpat\fR\fC}\fR, the longest possible match is removed.
  1646. X\fC${foo%\fR\fIpat\fR\fC}\fR and \fC${foo%%\fR\fIpat\fR\fC}\fR remove the match
  1647. Xfrom the end.
  1648. XHere are the ksh equivalents of the \fC:\fR modifiers:
  1649. X.Ds
  1650. X% echo ${PWD%/*}
  1651. X/home/learning/pf/zsh/zsh2.00
  1652. X% echo ${PWD%/*/*}
  1653. X/home/learning/pf/zsh
  1654. X% echo ${PWD##*/}
  1655. Xsrc
  1656. X% echo ${name%.*}
  1657. Xfoo
  1658. X% echo ${name#*.}
  1659. Xc
  1660. X.DZ
  1661. Xzsh also has upper/lowercase modifiers:
  1662. X.Ds
  1663. X% xx=Test
  1664. X% echo $xx:u
  1665. XTEST
  1666. X% echo $xx:l
  1667. Xtest
  1668. X.DZ
  1669. Xand a substitution modifier:
  1670. X.Ds
  1671. X% echo $name:s/foo/bar/
  1672. Xbar.c
  1673. X% ls
  1674. Xfoo.c    foo.h    foo.o    foo.pro
  1675. X% for i in foo.*; mv $i $i:s/foo/bar/
  1676. X% ls
  1677. Xbar.c    bar.h    bar.o    bar.pro
  1678. X.DZ
  1679. XOne possible source of confusion is the fact that in zsh,
  1680. Xthe result of parameter substitution is \fInot\fR split into
  1681. Xwords.  Thus, this will not work:
  1682. X.Ds
  1683. X% srcs='glob.c exec.c init.c'
  1684. X% ls $srcs
  1685. Xglob.c exec.c init.c not found
  1686. X.DZ
  1687. XThis is considered a feature, not a bug.
  1688. XIf splitting were done by default, as it is in most other shells,
  1689. Xfunctions like this would not work properly:
  1690. X.Ds
  1691. X$ ll () { ls -F $* }
  1692. X$ ll 'fuu bar'
  1693. Xfuu not found
  1694. Xbar not found
  1695. X
  1696. X% ll 'fuu bar'
  1697. Xfuu bar not found
  1698. X.DZ
  1699. XOf course, a hackish workaround is available in sh (and zsh):
  1700. X.Ds
  1701. X% setopt shwordsplit
  1702. X% ll () { ls -F "$@" }
  1703. X% ll 'fuu bar'
  1704. Xfuu bar not found
  1705. X.DZ
  1706. XIf you like the sh behaviour, zsh can accomodate you:
  1707. X.Ds
  1708. X% ls ${=srcs}
  1709. Xexec.c  glob.c  init.c
  1710. X% setopt shwordsplit
  1711. X% ls $srcs
  1712. Xexec.c  glob.c  init.c
  1713. X.DZ
  1714. XAnother way to get the \fC$srcs\fR trick to work is to use an array:
  1715. X.Ds
  1716. X% unset srcs
  1717. X% srcs=( glob.c exec.c init.c )  
  1718. X% ls $srcs
  1719. Xexec.c  glob.c  init.c
  1720. X.DZ
  1721. Xor an alias:
  1722. X.Ds
  1723. X% alias -g SRCS='exec.c glob.c init.c'
  1724. X% ls SRCS
  1725. Xexec.c  glob.c  init.c
  1726. X.DZ
  1727. XAnother option that modifies parameter expansion is
  1728. X\fIRCEXPANDPARAM\fR:
  1729. X.Ds
  1730. X% echo foo/$srcs
  1731. Xfoo/glob.c exec.c init.c
  1732. X% setopt rcexpandparam
  1733. X% echo foo/$srcs
  1734. Xfoo/glob.c foo/exec.c foo/init.c
  1735. X% echo foo/${^srcs}
  1736. Xfoo/glob.c foo/exec.c foo/init.c
  1737. X% echo foo/$^srcs
  1738. Xfoo/glob.c foo/exec.c foo/init.c
  1739. X.De
  1740. X.SH
  1741. XShell Parameters
  1742. X.PP
  1743. XThe shell has many predefined parameters that may be
  1744. Xaccessed.  Here are some examples:
  1745. X.Ds
  1746. X% sleep 10 &
  1747. X[1] 3820
  1748. X% echo $!
  1749. X3820
  1750. X% set a b c
  1751. X% echo $#
  1752. X3
  1753. X% echo $ARGC
  1754. X3
  1755. X% ( exit 20 ) ; echo $?
  1756. X20
  1757. X% false; echo $status
  1758. X1
  1759. X.DZ
  1760. X(\fC$?\fR and \fC$status\fR are equivalent.)
  1761. X.Ds
  1762. X% echo $HOST $HOSTTYPE
  1763. Xdendrite sun4
  1764. X% echo $UID $GID
  1765. X701 60
  1766. X% cd /tmp
  1767. X% cd /home
  1768. X% echo $PWD $OLDPWD
  1769. X/home /tmp
  1770. X% ls $OLDPWD/.getwd 
  1771. X/tmp/.getwd
  1772. X.DZ
  1773. X\fC~+\fR and \fC~-\fR are short for \fC$PWD\fR and \fC$OLDPWD\fR, respectively.
  1774. X.Ds
  1775. X% ls ~-/.getwd
  1776. X/tmp/.getwd
  1777. X% ls -d ~+/learning
  1778. X/home/learning
  1779. X% echo $RANDOM
  1780. X4880
  1781. X% echo $RANDOM
  1782. X11785
  1783. X% echo $RANDOM
  1784. X2062
  1785. X% echo $TTY
  1786. X/dev/ttyp4
  1787. X% echo $VERSION
  1788. Xzsh v2.00.03
  1789. X% echo $USERNAME
  1790. Xpf
  1791. X.De
  1792. X.PP
  1793. XThe \fCcdpath\fR variable sets the search path for the \fCcd\fR command.
  1794. XIf you do not specify \fC.\fR somewhere in the path, it is assumed to
  1795. Xbe the first component.
  1796. X.Ds
  1797. X% cdpath=( /usr ~ ~/zsh )
  1798. X% ls /usr
  1799. X5bin         dict         lang         net          sccs         sys
  1800. X5include     etc          lector       nserve       services     tmp
  1801. X5lib         export       lib          oed          share        ucb
  1802. Xadm          games        local        old          skel         ucbinclude
  1803. Xbin          geac         lost+found   openwin      spool        ucblib
  1804. Xboot         hosts        macsyma_417  pat          src          xpg2bin
  1805. Xdemo         include      man          princeton    stand        xpg2include
  1806. Xdiag         kvm          mdec         pub          swap         xpg2lib
  1807. X% cd spool
  1808. X/usr/spool
  1809. X% cd bin
  1810. X/usr/bin
  1811. X% cd func
  1812. X~/func
  1813. X% cd 
  1814. X% cd pub
  1815. X% pwd
  1816. X/u/pfalstad/pub
  1817. X% ls -d /usr/pub
  1818. X/usr/pub
  1819. X.DZ
  1820. X\fBPATH\fR and \fBpath\fR both set the search path for commands.
  1821. XThese two variables are equivalent, except that one is a string
  1822. Xand one is an array.  If the user modifies \fBPATH\fR, the shell
  1823. Xchanges \fBpath\fR as well, and vice versa.
  1824. X.Ds
  1825. X% PATH=/bin:/usr/bin:/tmp:.
  1826. X% echo $path
  1827. X/bin /usr/bin /tmp .
  1828. X% path=( /usr/bin . /usr/local/bin /usr/ucb )
  1829. X% echo $PATH
  1830. X/usr/bin:.:/usr/local/bin:/usr/ucb
  1831. X.DZ
  1832. XThe same is true of \fBCDPATH\fR and \fBcdpath\fR:
  1833. X.Ds
  1834. X% echo $CDPATH
  1835. X/usr:/u/pfalstad:/u/pfalstad/zsh
  1836. X% CDPATH=/u/subbarao:/usr/src:/tmp
  1837. X% echo $cdpath
  1838. X/u/subbarao /usr/src /tmp
  1839. X.DZ
  1840. END_OF_FILE
  1841.   if test 49835 -ne `wc -c <'doc/intro.troff.01'`; then
  1842.     echo shar: \"'doc/intro.troff.01'\" unpacked with wrong size!
  1843.   fi
  1844.   # end of 'doc/intro.troff.01'
  1845. fi
  1846. if test -f 'dots/zshrc' -a "${1}" != "-c" ; then 
  1847.   echo shar: Will not clobber existing file \"'dots/zshrc'\"
  1848. else
  1849.   echo shar: Extracting \"'dots/zshrc'\" \(2291 characters\)
  1850.   sed "s/^X//" >'dots/zshrc' <<'END_OF_FILE'
  1851. X#
  1852. X# my rc file for zsh 2.2
  1853. X# all this runs in interactive shells only
  1854. X#
  1855. X
  1856. X# search path for the cd command
  1857. Xcdpath=(. ~ ~/src/cs320 ~/src)
  1858. X
  1859. X# where to look for function definitions
  1860. X# fpath=(~/func)
  1861. X
  1862. X# useful directory
  1863. Xcsrc=/usr/princeton/common/src
  1864. X
  1865. X# use hard limits, except for a smaller stack and no core dumps
  1866. Xunlimit
  1867. Xlimit stack 8192
  1868. Xlimit core 0
  1869. Xlimit -s
  1870. X
  1871. Xumask 022
  1872. X
  1873. X# define some aliases
  1874. Xalias a=alias
  1875. Xa a.out=./a.out sendmail=/usr/lib/sendmail c=cp 0=vi 09='vi -t' 00=r
  1876. Xa d=dirs en='enscript -2rGh' fm='finger -m' grep=egrep h=history
  1877. Xa hinfo='host -t hinfo' j=jobs l='ls -AF' lock='lock -p -60000'
  1878. Xa lsd='ls -d */' m=make mm=less
  1879. Xa nrable='ls -AFltrd *(^R)' sz='ls -l | sort -n +3 | tail -20'
  1880. Xa sn='sed -n' nw='l -ltr | tail' pd=pushd pop=popd mroe=more
  1881. Xa rable='ls -AFltrd *(R)' strings='strings -' t=cat
  1882. Xa v=mv where='hostname; echo >/dev/null' k9='kill -9' whoami='echo root'
  1883. Xa find='noglob find' bindkey='noglob bindkey' dh='dirs -v'
  1884. Xa mv='nocorrect mv' z=suspend
  1885. X
  1886. X# global aliases
  1887. Xa -g 'GF'='| fgrep -f ~/.friends' G='| grep' M='| less' cex='/u/pup/centrex'
  1888. X
  1889. X# setenv for csh junkies (including tset)
  1890. Xsetenv() { export $1=$2 }
  1891. X
  1892. Xmanpath=(/usr/man /usr/princeton/man /u/cad/man /usr/lang/man)
  1893. Xexport MANPATH
  1894. X
  1895. X# filename completion suffixes to ignore
  1896. Xfignore=(.o .pro .old)
  1897. X
  1898. X# hosts to use for completion
  1899. Xhosts=(uunet.uu.net `hostname` wuarchive.wustl.edu quiche.cs.mcgill.ca)
  1900. X
  1901. XPROMPT='%l %T %m[%h] '
  1902. X
  1903. X# prompt on the right side of the screen
  1904. XRPROMPT=' %~'
  1905. X
  1906. X# some environment variables
  1907. Xexport MAILCALL='NEW MAIL! '
  1908. Xexport YOUSAID='In %C you wrote:'
  1909. Xexport ATTRIBUTION='%f wrote:'
  1910. X
  1911. X# functions to autoload
  1912. X# autoload cx acx mere yu yp randline proto namedir ilogin
  1913. X
  1914. XMAILCHECK=30
  1915. XHISTSIZE=600
  1916. XDIRSTACKSIZE=50
  1917. X
  1918. X# lots of options
  1919. Xsetopt notify globdots correct pushdtohome cdablevars autolist \
  1920. X    sunkeyboardhack correctall autocd recexact longlistjobs mailwarning \
  1921. X    autoresume histignoredups pushdsilent noclobber \
  1922. X    autopushd pushdminus extendedglob rcquotes
  1923. Xunsetopt bgnice
  1924. X
  1925. X# watch for my friends
  1926. Xwatch=($(cat ~/.friends))
  1927. XWATCHFMT='%n %a %l from %m at %t.'
  1928. XLOGCHECK=0
  1929. X
  1930. Xexport LESS=-ainx3
  1931. Xunhash p
  1932. X
  1933. X# some nice bindings
  1934. Xbindkey '^X^Z' universal-argument ' ' magic-space
  1935. Xbindkey '^X^A' vi-find-prev-char-skip
  1936. Xbindkey '^Z' accept-and-hold
  1937. Xbindkey -s '\M-/' \\\\
  1938. Xbindkey -s '\M-=' \|
  1939. END_OF_FILE
  1940.   if test 2291 -ne `wc -c <'dots/zshrc'`; then
  1941.     echo shar: \"'dots/zshrc'\" unpacked with wrong size!
  1942.   fi
  1943.   # end of 'dots/zshrc'
  1944. fi
  1945. echo shar: End of archive 2 \(of 22\).
  1946. cp /dev/null ark2isdone
  1947. MISSING=""
  1948. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ; do
  1949.     if test ! -f ark${I}isdone ; then
  1950.     MISSING="${MISSING} ${I}"
  1951.     fi
  1952. done
  1953. if test "${MISSING}" = "" ; then
  1954.     echo You have unpacked all 22 archives.
  1955.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1956. else
  1957.     echo You still must unpack the following archives:
  1958.     echo "        " ${MISSING}
  1959. fi
  1960. exit 0
  1961.  
  1962. exit 0 # Just in case...
  1963.