home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / sources / misc / 3783 < prev    next >
Encoding:
Text File  |  1992-07-30  |  33.6 KB  |  954 lines

  1. Newsgroups: comp.sources.misc
  2. Path: sparky!kent
  3. From: sbo@vlsi.polymtl.ca (Stephane Boucher)
  4. Subject:  v31i059:  bam - [OpenLook|Athena] menu system for [GNU|Epoch|Lucid] Emacs, Part03/07
  5. Message-ID: <1992Jul31.042519.23714@sparky.imd.sterling.com>
  6. Followup-To: comp.sources.d
  7. X-Md4-Signature: aa42fb16736398bbfd890c9669af161c
  8. Sender: kent@sparky.imd.sterling.com (Kent Landfield)
  9. Organization: Sterling Software
  10. References: <csm-v31i057=bam.232156@sparky.IMD.Sterling.COM>
  11. Date: Fri, 31 Jul 1992 04:25:19 GMT
  12. Approved: kent@sparky.imd.sterling.com
  13. Lines: 939
  14.  
  15. Submitted-by: sbo@vlsi.polymtl.ca (Stephane Boucher)
  16. Posting-number: Volume 31, Issue 59
  17. Archive-name: bam/part03
  18. Environment: Lex, Yacc, SunOS 4.x with XView or BSD Unix with Athena Widget
  19. Supersedes: bam: Volume 27, Issue 68-69
  20.  
  21. #! /bin/sh
  22. # This is a shell archive.  Remove anything before this line, then unpack
  23. # it by saving it into a file and typing "sh file".  To overwrite existing
  24. # files, type "sh file -c".  You can also feed this as standard input via
  25. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  26. # will see the following message at the end:
  27. #        "End of archive 3 (of 7)."
  28. # Contents:  bam-2.0/README bam-2.0/athena.c bam-2.0/command-process.el
  29. #   bam-2.0/menus/emacs-base-ol bam-2.0/menus/latex
  30. #   bam-2.0/menus/rmail-menus
  31. # Wrapped by sbo@froh on Mon Jul 27 20:11:49 1992
  32. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  33. if test -f 'bam-2.0/README' -a "${1}" != "-c" ; then 
  34.   echo shar: Will not clobber existing file \"'bam-2.0/README'\"
  35. else
  36. echo shar: Extracting \"'bam-2.0/README'\" \(4303 characters\)
  37. sed "s/^X//" >'bam-2.0/README' <<'END_OF_FILE'
  38. XOverview
  39. X********
  40. X
  41. XThis is BAM (Born Again Menus) a menu system for GNU
  42. XEmacs.  It provides a GUI front-end to GNU Emacs.  In it's
  43. Xcurrent state, it is not a full fledge GUI, but it is easilly
  44. Xcustomizable and extensible.  Note however that this package
  45. Xdoes not provide direct mouse support in the Emacs window (i.e.
  46. Xno scrollbar, no cut-and-paste, no pop-up menu, ...).
  47. X
  48. XIt is most useful to ease the transition from other
  49. Xtext-editors to GNU Emacs, since basic commands are mouse
  50. Xselectable.  First-timers won't be overwhelmed by GNU Emacs
  51. Xapparent complexity and system administrator will spend less
  52. Xtime repeating all the time "Press `C-h i m emacs RET' and
  53. XRTFM" (Dream on... :-)
  54. X
  55. XBam is based on Dick van Soest's Buttons package, from which
  56. Xit borrows some elisp code.  The C and the elisp code is
  57. Xprotected by the copyleft.  There is however no restriction
  58. Xfor the file `command-process.el' which came with the Buttons
  59. Xpackage.  The menu files are not covered by the copyleft.
  60. XPlease read the file COPYING that describes the COPYLEFT
  61. Xbefore using bam.
  62. X
  63. XThis version of bam has a few bug fixes, and incorporate some
  64. Xenhancement. Some of the changes are:
  65. X
  66. X   * minor modifications to the menu files that cause
  67. X     some incompatibilites. The incompatibilities are
  68. X     trivial to correct;
  69. X
  70. X   * A set of new elisp functions to ease the use of bam. Some of the
  71. X     new functions are (`bam-load-menu', `bam-open-menu',
  72. X     `bam-set-mode-hook', `bam-set-menu-args', `bam-font-option',
  73. X     `bam-geometry-option', `bam-grab-option').  By using these function
  74. X     you can now associate a menu with a mode (`bam-set-mode-hook') so
  75. X     that the appropriate menu gets openned upon entering a given mode;
  76. X
  77. X   * Support for a menus path and an X bitmaps path;
  78. X
  79. X   * A trial makefile option that will allow you to
  80. X     quickly view what bam looks like so that you don't
  81. X     have to go through the whole installation before
  82. X     deciding if you want bam.
  83. X
  84. XIf you add something that you find interesting to bam, please
  85. Xremember to contact me so that we can coordinate the
  86. Xmodifications to be added to the distribution package.  This
  87. Xway more people will benefit from everybody's contributions.
  88. X
  89. XInstallation
  90. X************
  91. X
  92. X  1. `cd' to the directory where bam's sources are;
  93. X
  94. X  2. Edit the file `Makefile.in' to select your various
  95. X     installation directories (located at the beginning of
  96. X     the file.
  97. X
  98. X  3. Run the shell script withthe following command: 
  99. X     `sh ./configure.sh'
  100. X
  101. X     Note: I have compiled successfuly the program on sun3 and
  102. X     sun4.  You may have to experiment with the Makefile on other
  103. X     kind of machine.
  104. X
  105. X     A known problem is that cc, lex and the athena toolkit doesn't work
  106. X     together on sun3's so you have to use a substitute for cc or athena
  107. X     (gcc or xview).
  108. X
  109. X  4. type `make all'
  110. X
  111. X  5. type `make install'
  112. X     You now have a a command bemacs that gives you emacs with menus.
  113. X     So the following two items are not necessary. It is probably
  114. X     worthwhile to rename bemacs to xemacs if you plan on using it.
  115. X
  116. X  6. (You can skip this item if you are satisfied with the bemacs)
  117. X
  118. X     put in your `.emacs' the content of emacs_init.
  119. X      
  120. X     (To do this you can simply do 
  121. X     `cat /usr/local/lib/bam/emacs_init >> .emacs') where 
  122. X     `/usr/local/lib/bam' should be replaced by the
  123. X     directory name where you placed bam libraries.
  124. X
  125. X     >>>> Notice the >> redirection.  DON'T USE > or you WILL LOOSE <<<<
  126. X     >>>> YOUR PREVIOUS .emacs file.                                <<<<
  127. X
  128. X     Note:
  129. X         Make sure that the elisp librairies are accessible
  130. X         via Emacs' LOAD-PATH.  One way to do this is to put
  131. X         the elisp files in a given directory, for example
  132. X         `/usr/something/elispdir', and add that directory in
  133. X         Emacs' LOAD-PATH by including the following lisp 
  134. X         sentence in your initialization file (`~/.emacs'):
  135. X
  136. X            (setq load-path (cons "/usr/something/elispdir" load-path))
  137. X
  138. X  7. (You can skip this item if you are satisfied with bemacs)
  139. X
  140. X     If you are using the Athena version you have to change the
  141. X     normal emacs startup so that the the emacs windows are
  142. X     named(or bam can't place emacs inside of itself):
  143. X          emacs -wn Emacs`date +%T`
  144. X
  145. X  8. If you have lisp problems, consult your local Emacs guru.
  146. X
  147. END_OF_FILE
  148. if test 4303 -ne `wc -c <'bam-2.0/README'`; then
  149.     echo shar: \"'bam-2.0/README'\" unpacked with wrong size!
  150. fi
  151. # end of 'bam-2.0/README'
  152. fi
  153. if test -f 'bam-2.0/athena.c' -a "${1}" != "-c" ; then 
  154.   echo shar: Will not clobber existing file \"'bam-2.0/athena.c'\"
  155. else
  156. echo shar: Extracting \"'bam-2.0/athena.c'\" \(5644 characters\)
  157. sed "s/^X//" >'bam-2.0/athena.c' <<'END_OF_FILE'
  158. X/*   bam - the Born Again Menus for GNU Emacs.
  159. X   Copyright (C) 1992 Hans Olsson.
  160. X
  161. X    This program is free software; you can redistribute it and/or modify
  162. X    it under the terms of the GNU General Public License as published by
  163. X    the Free Software Foundation; either version 1, or (at your option)
  164. X    any later version.
  165. X
  166. X    This program is distributed in the hope that it will be useful,
  167. X    but WITHOUT ANY WARRANTY; without even the implied warranty of
  168. X    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  169. X    GNU General Public License for more details.
  170. X
  171. X    You should have received a copy of the GNU General Public License
  172. X    along with this program; if not, write to the Free Software
  173. X    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  174. X
  175. X  In other words, you are welcome to use, share and improve this program.
  176. X  You are forbidden to forbid anyone else to use, share and improve
  177. X  what you give them.   Help stamp out software-hoarding!
  178. X*/
  179. X/* $Id: athena.c,v 1.2 1992/07/27 22:53:17 sbo Exp $ */
  180. X
  181. X#include "bam.h"
  182. X#include "athena.h"
  183. X
  184. XWidget gam=NULL;
  185. Xint grab=1;
  186. Xchar *windowName=NULL;
  187. XXtTranslations button_xt;
  188. XXtAppContext app_con;
  189. XWidget mainFrame=NULL;
  190. XWidget pops[200];
  191. Xint pops_nr=0;
  192. X
  193. Xstatic int popped=0;
  194. Xstatic Widget popupList[100];
  195. X
  196. Xstatic String fallback_resources[] = { 
  197. X  "*shapeStyle:Oval\n",
  198. X  "*cornerRoundPercent:25\n",       
  199. X NULL
  200. X};
  201. X
  202. Xstatic char bam_translations[]=
  203. X" <BtnDown>      : PopupMenu() \n";
  204. X
  205. Xvoid popdownAll() 
  206. X{
  207. X  while(popped) {
  208. X    XtPopdown(popupList[--popped]);
  209. X  }
  210. X}
  211. X
  212. Xstatic void popdownSubmenus(w,event,params,num_params)
  213. X     Widget w;
  214. X     XEvent *event;
  215. X     String *params;
  216. X     Cardinal *num_params;
  217. X{
  218. X popdownAll();
  219. X}
  220. X
  221. XXtActionsRec trial_actions[]= {
  222. X  {"popdownSubmenus",popdownSubmenus}
  223. X};
  224. X  
  225. X
  226. X
  227. Xvoid popdownSubMenu(w,event,params,num_params)
  228. X     Widget w;
  229. X     XEvent *event;
  230. X     String *params;
  231. X     Cardinal *num_params;
  232. X{
  233. X  Widget theWidget = XtNameToWidget(mainFrame,params[0]);
  234. X    if (theWidget!=NULL)
  235. X      XtPopdown(theWidget);
  236. X}
  237. X
  238. Xvoid doMove(g) 
  239. X     Widget g;
  240. X{
  241. X  Window getwindow,junkwin;
  242. X  XWindowAttributes app_win_attr;
  243. X  Position outX,outY;
  244. X  int rx,ry;
  245. X  Dimension outW,outH;
  246. X
  247. X  Window mywin=XtWindow(g);
  248. X  if (gam!=NULL) {
  249. X    Arg args[4];
  250. X    XtSetArg(args[0],XtNwinX,&outX);
  251. X    XtSetArg(args[1],XtNwinY,&outY);
  252. X    XtSetArg(args[2],XtNwinWidth,&outW);
  253. X    XtSetArg(args[3],XtNwinHeight,&outH);
  254. X    XtGetValues(gam,args,4);
  255. X
  256. X  } else 
  257. X  if (windowName && 
  258. X      (getwindow= Window_With_Name(XtDisplay(g),
  259. X                                   DefaultRootWindow(XtDisplay(g)),
  260. X                                   windowName))) {
  261. X    XGetWindowAttributes(XtDisplay(g),getwindow,&app_win_attr);
  262. X    outW=app_win_attr.width;
  263. X    XTranslateCoordinates(XtDisplay(g),getwindow,app_win_attr.root,
  264. X                           -app_win_attr.border_width,
  265. X                           -app_win_attr.border_width,
  266. X                           &rx,&ry,&junkwin);
  267. X    outX=rx;
  268. X    XGetWindowAttributes(XtDisplay(g),mywin,&app_win_attr);
  269. X    outY=ry-app_win_attr.height;
  270. X    outH=app_win_attr.height;
  271. X  } else return;
  272. X  XMoveResizeWindow(XtDisplay(g),mywin,outX,outY-20,outW,outH);
  273. X/* the -20 is a kludge,caused by titlebars */
  274. X  
  275. X}
  276. X
  277. Xint window_main_loop(w) 
  278. X     Widget w;
  279. X{
  280. X  Screen *scr=XtScreen(mainFrame);
  281. X  int maxw=scr->width;
  282. X  int maxh=scr->height;
  283. X  
  284. X  XtRealizeWidget(mainFrame);
  285. X  doMove(mainFrame);
  286. X  {
  287. X    /* The following code pops up all the submenus,
  288. X     * so that they automagically will stay on the screen afterwards.
  289. X     */
  290. X    int i;
  291. X    for(i=0;i<pops_nr;i++) {
  292. X      Arg args[2];
  293. X      XtSetArg(args[0],XtNx,maxw+10);
  294. X      XtSetArg(args[1],XtNy,maxh+10);
  295. X      XtSetValues(pops[i],args,2);
  296. X      XtPopup(pops[i],XtGrabNone);
  297. X      XtPopdown(pops[i]);
  298. X    }
  299. X  }
  300. X  XtAppMainLoop(app_con);
  301. X  return 0;
  302. X}
  303. X
  304. Xint do_init(argc_p,argv) 
  305. X     int *argc_p;
  306. X     char**argv;
  307. X{
  308. X  mainFrame=XtAppInitialize(&app_con,"bam",NULL,0,
  309. X                            argc_p,argv,
  310. X                            fallback_resources,NULL,0);
  311. X  XtAppAddActions(app_con,trial_actions,XtNumber(trial_actions));
  312. X  button_xt=XtParseTranslationTable(bam_translations);
  313. X  return 0;
  314. X}
  315. X
  316. Xvoid menuProc (w,what,garbage)
  317. X     Widget w;
  318. X     XtPointer what;
  319. X     XtPointer garbage;
  320. X{
  321. X  sendToEmacs(what);
  322. X  popdownAll();
  323. X}
  324. X
  325. Xvoid menuUp (w,what,garbage)
  326. X     Widget w;
  327. X     XtPointer what;
  328. X     XtPointer garbage;
  329. X{
  330. X  Window root_ret,child_ret;
  331. X  int x,y;
  332. X  int winx,winy;
  333. X  unsigned int mask;
  334. X  Display *dpy=XtDisplay(mainFrame);
  335. X  Window win=XtWindow(mainFrame);
  336. X  Screen *scr=XtScreen(mainFrame);
  337. X  Widget w2=(Widget)what;
  338. X  int maxw=scr->width;/* DisplayWidth(dpy,dpy->default_screen); */
  339. X  int maxh=scr->height; /* DisplayHeight(dpy,dpy->default_screen); */
  340. X  Dimension height,width;
  341. X  if (XQueryPointer(dpy,win,&root_ret,&child_ret,&x,&y,&winx,&winy,
  342. X                    &mask)) {
  343. X    x=(x<20)?0:x-20;
  344. X    y=(y<20)?0:y-20;
  345. X    {
  346. X      Arg args[2];
  347. X      XtSetArg(args[0],XtNheight, &height);
  348. X      XtSetArg(args[1],XtNwidth, &width);
  349. X      XtGetValues(w2,args,2);
  350. X    }
  351. X#ifdef DEBUG
  352. X  printf("Height=%d,width=%d\nmaxw=%d,maxh=%d\n",height,width,maxw,maxh);
  353. X#endif
  354. X
  355. X    if (x+width>=maxw) x=maxw-width;
  356. X    if (y+height>=maxh) y=maxh-height;
  357. X#ifdef DEBUG
  358. X  printf("x=%d,y=%d\n",x,y);
  359. X#endif
  360. X    {
  361. X      Arg args[2];
  362. X      XtSetArg(args[0],XtNx,x);
  363. X      XtSetArg(args[1],XtNy,y);
  364. X      
  365. X      XtSetValues(w2,args,2);
  366. X    }
  367. X    while (XtAppPending(app_con)) { 
  368. X      XEvent xev;
  369. X      XtAppNextEvent(app_con,&xev);
  370. X      XtDispatchEvent(&xev);
  371. X    }
  372. X    XtPopup(w2, XtGrabNone);
  373. X    popupList[popped++]=w2;
  374. X  } else {
  375. X    sendErrorToEmacs("Sorry, wrong screen %s\n","");
  376. X  }
  377. X}
  378. END_OF_FILE
  379. if test 5644 -ne `wc -c <'bam-2.0/athena.c'`; then
  380.     echo shar: \"'bam-2.0/athena.c'\" unpacked with wrong size!
  381. fi
  382. # end of 'bam-2.0/athena.c'
  383. fi
  384. if test -f 'bam-2.0/command-process.el' -a "${1}" != "-c" ; then 
  385.   echo shar: Will not clobber existing file \"'bam-2.0/command-process.el'\"
  386. else
  387. echo shar: Extracting \"'bam-2.0/command-process.el'\" \(4578 characters\)
  388. sed "s/^X//" >'bam-2.0/command-process.el' <<'END_OF_FILE'
  389. X;   bam - the Born Again Menus for GNU Emacs.
  390. X;   Copyright (C) 1992 Dick Van Soest.
  391. X;
  392. X;    This program is free software; you can redistribute it and/or modify
  393. X;    it under the terms of the GNU General Public License as published by
  394. X;    the Free Software Foundation; either version 1, or (at your option)
  395. X;    any later version.
  396. X;
  397. X;    This program is distributed in the hope that it will be useful,
  398. X;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  399. X;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  400. X;    GNU General Public License for more details.
  401. X;
  402. X;    You should have received a copy of the GNU General Public License
  403. X;    along with this program; if not, write to the Free Software
  404. X;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  405. X;
  406. X;  In other words, you are welcome to use, share and improve this program.
  407. X;  You are forbidden to forbid anyone else to use, share and improve
  408. X;  what you give them.   Help stamp out software-hoarding!
  409. X
  410. X;;;  --------------------------------------------------------------------------
  411. X
  412. X;;(defvar escape-read-p nil
  413. X;;  "T if backslash is read from process.")
  414. X;;
  415. X;;(defvar in-string-p nil
  416. X;;  "T if process output is currently a string.")
  417. X;;
  418. X;;(defvar paren-level 0
  419. X;;  "Level of lists in process output.")
  420. X;;
  421. X;;(defvar process-output ""
  422. X;;  "Output of process.")
  423. X(defun command-process (command &rest args)
  424. X  "*Starts separate process COMMAND running in background.
  425. XOutput of this process is handled by function collect-output.
  426. XCollect-output is reset by command reset-command-process."
  427. X  (interactive "sCommand to run: ")
  428. X  (let* ((proc (apply 'start-process 
  429. X              (cons command 
  430. X                (cons ()
  431. X                  (cons command args)))))
  432. X     (proc-sym (intern (process-name proc))))
  433. X    (put proc-sym 'escape-read-p nil)
  434. X    (put proc-sym 'in-string-p nil)
  435. X    (put proc-sym 'paren-level 0)
  436. X    (put proc-sym 'process-output "")
  437. X    (set-process-filter proc 'collect-output)
  438. X    (set-process-sentinel proc 'ignore)
  439. X    proc))
  440. X
  441. X(defun reset-command-process (proc-name)
  442. X  "Resets command process with name PROC-NAME."
  443. X  (interactive "sProcess: ")
  444. X  (let ((proc-sym (intern proc)))
  445. X    (put proc-sym 'escape-read-p nil)
  446. X    (put proc-sym 'in-string-p nil)
  447. X    (put proc-sym 'paren-level 0)
  448. X    (put proc-sym 'process-output "")))
  449. X(defun collect-output (proc msg)
  450. X  "Function that collects output of PROC until a lisp list is complete.
  451. XIt then eval's that list."
  452. X  (let ((processed-upto-incl
  453. X     (1+ (foreach msg (function 
  454. X               (lambda (x) 
  455. X                 (change-state-depending-on-char proc x))))))
  456. X    (proc-sym (intern (process-name proc))))
  457. X    (if (not (zerop (get proc-sym 'paren-level)))
  458. X    (put proc-sym 'process-output
  459. X         (concat (get proc-sym 'process-output) msg))
  460. X      (progn 
  461. X    (eval (car (read-from-string 
  462. X            (concat (get proc-sym 'process-output)
  463. X                (substring msg 0 processed-upto-incl)))))
  464. X    (put proc-sym 'process-output "")
  465. X    (if (< processed-upto-incl (length msg))
  466. X        (collect-output proc (substring msg processed-upto-incl)))))))
  467. X
  468. X(defun change-state-depending-on-char (proc char)
  469. X  (let ((proc-sym (intern (process-name proc))))
  470. X    (cond
  471. X     ((get proc-sym 'escape-read-p)
  472. X      (put proc-sym 'escape-read-p nil))
  473. X     ((and (not (get proc-sym 'escape-read-p)) (get proc-sym 'in-string-p))
  474. X      (put proc-sym 'in-string-p (not (equal char ?\")))
  475. X      (put proc-sym 'escape-read-p (equal char ?\\)))
  476. X     ((and (not (get proc-sym 'escape-read-p)) (not (get proc-sym 'in-string-p)))
  477. X      (cond
  478. X       ((eq char ?\\)
  479. X    (put proc-sym 'escape-read-p t))
  480. X       ((eq char ?\")
  481. X    (put proc-sym 'in-string-p t))
  482. X       ((eq char ?\()
  483. X    (put proc-sym 'paren-level (1+ (get proc-sym 'paren-level))))
  484. X       ((eq char ?\))
  485. X    (put proc-sym 'paren-level (1- (get proc-sym 'paren-level)))))))
  486. X    (zerop (get proc-sym 'paren-level))))
  487. X
  488. X(defun foreach (seq fun)
  489. X  (let ((i 0)
  490. X    (seqlength (length seq)))
  491. X    (while (and (< i seqlength)
  492. X           (not (apply fun (list (elt seq i)))))
  493. X      (setq i (1+ i)))
  494. X    i))
  495. X      
  496. X(defun command-process-error (str)
  497. X  (with-output-to-temp-buffer "*command-process-errors*"
  498. X    (princ str)
  499. X    (message "Error in command-process")))
  500. X
  501. X(defun print-state (proc)
  502. X  (interactive  "sProcess: ")
  503. X  (let ((proc-sym (if (stringp proc)
  504. X              (intern-soft proc)
  505. X            (intern-soft (process-name proc)))))
  506. X    (format 
  507. X     "escape-read-p %s
  508. Xin-string-p %s
  509. Xparen-level %d
  510. Xprocess-output %s\n" 
  511. X     (get proc-sym 'escape-read-p)
  512. X     (get proc-sym 'in-string-p)
  513. X     (get proc-sym 'paren-level)
  514. X     (get proc-sym 'process-output))))
  515. X
  516. X(provide 'command-process)
  517. END_OF_FILE
  518. if test 4578 -ne `wc -c <'bam-2.0/command-process.el'`; then
  519.     echo shar: \"'bam-2.0/command-process.el'\" unpacked with wrong size!
  520. fi
  521. # end of 'bam-2.0/command-process.el'
  522. fi
  523. if test -f 'bam-2.0/menus/emacs-base-ol' -a "${1}" != "-c" ; then 
  524.   echo shar: Will not clobber existing file \"'bam-2.0/menus/emacs-base-ol'\"
  525. else
  526. echo shar: Extracting \"'bam-2.0/menus/emacs-base-ol'\" \(4826 characters\)
  527. sed "s/^X//" >'bam-2.0/menus/emacs-base-ol' <<'END_OF_FILE'
  528. X# @(#)emacs-base-ol    1.4 92/03/31
  529. X
  530. XFRAME
  531. XTITLE "Emacs Menu"
  532. XICON_LABEL "Bam Emacs"
  533. X    PANEL
  534. X        BUTTON "File" ""
  535. X        MENU PUSHPIN TRUE
  536. X        TITLE "Emacs: File"    
  537. X            TEXT "Load    C-x C-f" "(bam-emacs-base-ol:find-file)"
  538. X            TEXT "Browse  C-x d"   "(bam-emacs-base-ol:dired)"
  539. X            TEXT "Save    C-x C-s" "(bam-emacs-base-ol:save-buffer)"
  540. X            TEXT "Save As C-x C-w" "(bam-emacs-base-ol:write-file)"
  541. X            TEXT "Insert  C-x i" "(bam-emacs-base-ol:insert-file)"
  542. X            TEXT "" ""
  543. X            TEXT "Quit    C-x C-c" "(call-interactively 'save-buffers-kill-emacs)"
  544. X        END
  545. X        BUTTON "View" ""
  546. X        MENU
  547. X        TITLE "Emacs: View"
  548. X            TEXT "Split Window Horizontally C-x 5" "(split-window-horizontally)"
  549. X            TEXT "Split Window Vertically   C-x 2" "(split-window-vertically)"
  550. X            TEXT "Delete Window             C-x 0" "(call-interactively 'delete-window)"
  551. X            TEXT "Delete All Other Windows" "(delete-other-windows)"
  552. X            TEXT "" ""
  553. X            TEXT "Shrink Window Shorter" "(shrink-window 1)"
  554. X                TEXT "Grow Window Taller        C-x ^" "(enlarge-window 1)"
  555. X                   TEXT "Shrink Window Narrower" "(shrink-window-horizontally 1)"
  556. X            TEXT "Grow Window Wider" "(enlarge-window-horizontally 1)"
  557. X            TEXT "" ""
  558. X            TEXT "Switch To Other Window    C-x o" "(other-window 1)"
  559. X            TEXT "Select Buffer" "(call-interactively 'switch-to-buffer)"
  560. X            TEXT "List Buffers" "(call-interactively 'electric-buffer-list)"
  561. X            TEXT "Kill Buffer" "(call-interactively 'kill-buffer)"
  562. X         END
  563. X        BUTTON "Edit" ""
  564. X        MENU
  565. X        TITLE "Emacs: Edit"
  566. X            TEXT "Undo       C-x u" "(undo)"
  567. X            TEXT "" ""
  568. X            TEXT "Cut        C-w" "(call-interactively 'kill-region)"
  569. X            TEXT "Cut Word   M-d" "(kill-word 1)"
  570. X            TEXT "Cut To EOL C-k" "(kill-line)"
  571. X            TEXT "" ""
  572. X            TEXT "Copy"           "(call-interactively 'copy-region-as-kill)"
  573. X            TEXT "Paste      C-y" "(yank)"
  574. X        END
  575. X        BUTTON "Help" ""
  576. X        MENU
  577. X        TITLE "Emacs: Help"
  578. X            TEXT "Tutorial             C-h t" "(help-with-tutorial)"
  579. X            TEXT "Manual               C-h i" "(info)"
  580. X            TEXT "Mode Description     C-h m" "(describe-mode)"
  581. X            TEXT "Key Description      C-h k" "(call-interactively 'describe-key)"
  582. X            TEXT "Function Description C-h f" "(call-interactively 'describe-function)"
  583. X            TEXT "Match Command Names  C-h a" "(call-interactively 'command-apropos)"
  584. X        END
  585. X        BUTTON "Error" ""
  586. X        MENU
  587. X        TITLE "Emacs: Error"
  588. X            TEXT "Abort        C-g" "(progn (if (> (recursion-depth) 0) (abort-recursive-edit)) (setq cursor-in-echo-area nil) (keyboard-quit))"
  589. X            TEXT "Recover file" "(call-interactively 'recover-file)"
  590. X        END
  591. X        BUTTON "Search/Replace" ""
  592. X        MENU
  593. X        TITLE "Emacs: Search/Replace"
  594. X            TEXT "Forward Search            C-s" "(isearch-forward)"
  595. X            TEXT "Backward Search           C-r" "(isearch-backward)"
  596. X            TEXT "Search Regular Expression M-C-s" "(isearch-forward-regexp)"
  597. X            TEXT "Abort Search" "(if (> (recursion-depth) 0) (abort-recursive-edit))(keyboard-quit)"
  598. X            TEXT "Query Replace             M-%" "(call-interactively 'query-replace)"
  599. X                   TEXT "Reg Exp Query Replace" "(call-interactively 'query-replace-regexp)"
  600. X        END
  601. X        BUTTON "Motion" ""
  602. X        MENU
  603. X        TITLE "Emacs: Motion"
  604. X            TEXT "Page Down                 C-v" "(scroll-up)"
  605. X                   TEXT "Page Up                   M-v" "(scroll-down)"
  606. X            TEXT "Forward Paragraph" "(forward-paragraph)"
  607. X                TEXT "Backward Paragraph" "(backward-paragraph)"
  608. X            TEXT "Left Scroll" "(call-interactively 'scroll-left)"
  609. X            TEXT "Right Scroll" "(call-interactively 'scroll-right)"
  610. X            TEXT "Begin Of Document         M-<" "(beginning-of-buffer)"
  611. X            TEXT "End Of Document           M->" "(end-of-buffer)"
  612. X            TEXT "Go To Last Position       C-x C-x"
  613. X                   "(exchange-point-and-mark)"
  614. X            TEXT "Go To Previous Position   C-u C-<space>"
  615. X                   "(set-mark-command 1)"
  616. X            TEXT "Go To Line Number" "(call-interactively 'goto-line)"
  617. X        END
  618. X             BUTTON "Formatting" ""
  619. X        MENU
  620. X        TITLE "Emacs: Formatting"
  621. X            TEXT "Delete Whitespace" "(delete-horizontal-space)"
  622. X            TEXT "Delete Blank Lines" "(delete-blank-lines)"
  623. X             TEXT "Fill Paragraph" "(call-interactively 'fill-paragraph)"
  624. X            TEXT "Set Mark            C-<space>" "(push-mark)"
  625. X            TEXT "Fill From Mark" 
  626. X            "(fill-region (region-beginning) (region-end))"
  627. X            TEXT "Set Fill Column" "(call-interactively 'set-fill-column)"
  628. X            TEXT "Uppercase From Mark" 
  629. X            "(upcase-region (region-beginning) (region-end))"
  630. X            TEXT "Lowercase From Mark"
  631. X            "(downcase-region (region-beginning) (region-end))"
  632. X            TEXT "Capitalize From Mark"
  633. X            "(capitalize-region (region-beginning) (region-end))"
  634. X               END
  635. X        BUTTON "Applications" ""
  636. X        MENU
  637. X        TITLE "Emacs: Applications"
  638. X             TEXT "Read Mail" "(progn (rmail) (bam-open-menu \"rmail-menus\"))"
  639. X            TEXT "Compose Mail" "(mail)"
  640. X            TEXT "Usenet News" "(gnus)"
  641. X            TEXT "Info" "(info)"
  642. X            TEXT "Shell" "(shell)"
  643. X            TEXT "Compile" "(call-interactively 'compile)"
  644. X#            TEXT "Spell" "(ispell)"
  645. X            TEXT "Debug" "(call-interactively 'gdb)"
  646. X           END
  647. X    END
  648. XEND
  649. END_OF_FILE
  650. if test 4826 -ne `wc -c <'bam-2.0/menus/emacs-base-ol'`; then
  651.     echo shar: \"'bam-2.0/menus/emacs-base-ol'\" unpacked with wrong size!
  652. fi
  653. # end of 'bam-2.0/menus/emacs-base-ol'
  654. fi
  655. if test -f 'bam-2.0/menus/latex' -a "${1}" != "-c" ; then 
  656.   echo shar: Will not clobber existing file \"'bam-2.0/menus/latex'\"
  657. else
  658. echo shar: Extracting \"'bam-2.0/menus/latex'\" \(4743 characters\)
  659. sed "s/^X//" >'bam-2.0/menus/latex' <<'END_OF_FILE'
  660. X# $Id: latex,v 1.4 1992/07/27 22:56:24 sbo Exp $
  661. X
  662. XFRAME TITLE "Latex Menu"
  663. XICON_LABEL "Latex"
  664. XPANEL
  665. X
  666. XBUTTON "Command" ""
  667. XMENU 
  668. XTITLE "Latex: Command"
  669. X    TEXT "TeX buffer" "(TeX-buffer)"
  670. X    TEXT "TeX region" "(TeX-region (region-beginning) (region-end))"
  671. X    TEXT "recenter output" "(TeX-recenter-output-buffer ())"
  672. X    TEXT "preview" "(TeX-preview)"
  673. XEND
  674. X
  675. XBUTTON "Environments" ""
  676. XMENU
  677. XTITLE "Latex: Environments"
  678. X    TEXT "general..."  "(call-interactively 'latex-env-insrt)"
  679. X    TEXT "abstract"    "(latex-env-insrt \"abstract\")"
  680. X    TEXT "center"      "(latex-env-insrt \"center\")"
  681. X    TEXT "document"    "(latex-env-insrt \"document\")"
  682. X    TEXT "equation"    "(latex-env-insrt \"equation\")"
  683. X    TEXT "enumerate"   "(latex-env-and-item-insrt \"enumerate\")"
  684. X    TEXT "figure"    "(latex-env-insrt \"figure\")"
  685. X    TEXT "itemize"    "(latex-env-and-item-insrt \"itemize\")"
  686. X    TEXT "Others" ""
  687. X        MENU
  688. X            TEXT "picture"   "(latex-env-insrt \"picture\")"
  689. X            TEXT "quote"     "(latex-env-insrt \"quote\")"
  690. X            TEXT "quotation" "(latex-env-insrt \"quotation\")"
  691. X            TEXT "verbatim"  "(latex-env-insrt \"verbatim\")"
  692. X        END
  693. XEND
  694. X
  695. XBUTTON "Formatting" ""
  696. XMENU
  697. XTITLE "Latex: Formatting"
  698. X    TEXT "set fill prefix"          "(set-fill-prefix)"
  699. X    TEXT "set fill prefix 2 spaces" "(setq fill-prefix \"  \")"
  700. X    TEXT "set fill prefix 4 sp."    "(setq fill-prefix \"    \")"
  701. X    TEXT "incr fill prefix 2 sp."   "(setq fill-prefix (concat fill-prefix \"  \"))"
  702. X    TEXT "reset fill prefix"        "(setq fill-prefix ())"
  703. X    TEXT "set fill column"          "(set-fill-column)"
  704. X    TEXT "reset fill column"        "(setq fill-column 70)"
  705. XEND
  706. X
  707. XBUTTON "Misc" ""
  708. XMENU 
  709. XTITLE "Latex: Misc"
  710. X    TEXT "insertplot" "(strings-to-buffer \"\\\\insertplot{\" \"}{}{}{}{}{}\n% Arguments:\n% 1. Offset from left margin\n% 2. File name\n% 3. Vertical space to leave for figure\n% 4. Horizontal scaling\n% 5. Vertical scaling\n% 6. Original orientation of figure:\n%    0 = original has landscape orientation\n%    1 = original has portrait orientation\n\")"
  711. X    TEXT "verb" "(strings-to-buffer \"\\\\verb+\" \"+\")"
  712. XEND
  713. X
  714. XBUTTON "Sectioning" ""
  715. XMENU
  716. XTITLE "Latex: Sectioning"
  717. X    TEXT "part"           "(strings-to-buffer \"\\\\part{\" \"}\n\n\")"
  718. X    TEXT "chapter"        "(strings-to-buffer \"\\\\chapter{\" \"}\n\n\")"
  719. X    TEXT "section"        "(strings-to-buffer \"\\\\section{\" \"}\n\n\")"
  720. X    TEXT "subsection"     "(strings-to-buffer \"\\\\subsection{\" \"}\n\n\")"
  721. X    TEXT "subsubsection"  "(strings-to-buffer \"\\\\subsubsection{\" \"}\n\n\")"
  722. X    TEXT "paragraph"      "(strings-to-buffer \"\\\\paragraph{\" \"}\n\")"
  723. X    TEXT "subparagraph"   "(strings-to-buffer \"\\\\subparagraph{\" \"}\n\")"
  724. X    TEXT "par"            "(strings-to-buffer \"\\\\par\n\" \"\")"
  725. X    TEXT "chapter*"       "(strings-to-buffer \"\\\\chapter*{\" \"}\n\n\")"
  726. X    TEXT "section*"       "(strings-to-buffer \"\\\\section*{\" \"}\n\n\")"
  727. X    TEXT "subsection*"    "(strings-to-buffer \"\\\\subsection*{\" \"}\n\n\")"
  728. X    TEXT "subsubsection*" "(strings-to-buffer \"\\\\subsubsection*{\" \"}\n\n\")"
  729. X    TEXT "paragraph*"     "(strings-to-buffer \"\\\\paragraph*{\" \"}\n\")"
  730. X    TEXT "subparagraph*"  "(strings-to-buffer \"\\\\subparagraph*{\" \"}\n\")"
  731. X    TEXT "par*"           "(strings-to-buffer \"\\\\par\n\" \"\")"
  732. XEND
  733. X
  734. X
  735. XBUTTON "Style" ""
  736. XMENU 
  737. XTITLE "Latex: Style"
  738. X    TEXT "empty sheet file" "(strings-to-buffer \"\\\\documentstyle[11pt,sheet]{article}\n\\\\sheetbottomleft{\" \"}\n\\\\sheetbottomright{}\n\\\\begin{document}\n\n%*****************************************************************\n%                         new sheet\n%*****************************************************************\n\n\\\\sheettop{}\n\\\\sheetitem{}\n\\\\sheetbottom\n\n\\\\end{document}\n\")"
  739. X    TEXT "sheetpage" "(strings-to-buffer \"%*****************************************************************\n%                         new sheet\n%*****************************************************************\n\n\\\\sheettop{\" \"}\n\\\\sheetitem{}\n\\\\sheetbottom\n\n\")"
  740. X    TEXT "subsheets" "(strings-to-buffer \"\\\\begin{subsheets}\n\" \"\n\\\\end{subsheets}\n\")"
  741. X    TEXT "sheetitem" "(strings-to-buffer \"\\\\sheetitem{\" \"}\n\")"
  742. XEND
  743. X
  744. XBUTTON "Typesizes" ""
  745. XMENU
  746. XTITLE "Latex: Typesizes"
  747. X    TEXT "Huge" "(strings-to-buffer \"\\\\Huge \" \"\")"
  748. X    TEXT "huge" "(strings-to-buffer \"\\\\huge \" \"\")"
  749. X    TEXT "LARGE" "(strings-to-buffer \"\\\\LARGE \" \"\")"
  750. X    TEXT "Large" "(strings-to-buffer \"\\\\Large \" \"\")"
  751. X    TEXT "large" "(strings-to-buffer \"\\\\large \" \"\")"
  752. X    TEXT "normalsize" "(strings-to-buffer \"\\\\normalsize \" \"\")"
  753. X    TEXT "small" "(strings-to-buffer \"\\\\small \" \"\")"
  754. X    TEXT "footnotesize" "(strings-to-buffer \"\\\\footnotesize \" \"\")"
  755. X    TEXT "scriptsize" "(strings-to-buffer \"\\\\scriptsize \" \"\")"
  756. X    TEXT "tiny" "(strings-to-buffer \"\\\\tiny \" \"\")"
  757. XEND
  758. X
  759. XEND 
  760. XEND
  761. X
  762. X
  763. X
  764. X
  765. END_OF_FILE
  766. if test 4743 -ne `wc -c <'bam-2.0/menus/latex'`; then
  767.     echo shar: \"'bam-2.0/menus/latex'\" unpacked with wrong size!
  768. fi
  769. # end of 'bam-2.0/menus/latex'
  770. fi
  771. if test -f 'bam-2.0/menus/rmail-menus' -a "${1}" != "-c" ; then 
  772.   echo shar: Will not clobber existing file \"'bam-2.0/menus/rmail-menus'\"
  773. else
  774. echo shar: Extracting \"'bam-2.0/menus/rmail-menus'\" \(4959 characters\)
  775. sed "s/^X//" >'bam-2.0/menus/rmail-menus' <<'END_OF_FILE'
  776. XFRAME TITLE "Rmail Menu"
  777. XPANEL 
  778. XBUTTON "File" "" MENU TITLE "Rmail: File"
  779. X    TEXT "Get New Mail           g"
  780. X         "(bam-rmail-menus:rmail-get-new-mail)"
  781. X    TEXT "Open Rmail File" 
  782. X         "(bam-rmail-menus:rmail)"
  783. X       MENU TITLE "Rmail: Open"
  784. X       TEXT "RMAIL File"
  785. X        "(bam-rmail-menus:rmail)"
  786. X       TEXT "Other In-Box File"
  787. X        "(bam-rmail-menus:rmail-input)"
  788. X    END
  789. X    TEXT "Copy into Rmail File   o" 
  790. X         "(bam-rmail-menus:rmail-output-to-rmail-file)"
  791. X    TEXT "Save changes           s"
  792. X         "(bam-rmail-menus:rmail-expunge-and-save)"
  793. X    TEXT "Done                   q"
  794. X         "(bam-rmail-menus:rmail-quit)"
  795. XEND
  796. XBUTTON "View" "" MENU TITLE "Rmail: View"
  797. X    TEXT "Next" 
  798. X         "(bam-rmail-menus:rmail-next-undeleted-message)"
  799. X        MENU TITLE "Rmail: Next" 
  800. X        TEXT "non-deleted message       n" 
  801. X             "(bam-rmail-menus:rmail-next-undeleted-message)"
  802. X        TEXT "Message With Label" 
  803. X             "(bam-rmail-menus:rmail-next-labeled-message)"
  804. X        TEXT "any message             M-n" 
  805. X             "(bam-rmail-menus:rmail-next-message)"
  806. X    END
  807. X    TEXT "Previous" "(bam-rmail-menus:rmail-previous-undeleted-message)"
  808. X        MENU TITLE "Rmail: Previous" 
  809. X        TEXT "non-deleted message       p" 
  810. X             "(bam-rmail-menus:rmail-previous-undeleted-message)"
  811. X        TEXT "Message With Label" 
  812. X             "(bam-rmail-menus:rmail-previous-labeled-message)"
  813. X        TEXT "any message             M-p" 
  814. X             "(bam-rmail-menus:rmail-previous-message)"
  815. X    END
  816. X    TEXT "Last Message" "(bam-rmail-menus:rmail-last-message)"
  817. X    TEXT "" ""
  818. X    TEXT "Next Page" "(bam-rmail-menus:rmail-scroll-message-up)"
  819. X    TEXT "Previous Page" "(bam-rmail-menus:rmail-scroll-message-down)"
  820. X    TEXT "Beginning of Message" 
  821. X         "(bam-rmail-menus:rmail-beginning-of-message)"
  822. X    TEXT "" ""
  823. X    TEXT "Message Number"
  824. X         "(bam-rmail-menus:rmail-message-number)"
  825. X    TEXT "Toggle Header"
  826. X         "(bam-rmail-menus:rmail-toggle-header)"
  827. X    TEXT "" ""
  828. X        TEXT "Summary" "(bam-rmail-menus:rmail-summary)"
  829. X         MENU TITLE "Rmail: Summary"
  830. X         TEXT "All messages"
  831. X          "(bam-rmail-menus:rmail-summary)"
  832. X         TEXT "Select by Label"
  833. X          "(bam-rmail-menus:rmail-summary-by-labels)"
  834. X         TEXT "Select by Recipients"
  835. X          "(bam-rmail-menus:rmail-summary-by-recipients)"
  836. X    END
  837. XEND
  838. XBUTTON "Edit" "" MENU TITLE "Rmail: Edit"
  839. X        TEXT "Current Message" 
  840. X         "(bam-rmail-menus:rmail-edit-current-message)"
  841. X    TEXT "Delete" "(bam-rmail-menus:rmail-delete-forward)" 
  842. X    MENU TITLE "Rmail: Delete"
  843. X         TEXT "Move Forward after delete"
  844. X        "(bam-rmail-menus:rmail-delete-forward)"
  845. X         TEXT "Stay on it after delete"
  846. X        "(bam-rmail-menus:rmail-delete-message)"
  847. X         TEXT "Move Backward after delete"
  848. X        "(bam-rmail-menus:rmail-delete-backward)"
  849. X    END
  850. X    TEXT "Label" "(bam-rmail-menus:rmail-add-label)"
  851. X    MENU TITLE "Rmail: Label"
  852. X         TEXT "Add"
  853. X          "(bam-rmail-menus:rmail-add-label)"
  854. X         TEXT "Remove"
  855. X          "(bam-rmail-menus:rmail-kill-label)"
  856. X    END
  857. X    TEXT "Undelete" "(bam-rmail-menus:rmail-undelete)"
  858. X    MENU TITLE "Rmail: Undelete"
  859. X         TEXT "Stay on it after Undelete"
  860. X        "(bam-rmail-menus:rmail-undelete)"
  861. X         TEXT "Move Forward after Undelete"
  862. X        "(bam-rmail-menus:undelete-and-forward)"
  863. X         TEXT "Move Backward after Undelete"
  864. X        "(bam-rmail-menus:undelete-and-backward)"
  865. X    END
  866. X
  867. XEND
  868. XBUTTON "Search" "" MENU TITLE "Rmail: Search"
  869. X    TEXT "In this Message"
  870. X         "(bam-rmail-menus:isearch-forward)"
  871. X    MENU TITLE "Rmail: Search In Message"
  872. X           TEXT "Forward" 
  873. X            "(bam-rmail-menus:isearch-forward)"
  874. X       MENU TITLE "Rmail: Search Forward"
  875. X            TEXT "Incremental"
  876. X             "(bam-rmail-menus:isearch-forward)"
  877. X             TEXT "Normal"
  878. X              "(bam-rmail-menus:search-forward)"
  879. X       END
  880. X           TEXT "Backward" 
  881. X            "(bam-rmail-menus:isearch-backward)"
  882. X       MENU TITLE "Rmail: Search Backward"
  883. X            TEXT "Incremental"
  884. X             "(bam-rmail-menus:isearch-backward)"
  885. X            TEXT "Normal"
  886. X             "(bam-rmail-menus:search-backward)"
  887. X       END
  888. X       TEXT "Regular Expression"
  889. X            "(bam-rmail-menus:rmail-search)"
  890. X       MENU TITLE "Rmail: Search Regexp"
  891. X           TEXT "Forward" 
  892. X            "(bam-rmail-menus:isearch-forward-regexp)"
  893. X           TEXT "Backward" 
  894. X            "(bam-rmail-menus:isearch-backward-regexp)"
  895. X       END
  896. X    END
  897. X    TEXT "In other Messages"
  898. X         "(bam-rmail-menus:rmail-search)"
  899. X    MENU TITLE "Rmail: Search Other Messages"
  900. X           TEXT "Forward" 
  901. X            "(bam-rmail-menus:rmail-search)"
  902. X           TEXT "Backward" 
  903. X            "(bam-rmail-menus:rmail-search 'backward)"
  904. X    END
  905. XEND
  906. XBUTTON "Compose" "" MENU TITLE "Rmail: Compose"
  907. X        TEXT "New" 
  908. X         "(bam-rmail-menus:mail)"
  909. X    TEXT "Reply" "(bam-rmail-menus:rmail-reply nil nil)" 
  910. X    MENU TITLE "Rmail: Reply"
  911. X         TEXT "To Sender"
  912. X        "(bam-rmail-menus:rmail-reply nil nil)"
  913. X         TEXT "To All"
  914. X        "(bam-rmail-menus:rmail-reply nil 'to-all)"
  915. X         TEXT "To Sender, Include this Message"
  916. X        "(bam-rmail-menus:rmail-reply 'include-message nil)"
  917. X         TEXT "To All, Include this Message"
  918. X        "(bam-rmail-menus:rmail-reply 'include-message 'to-all)"
  919. X    END
  920. X    TEXT "Forward" "(bam-rmail-menus:rmail-forward)"
  921. XEND
  922. X
  923. XEND
  924. XEND
  925. X
  926. X
  927. END_OF_FILE
  928. if test 4959 -ne `wc -c <'bam-2.0/menus/rmail-menus'`; then
  929.     echo shar: \"'bam-2.0/menus/rmail-menus'\" unpacked with wrong size!
  930. fi
  931. # end of 'bam-2.0/menus/rmail-menus'
  932. fi
  933. echo shar: End of archive 3 \(of 7\).
  934. cp /dev/null ark3isdone
  935. MISSING=""
  936. for I in 1 2 3 4 5 6 7 ; do
  937.     if test ! -f ark${I}isdone ; then
  938.     MISSING="${MISSING} ${I}"
  939.     fi
  940. done
  941. if test "${MISSING}" = "" ; then
  942.     echo You have unpacked all 7 archives.
  943.     rm -f ark[1-9]isdone
  944. else
  945.     echo You still need to unpack the following archives:
  946.     echo "        " ${MISSING}
  947. fi
  948. ##  End of shell archive.
  949. exit 0
  950.  
  951. exit 0 # Just in case...
  952.