X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/e5575c067a852aebd5f5e0f2ad7cb6dc1b905b97..332ad7ce48d611a232ddd085331b1069637d85a1:/lisp/startup.el diff --git a/lisp/startup.el b/lisp/startup.el index 6a32bb10a3..081b3aed12 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -41,13 +41,14 @@ ; -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,14 +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.") + (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. @@ -165,6 +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) "@" + (or mail-host-address + (system-name)))) (let ((menubar-bindings-done nil)) (unwind-protect (command-line) @@ -213,6 +246,21 @@ this variable, if non-nil; 2. `~/.emacs'; 3. `default.el'.") (string= vc "simple")) (setq version-control 'never)))) + (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))) + ;;! This has been commented out; I currently find the behavior when ;;! split-window-keep-point is nil disturbing, but if I can get used ;;! to it, then it would be better to eliminate the option. @@ -220,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))) @@ -242,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")) @@ -250,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 @@ -259,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)) @@ -269,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)