X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/3fc958a457c155b5975af0d940795fdb7b32e55a..d1b985ec39dc2a7e04b376b41bc717ee95244522:/lisp/startup.el diff --git a/lisp/startup.el b/lisp/startup.el index 7775a9a217..da88df9e8e 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -1,11 +1,15 @@ -;; Process Emacs shell arguments -;; Copyright (C) 1985, 1986 Free Software Foundation, Inc. +;;; startup.el --- process Emacs shell arguments + +;; Copyright (C) 1985, 1986, 1992 Free Software Foundation, Inc. + +;; Maintainer: FSF +;; Keywords: internal ;; This file is part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 1, or (at your option) +;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, @@ -17,6 +21,7 @@ ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +;;; Commentary: ; These are processed only at the beginning of the argument list. ; -batch execute noninteractively (messages go to stdout, @@ -47,6 +52,8 @@ ; file visit file ; -kill kill (exit) emacs +;;; Code: + (setq top-level '(normal-top-level)) (defvar command-line-processed nil "t once command line has been processed") @@ -73,14 +80,19 @@ arguments). The function should return non-nil only if it recognizes and processes argi. If it does so, it may consume successive arguments by altering command-line-args-left to remove them.") -(defvar pre-init-hook nil +(defvar before-init-hook nil "Functions to call after handling urgent options but before loading init file. -The window/screen system uses this to open screens to display messages while +The frame system uses this to open frames to display messages while Emacs loads the user's initialization file.") +(defvar after-init-hook nil + "Functions to call after loading the init file (`~/.emacs'). +The call is not protected by a condition-case, so you can set `debug-on-error' +in `.emacs', and put all the actual code on `after-init-hook'.") + (defvar term-setup-hook nil - "Function to be called after loading terminal-specific lisp code. -It is called with no arguments. This variable exists for users to set, + "Functions to be called after loading terminal-specific lisp code. +See `run-hooks'. This variable exists for users to set, so as to override the definitions made by the terminal-specific file. Emacs never sets this variable itself.") @@ -114,17 +126,22 @@ directory name of the directory where the `.emacs' file was looked for.") (if command-line-processed (message "Back to top level.") (setq command-line-processed t) - ;; In presence of symlinks, switch to cleaner form of default directory. - (if (and (not (eq system-type 'vax-vms)) - (getenv "PWD")) - (setq default-directory (file-name-as-directory (getenv "PWD")))) - (let ((tail directory-abbrev-alist)) - (while tail - (if (string-match (car (car tail)) default-directory) - (setq default-directory - (concat (cdr (car tail)) - (substring default-directory (match-end 0))))) - (setq tail (cdr tail)))) + (if (not (eq system-type 'vax-vms)) + (progn + ;; If the PWD environment variable isn't accurate, delete it. + (let ((pwd (getenv "PWD"))) + (and (stringp pwd) + ;; Use FOO/., so that if FOO is a symlink, file-attributes + ;; describes the directory linked to, not FOO itself. + (or (equal (file-attributes + (concat (file-name-as-directory pwd) ".")) + (file-attributes + (concat (file-name-as-directory default-directory) + "."))) + (setq process-environment + (delete (concat "PWD=" pwd) + process-environment))))))) + (setq default-directory (abbreviate-file-name default-directory)) (unwind-protect (command-line) (run-hooks 'emacs-startup-hook) @@ -134,7 +151,7 @@ directory name of the directory where the `.emacs' file was looked for.") (run-hooks 'window-setup-hook))))) (defun command-line () - ;; See if we should import version-control from the envionment variable. + ;; See if we should import version-control from the environment variable. (let ((vc (getenv "VERSION_CONTROL"))) (cond ((eq vc nil)) ;don't do anything if not set ((or (string= vc "t") @@ -147,21 +164,20 @@ directory name of the directory where the `.emacs' file was looked for.") (string= vc "simple")) (setq version-control 'never)))) + ;;! 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. + ;;! ;; Choose a good default value for split-window-keep-point. + ;;! (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)) - (condition-case data - (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) - (error - (let ((standard-output 'external-debugging-output)) - (princ "Error initializing window system: ") - (prin1 data) - (terpri) - (kill-emacs))))) + (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)) (let ((done nil) (args (cdr command-line-args))) @@ -196,8 +212,12 @@ directory name of the directory where the `.emacs' file was looked for.") ;; Re-attach the program name to the front of the arg list. (setcdr command-line-args args)) - ;; If the window system asked to, let it set up some initial screens. - (if pre-init-hook (funcall pre-init-hook)) + (run-hooks 'before-init-hook) + + ;; Run the site-start library if it exists. The point of this file is + ;; that it is run before .emacs. There is no point in doing this after + ;; .emacs; that is useless. + (load "site-start" t t) ;; Load that user's init file, or the default one, or none. (let ((debug-on-error init-file-debug) @@ -227,6 +247,8 @@ directory name of the directory where the `.emacs' file was looked for.") (if (cdr error) ": ") (mapconcat 'prin1-to-string (cdr error) ", ")))))) + (run-hooks 'after-init-hook) + ;; If *scratch* exists and init file didn't change its mode, initialize it. (if (get-buffer "*scratch*") (save-excursion @@ -272,7 +294,7 @@ directory name of the directory where the `.emacs' file was looked for.") (progn (insert (emacs-version) " -Copyright (C) 1991 Free Software Foundation, Inc.\n\n") +Copyright (C) 1993 Free Software Foundation, Inc.\n\n") ;; If keys have their default meanings, ;; use precomputed string to save lots of time. (if (and (eq (key-binding "\C-h") 'help-command) @@ -286,6 +308,7 @@ Copyright (C) 1991 Free Software Foundation, Inc.\n\n") "Type C-h for help; C-x u to undo changes. (`C-' means use CTRL key.) To kill the Emacs job, type C-x C-c. Type C-h t for a tutorial on using Emacs. +Type C-h i to enter Info, which you can use to read GNU documentation. GNU Emacs comes with ABSOLUTELY NO WARRANTY; type C-h C-w for full details. You may give out copies of Emacs; type C-h C-c to see the conditions. @@ -294,6 +317,7 @@ Type C-h C-d for information on getting the latest version.") "Type \\[help-command] for help; \\[advertised-undo] to undo changes. (`C-' means use CTRL key.) To kill the Emacs job, type \\[save-buffers-kill-emacs]. Type \\[help-with-tutorial] for a tutorial on using Emacs. +Type \\[info] to enter Info, which you can use to read GNU documentation. GNU Emacs comes with ABSOLUTELY NO WARRANTY; type \\[describe-no-warranty] for full details. You may give out copies of Emacs; type \\[describe-copying] to see the conditions. @@ -333,6 +357,8 @@ Type \\[describe-distribution] for information on getting the latest version.")) (setq command-line-args-left (cdr command-line-args-left))) ((or (string-equal argi "-i") (string-equal argi "-insert")) + (or (stringp (car command-line-args-left)) + (error "filename omitted from `-i' option")) (insert-file-contents (car command-line-args-left)) (setq command-line-args-left (cdr command-line-args-left))) ((string-equal argi "-kill") @@ -365,3 +391,5 @@ Type \\[describe-distribution] for information on getting the latest version.")) (or (get-buffer-window first-file-buffer) (progn (other-window) (buffer-menu))))))) + +;;; startup.el ends here