]> code.delx.au - gnu-emacs/blobdiff - lisp/startup.el
(nntp-open-server): Send MODE READER command to server.
[gnu-emacs] / lisp / startup.el
index 4fece7dda51a351e3aab14c0ca689eefb023dc4f..081b3aed126946c2db4cb874deb709a1521d9dc0 100644 (file)
 ; -u user              load user's init file
 ; -user user           same
 ; -debug-init          Don't catch errors in init file; let debugger run.
+; -no-site-file                Don't load site-run-file.
 
 ; These are processed in the order encountered.
 ; -f function          execute function
 ; -funcall function    same
 ; -l file              load file
 ; -load file           same
-; -insert file         same
+; -insert file         insert file into buffer
 ; file                 visit file
 ; -kill                        kill (exit) emacs
 
@@ -81,6 +82,9 @@ Elements look like (SWITCH-STRING . HANDLER-FUNCTION).
 HANDLER-FUNCTION receives switch name as sole arg;
 remaining command-line args are in the variable `command-line-args-left'.")
 
+(defvar command-line-args-left nil
+  "List of command-line args not yet processed.")
+
 (defvar command-line-functions nil    ;; lrs 7/31/89
   "List of functions to process unrecognized command-line arguments.
 Each function should access the dynamically bound variables
@@ -141,17 +145,40 @@ higher incidence of change, don't make sense to load into emacs'
 dumped image.  Thus, the run-time load order is: 1. file described in
 this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.")
 
+(defconst iso-8859-1-locale-regexp "8859[-_]?1"
+  "Regexp that specifies when to enable the ISO 8859-1 character set.
+We do that if this regexp matches the locale name
+specified by the LC_ALL, LC_CTYPE and LANG environment variables.")
+
+(defvar mail-host-address nil
+  "*Name of this machine, for purposes of naming users.")
+
 (defvar user-mail-address nil
-  "Full mailing address of this user.")
+  "*Full mailing address of this user.")
 
 (defvar init-file-debug nil)
 
 (defvar init-file-had-error nil)
 
+;; This function is called from the subdirs.el file.
+(defun normal-top-level-add-to-load-path (dirs)
+  (let ((tail (member default-directory load-path)))
+    (setcdr tail (append (mapcar 'expand-file-name dirs) (cdr tail)))))
+
 (defun normal-top-level ()
   (if command-line-processed
       (message "Back to top level.")
     (setq command-line-processed t)
+    ;; Look in each dir in load-path for a subdirs.el file.
+    ;; If we find one, load it, which will add the appropriate subdirs
+    ;; of that dir into load-path,
+    (let ((tail load-path)
+         new)
+      (while tail
+       (setq new (cons (car tail) new))
+       (let ((default-directory (car tail)))
+         (load (expand-file-name "subdirs.el" (car tail)) t t t))
+       (setq tail (cdr tail))))
     (if (not (eq system-type 'vax-vms))
        (progn
          ;; If the PWD environment variable isn't accurate, delete it.
@@ -168,7 +195,9 @@ this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.")
                           (delete (concat "PWD=" pwd)
                                   process-environment)))))))
     (setq default-directory (abbreviate-file-name default-directory))
-    (setq user-mail-address (concat (user-login-name) "@" (system-name)))
+    (setq user-mail-address (concat (user-login-name) "@"
+                                   (or mail-host-address
+                                       (system-name))))
     (let ((menubar-bindings-done nil))
       (unwind-protect
          (command-line)
@@ -201,9 +230,6 @@ this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.")
               (x-popup-menu nil (cdr (cdr (car submap)))))
          (setq submap (cdr submap))))))
 
-(defconst iso-8859-1-locale-regexp "iso[-_]?8859[-_]1"
-  "Use ISO 8859-1 character set by default if this regexp matches LC_CTYPE.")
-
 (defun command-line ()
   (setq command-line-default-directory default-directory)
 
@@ -220,8 +246,18 @@ this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.")
               (string= vc "simple"))
           (setq version-control 'never))))
 
-  (if (string-match iso-8859-1-locale-regexp (getenv "LC_CTYPE"))
+  (if (let ((ctype
+            ;; Use the first of these three envvars that has a nonempty value.
+            (or (let ((string (getenv "LC_ALL")))
+                  (and (not (equal string "")) string))
+                (let ((string (getenv "LC_CTYPE")))
+                  (and (not (equal string "")) string))
+                (let ((string (getenv "LANG")))
+                  (and (not (equal string "")) string)))))
+       (and ctype
+            (string-match iso-8859-1-locale-regexp ctype)))
       (progn 
+       (require 'disp-table)
        (standard-display-european t)
        (require 'iso-syntax)))
 
@@ -232,13 +268,31 @@ this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.")
   ;;! (setq split-window-keep-point (> baud-rate 2400))
 
   ;; Read window system's init file if using a window system.
-  (if (and window-system (not noninteractive))
-      (load (concat term-file-prefix
-                   (symbol-name window-system)
-                   "-win")
-           ;; Every window system should have a startup file;
-           ;; barf if we can't find it.
-           nil t))
+  (condition-case error
+      (if (and window-system (not noninteractive))
+         (load (concat term-file-prefix
+                       (symbol-name window-system)
+                       "-win")
+               ;; Every window system should have a startup file;
+               ;; barf if we can't find it.
+               nil t))
+    ;; If we can't read it, print the error message and exit.
+    (error
+     (princ
+      (if (eq (car error) 'error)
+         (apply 'concat (cdr error))
+       (if (memq 'file-error (get (car error) 'error-conditions))
+           (format "%s: %s"
+                    (nth 1 error)
+                    (mapconcat '(lambda (obj) (prin1-to-string obj t))
+                               (cdr (cdr error)) ", "))
+         (format "%s: %s"
+                  (get (car error) 'error-message)
+                  (mapconcat '(lambda (obj) (prin1-to-string obj t))
+                             (cdr error) ", "))))
+      'external-debugging-output)
+     (setq window-system nil)
+     (kill-emacs)))
 
   (let ((done nil)
        (args (cdr command-line-args)))
@@ -254,7 +308,21 @@ this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.")
     ;; processed.  This is consistent with the way main in emacs.c
     ;; does things.
     (while (and (not done) args)
-      (let ((argi (car args)))
+      (let ((longopts '(("--no-init-file") ("--no-site-file") ("--user")
+                       ("--debug-init")))
+           (argi (car args))
+           (argval nil))
+       (if (string-match "=" argi)
+           (setq argval (substring argi (match-end 0))
+                 argi (substring argi 0 (match-beginning 0))))
+       (let ((completion (try-completion argi longopts)))
+         (if (eq completion t)
+             (setq argi (substring argi 1))
+           (if (stringp completion)
+               (let ((elt (assoc completion longopts)))
+                 (or elt
+                     (error "Option `%s' is ambiguous" argi))
+                 (setq argi (substring (car elt) 1))))))
        (cond
         ((or (string-equal argi "-q")
              (string-equal argi "-no-init-file"))
@@ -262,8 +330,11 @@ this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.")
                args (cdr args)))
         ((or (string-equal argi "-u")
              (string-equal argi "-user"))
-         (setq args (cdr args)
-               init-file-user (car args)
+         (or argval
+             (setq argval (car args)
+                   args (cdr args)))
+         (setq init-file-user argval
+               argval nil
                args (cdr args)))
         ((string-equal argi "-no-site-file")
          (setq site-run-file nil
@@ -271,8 +342,11 @@ this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.")
         ((string-equal argi "-debug-init")
          (setq init-file-debug t
                args (cdr args)))
-        (t (setq done t)))))
-    
+        (t (setq done t)))
+       ;; Was argval set but not used?
+       (and argval
+            (error "Option `%s' doesn't allow an argument" argi))))
+
     ;; Re-attach the program name to the front of the arg list.
     (setcdr command-line-args args))
 
@@ -281,6 +355,10 @@ this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.")
       (face-initialize))
   (if (fboundp 'frame-initialize)
       (frame-initialize))
+  ;; If frame was created with a menu bar, set menu-bar-mode on.
+  (if (and (eq window-system 'x)
+          (> (cdr (assq 'menu-bar-lines (frame-parameters))) 0))
+      (menu-bar-mode t))
 
   (run-hooks 'before-init-hook)