[comp.emacs] Mods to startup.el for GNU emacs 18.55

warsaw@rtg.cme.nist.gov (Barry A. Warsaw) (09/06/89)

I've made a few changes to emacs/lisp/startup.el which gives you a bit
more flexibility in starting emacs up.  I include a context diff
suitable for patch below.  Here's a summary of what the changes give you:

1) Back in August '89, Lynn Slater posted some code that will let you
define command line switches to emacs.  Here's the description that
came with the code:

======================================================================
From: indetech!lrs@ai.mit.edu (Lynn Slater)
Newsgroups: gnu.emacs
Subject: Settable command line arguments
Date: 2 Aug 89 15:18:00 GMT
Distribution: gnu
Organization: GNUs Not Usenet

The following changes to startup.el allow hooks to define new command line
arguments without rebuilding emacs.  Example:

 emacs -batch -l dbiogen -data DBIO.eld -verify -status -describe -autogen DBIO

The load of dbiogen defines hooks that recognizes all those successive
arguments which would not be otherwise recognized.

To define a hook, load code such as the following:
  (setq command-line-hooks (cons 'do-object-data command-line-hooks))
  (defun do-object-data ()
    (if (string= argi "-data")
	(let ((datafile (car command-line-args-left)))
	  (setq command-line-args-left (cdr command-line-args-left))
	  (object-data datafile)
	  )))


I regret that I cannot construct meaningful diffs of startup.el.
======================================================================

Well, I *have* been able to construct meaningful diffs which
incorporate Lynn's mods.  Thanks Lynn, for some neat stuff.

2) One of the things that always bugged me about emacs was that I had
to rebuild the binary whenever I made a change that affected the site
wide emacs environment.  For example, say I wanted to change the
load-path site wide, or put some new autoloads in that everyone could
use, or change the gnus nntp server name.  I always had to hack
site-init.el, re-byte-compile that file, then rebuild emacs.  Sure, I
know about default.el, but that gets loaded in *after* a user's .emacs
file.  I wanted something that gets loaded in *before* your ~/.emacs,
that I could change whenever I wanted and not have to rebuild emacs to
propogate the changes.  That way, users could utilize site wide stuff
in their .emacs file.

So anyway, I put a simple hack into startup.el which will load a
library dynamically on startup, *before* command-line switches (see
above) and *before* ~/.emacs.  The library is called
"emacs-site{.el,.elc}" by default, though if the variable
`site-startup-file' is bound, its value is used as the startup file.
The startup file must be on the compiled load path to be found.  Also,
since `load' is used, you don't need to put the {.el,.elc} suffix on
the value of site-startup-file.

Startup load order is now: 1) emacs-site.elc, 2) ~/.emacs, 3) command
line switches.  A switch "-s" as the first command line argument
inhibits loading of emacs-site.elc.

I've also looked at what things are better put in site-init and what
things are better put in emacs-site and right now I'm thinking that
all key bindings, load-path changes, and autoloads should go in
emacs-site while all pure storage loads (and binding of
site-startup-file) should go in site-init.  You may find a better
scheme.  I set up load-path in paths.h-dist to be the minimal path
needed to build emacs, then set my "production" load-path in
emacs-site.  This seems to work well.  Anyway, enough babble, the
diffs follow.  Enjoy.

-Barry

NAME: Barry A. Warsaw                USMAIL: National Institute of Standards
TELE: (301) 975-3460                         and Technology (formerly NBS)
UUCP: {...}!uunet!cme-durer!warsaw           Rm. B-124, Bldg. 220
ARPA: warsaw@cme.nist.gov                    Gaithersburg, MD 20899



--cut here-------------------------------------------------------
*** startup.el.orig	Wed Aug 30 16:37:27 1989
--- startup.el	Fri Sep  1 18:20:18 1989
***************
*** 48,51 ****
--- 48,65 ----
  ; -kill			kill (exit) emacs
  
+ ;; the following changes/additions have been made to allow site
+ ;; configurable command line arguments.  These mods were distributed
+ ;; by lrs@ai.mit.edu (Lynn Slater) and installed by
+ ;; warsaw@cme.nist.gov (Barry Warsaw) on 30-Aug-1989.
+ 
+ (defvar command-line-hooks nil    ;; lrs 7/31/89
+   "*A list of functions to call to process every unrecognized entry on
+ the command line.  Each function should access the dynamically bound
+ variables argi (the current argument) and command-line-args-left (the
+ remaining arguments) . The function should return non-nil only if it
+ recognizes and processes argi. In this case, the function may consume
+ successive arguments by trimming command-line-args-left (via setq).")
+ 
+ 
  (setq top-level '(normal-top-level))
  
***************
*** 94,97 ****
--- 108,122 ----
  	(init (if noninteractive nil (user-login-name)))
  	(done nil))
+     ;; load a site-wide "emacs-site" file BEFORE loading user's .emacs file
+     ;; this way we can make site wide changes to environment without having
+     ;; to always rebuild emacs.   1-Sep-1989 baw, warsaw@cme.nist.gov
+     ;; load order: "emacs-site", ~/.emacs, command lines
+     (if (string= (car args) "-s")
+ 	(setq args (cdr args))
+       (load (if (and (boundp 'site-startup-file)
+ 		     site-startup-file)
+ 		site-startup-file
+ 	      "emacs-site")
+ 	    t t))
      ;; If user has not done su, use current $HOME to find .emacs.
      (and init (string= init (user-real-login-name))
***************
*** 222,228 ****
  		((string-match "^\\+[0-9]+\\'" argi)
  		 (setq line (string-to-int argi)))
  		(t
! 		 (find-file (expand-file-name argi dir))
! 		 (or (zerop line)
! 		     (goto-line line))
! 		 (setq line 0))))))))
--- 247,274 ----
  		((string-match "^\\+[0-9]+\\'" argi)
  		 (setq line (string-to-int argi)))
+ 
+ ;; modifications made to distribution startup.el as per mods supplied by
+ ;; Lynn Slater (see top of file)
+ ;; 30-Aug-1989 baw
+ ;;
+ ;;		(t
+ ;;		 (find-file (expand-file-name argi dir))
+ ;;		 (or (zerop line)
+ ;;		     (goto-line line))
+ ;;		 (setq line 0))))))))
+ 
  		(t
! 		 ;; We have almost exhausted our options. See if the
! 		 ;; user has made any other command-line options available
! 		 (let ((hooks command-line-hooks);; lrs 7/31/89
! 		       (did-hook nil))
! 		   (while (and hooks (not (and (funcall (car hooks))
! 					       (setq did-hook t))))
! 		     (setq hooks (cdr hooks)))
! 		   (if (not did-hook)
! 		       ;; Ok, give up and presume that the argument
! 		       ;; is a file name
! 		       (find-file (expand-file-name argi dir))
! 		     (or (zerop line)
! 			 (goto-line line))
! 		     (setq line 0))))))))))