X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/db441dba114f71353017ca8865f80913c827f602..0bfd44c1806f9e589f79e9bc8f4b2a5aab7e4df3:/lisp/startup.el diff --git a/lisp/startup.el b/lisp/startup.el index 9e3f2bb4aa..b81d8b811e 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -1,7 +1,7 @@ ;;; startup.el --- process Emacs shell arguments ;; Copyright (C) 1985, 1986, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -;; 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +;; 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: internal @@ -40,14 +40,16 @@ "Emacs start-up procedure." :group 'internal) -(defcustom inhibit-startup-message nil - "*Non-nil inhibits the initial startup message. +(defcustom inhibit-splash-screen nil + "Non-nil inhibits the startup screen. +It also inhibits display of the initial message in the *scratch* buffer. + This is for use in your personal init file, once you are familiar -with the contents of the startup message." +with the contents of the startup screen." :type 'boolean :group 'initialization) -(defvaralias 'inhibit-splash-screen 'inhibit-startup-message) +(defvaralias 'inhibit-startup-message 'inhibit-splash-screen) (defcustom inhibit-startup-echo-area-message nil "*Non-nil inhibits the initial startup echo area message. @@ -197,23 +199,22 @@ the user's init file.") :type 'function :group 'initialization) -(defcustom init-file-user nil +(defvar init-file-user nil "Identity of user whose `.emacs' file is or was read. The value is nil if `-q' or `--no-init-file' was specified, meaning do not load any init file. -Otherwise, the value may be the null string, meaning use the init file -for the user that originally logged in, or it may be a -string containing a user's name meaning use that person's init file. +Otherwise, the value may be an empty string, meaning +use the init file for the user who originally logged in, +or it may be a string containing a user's name meaning +use that person's init file. In either of the latter cases, `(concat \"~\" init-file-user \"/\")' evaluates to the name of the directory where the `.emacs' file was looked for. Setting `init-file-user' does not prevent Emacs from loading -`site-start.el'. The only way to do that is to use `--no-site-file'." - :type '(choice (const :tag "none" nil) string) - :group 'initialization) +`site-start.el'. The only way to do that is to use `--no-site-file'.") (defcustom site-run-file "site-start" "File containing site-wide run-time initializations. @@ -642,15 +643,22 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'." (set-locale-environment nil) ;; Convert preloaded file names to absolute. - (setq load-history - (mapcar (lambda (elt) - (if (and (stringp (car elt)) - (not (file-name-absolute-p (car elt)))) - (cons (locate-file (car elt) load-path - load-suffixes) - (cdr elt)) - elt)) - load-history)) + (let ((lisp-dir + (file-name-directory + (locate-file "simple" load-path + (get-load-suffixes))))) + + (setq load-history + (mapcar (lambda (elt) + (if (and (stringp (car elt)) + (not (file-name-absolute-p (car elt)))) + (cons (concat lisp-dir + (car elt) + (if (string-match "[.]el$" (car elt)) + "" ".elc")) + (cdr elt)) + elt)) + load-history))) ;; Convert the arguments to Emacs internal representation. (let ((args (cdr command-line-args))) @@ -769,6 +777,7 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'." (custom-reevaluate-setting 'mouse-wheel-down-event) (custom-reevaluate-setting 'mouse-wheel-up-event) (custom-reevaluate-setting 'file-name-shadow-mode) + (custom-reevaluate-setting 'send-mail-function) ;; Register default TTY colors for the case the terminal hasn't a ;; terminal init file. @@ -811,7 +820,16 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'." (format "Invalid user name %s" init-file-user) :error) - (if (file-directory-p (expand-file-name (concat "~" init-file-user))) + (if (file-directory-p (expand-file-name + ;; We don't support ~USER on MS-Windows except + ;; for the current user, and always load .emacs + ;; from the current user's home directory (see + ;; below). So always check "~", even if invoked + ;; with "-u USER", or if $USER or $LOGNAME are + ;; set to something different. + (if (eq system-type 'windows-nt) + "~" + (concat "~" init-file-user)))) nil (display-warning 'initialization (format "User %s has no home directory" @@ -923,6 +941,10 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'." (pop-to-buffer "*Messages*")) (setq init-file-had-error t))))) + (if (and deactivate-mark transient-mark-mode) + (with-current-buffer (window-buffer) + (deactivate-mark))) + ;; If the user has a file of abbrevs, read it. (if (file-exists-p abbrev-file-name) (quietly-read-abbrev-file abbrev-file-name)) @@ -1076,7 +1098,9 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'." ") "Initial message displayed in *scratch* buffer at startup. -If this is nil, no message will be displayed." +If this is nil, no message will be displayed. +If `inhibit-splash-screen' is non-nil, then no message is displayed, +regardless of the value of this variable." :type '(choice (text :tag "Message") (const :tag "none" nil)) :group 'initialization) @@ -1254,7 +1278,7 @@ where FACE is a valid face specification, as it can be used with (emacs-version) "\n" :face '(variable-pitch :height 0.5) - "Copyright (C) 2005 Free Software Foundation, Inc.") + "Copyright (C) 2006 Free Software Foundation, Inc.") (and auto-save-list-file-prefix ;; Don't signal an error if the ;; directory for auto-save-list files @@ -1283,7 +1307,9 @@ where FACE is a valid face specification, as it can be used with (set-buffer buffer) (erase-buffer) (if pure-space-overflow - (insert "Warning Warning Pure space overflow Warning Warning\n")) + (insert "\ +Warning Warning!!! Pure space overflow !!!Warning Warning +\(See the node Building Emacs in the Lisp manual for details.)\n")) (fancy-splash-head) (apply #'fancy-splash-insert text) (fancy-splash-tail) @@ -1301,7 +1327,7 @@ This is an internal function used to turn off the splash screen after the user caused an input event by hitting a key or clicking with the mouse." (interactive) - (if (and (consp last-command-event) + (if (and (memq 'down (event-modifiers last-command-event)) (eq (posn-window (event-start last-command-event)) (selected-window))) ;; This is a mouse-down event in the spash screen window. @@ -1318,6 +1344,7 @@ mouse." (fancy-splash-outer-buffer (current-buffer)) splash-buffer (old-minor-mode-map-alist minor-mode-map-alist) + (old-emulation-mode-map-alists emulation-mode-map-alists) (frame (fancy-splash-frame)) timer) (save-selected-window @@ -1336,6 +1363,7 @@ mouse." (setq cursor-type nil display-hourglass nil minor-mode-map-alist nil + emulation-mode-map-alists nil buffer-undo-list t mode-line-format (propertize "---- %b %-" 'face '(:weight bold)) @@ -1347,7 +1375,8 @@ mouse." (recursive-edit)) (cancel-timer timer) (setq display-hourglass old-hourglass - minor-mode-map-alist old-minor-mode-map-alist) + minor-mode-map-alist old-minor-mode-map-alist + emulation-mode-map-alists old-emulation-mode-map-alists) (kill-buffer splash-buffer)))))) (defun fancy-splash-frame () @@ -1384,31 +1413,33 @@ we put it on this frame." (let ((prev-buffer (current-buffer))) (unwind-protect (with-current-buffer (get-buffer-create "GNU Emacs") - (let ((tab-width 8) - (mode-line-format (propertize "---- %b %-" - 'face '(:weight bold)))) - - (if pure-space-overflow - (insert "Warning Warning Pure space overflow Warning Warning\n")) - - ;; The convention for this piece of code is that - ;; each piece of output starts with one or two newlines - ;; and does not end with any newlines. - (insert "Welcome to GNU Emacs") - (insert - (if (eq system-type 'gnu/linux) - ", one component of the GNU/Linux operating system.\n" - ", a part of the GNU operating system.\n")) - - (unless (equal (buffer-name prev-buffer) "*scratch*") - (insert (substitute-command-keys - "\nType \\[recenter] to begin editing your file.\n"))) - - (if (display-mouse-p) - ;; The user can use the mouse to activate menus - ;; so give help in terms of menu items. - (progn - (insert "\ + (set (make-local-variable 'tab-width) 8) + (set (make-local-variable 'mode-line-format) + (propertize "---- %b %-" 'face '(:weight bold))) + + (if pure-space-overflow + (insert "\ +Warning Warning!!! Pure space overflow !!!Warning Warning +\(See the node Building Emacs in the Lisp manual for details.)\n")) + + ;; The convention for this piece of code is that + ;; each piece of output starts with one or two newlines + ;; and does not end with any newlines. + (insert "Welcome to GNU Emacs") + (insert + (if (eq system-type 'gnu/linux) + ", one component of the GNU/Linux operating system.\n" + ", a part of the GNU operating system.\n")) + + (unless (equal (buffer-name prev-buffer) "*scratch*") + (insert (substitute-command-keys + "\nType \\[recenter] to begin editing your file.\n"))) + + (if (display-mouse-p) + ;; The user can use the mouse to activate menus + ;; so give help in terms of menu items. + (progn + (insert "\ You can do basic editing with the menu bar and scroll bar using the mouse. Useful File menu items: @@ -1424,101 +1455,107 @@ Copying Conditions Conditions for redistributing and changing Emacs Getting New Versions How to obtain the latest version of Emacs More Manuals / Ordering Manuals How to order printed manuals from the FSF ") - (insert "\n\n" (emacs-version) - " -Copyright (C) 2005 Free Software Foundation, Inc.")) - - ;; No mouse menus, so give help using kbd commands. - - ;; If keys have their default meanings, - ;; use precomputed string to save lots of time. - (if (and (eq (key-binding "\C-h") 'help-command) - (eq (key-binding "\C-xu") 'advertised-undo) - (eq (key-binding "\C-x\C-c") 'save-buffers-kill-emacs) - (eq (key-binding "\C-ht") 'help-with-tutorial) - (eq (key-binding "\C-hi") 'info) - (eq (key-binding "\C-hr") 'info-emacs-manual) - (eq (key-binding "\C-h\C-n") 'view-emacs-news)) - (insert " + (insert "\n\n" (emacs-version) + " +Copyright (C) 2006 Free Software Foundation, Inc.")) + + ;; No mouse menus, so give help using kbd commands. + + ;; If keys have their default meanings, + ;; use precomputed string to save lots of time. + (if (and (eq (key-binding "\C-h") 'help-command) + (eq (key-binding "\C-xu") 'advertised-undo) + (eq (key-binding "\C-x\C-c") 'save-buffers-kill-emacs) + (eq (key-binding "\C-ht") 'help-with-tutorial) + (eq (key-binding "\C-hi") 'info) + (eq (key-binding "\C-hr") 'info-emacs-manual) + (eq (key-binding "\C-h\C-n") 'view-emacs-news)) + (insert " Get help C-h (Hold down CTRL and press h) Emacs manual C-h r Emacs tutorial C-h t Undo changes C-x u Buy manuals C-h C-m Exit Emacs C-x C-c Browse manuals C-h i") - (insert (substitute-command-keys - (format "\n + (insert (substitute-command-keys + (format "\n Get help %s Emacs manual \\[info-emacs-manual] Emacs tutorial \\[help-with-tutorial]\tUndo changes\t\\[advertised-undo] Buy manuals \\[view-order-manuals]\tExit Emacs\t\\[save-buffers-kill-emacs] Browse manuals \\[info]" - (let ((where (where-is-internal - 'help-command nil t))) - (if where - (key-description where) - "M-x help")))))) - - ;; Say how to use the menu bar with the keyboard. - (if (and (eq (key-binding "\M-`") 'tmm-menubar) - (eq (key-binding [f10]) 'tmm-menubar)) - (insert " + (let ((where (where-is-internal + 'help-command nil t))) + (if where + (key-description where) + "M-x help")))))) + + ;; Say how to use the menu bar with the keyboard. + (if (and (eq (key-binding "\M-`") 'tmm-menubar) + (eq (key-binding [f10]) 'tmm-menubar)) + (insert " Activate menubar F10 or ESC ` or M-`") - (insert (substitute-command-keys " + (insert (substitute-command-keys " Activate menubar \\[tmm-menubar]"))) - ;; Many users seem to have problems with these. - (insert " + ;; Many users seem to have problems with these. + (insert " \(`C-' means use the CTRL key. `M-' means use the Meta (or Alt) key. If you have no Meta key, you may instead type ESC followed by the character.)") - (insert "\n\n" (emacs-version) - " -Copyright (C) 2005 Free Software Foundation, Inc.") + (insert "\n\n" (emacs-version) + " +Copyright (C) 2006 Free Software Foundation, Inc.") - (if (and (eq (key-binding "\C-h\C-c") 'describe-copying) - (eq (key-binding "\C-h\C-d") 'describe-distribution) - (eq (key-binding "\C-h\C-w") 'describe-no-warranty)) - (insert - "\n + (if (and (eq (key-binding "\C-h\C-c") 'describe-copying) + (eq (key-binding "\C-h\C-d") 'describe-distribution) + (eq (key-binding "\C-h\C-w") 'describe-no-warranty)) + (insert + "\n GNU Emacs comes with ABSOLUTELY NO WARRANTY; type C-h C-w for full details. Emacs is Free Software--Free as in Freedom--so you can redistribute copies of Emacs and modify it; type C-h C-c to see the conditions. Type C-h C-d for information on getting the latest version.") - (insert (substitute-command-keys - "\n + (insert (substitute-command-keys + "\n GNU Emacs comes with ABSOLUTELY NO WARRANTY; type \\[describe-no-warranty] for full details. Emacs is Free Software--Free as in Freedom--so you can redistribute copies of Emacs and modify it; type \\[describe-copying] to see the conditions. Type \\[describe-distribution] for information on getting the latest version.")))) - ;; The rest of the startup screen is the same on all - ;; kinds of terminals. - - ;; Give information on recovering, if there was a crash. - (and auto-save-list-file-prefix - ;; Don't signal an error if the - ;; directory for auto-save-list files - ;; does not yet exist. - (file-directory-p (file-name-directory - auto-save-list-file-prefix)) - (directory-files - (file-name-directory auto-save-list-file-prefix) - nil - (concat "\\`" - (regexp-quote (file-name-nondirectory - auto-save-list-file-prefix))) - t) - (insert "\n\nIf an Emacs session crashed recently, " - "type M-x recover-session RET\nto recover" - " the files you were editing.")) - - ;; Display the input that we set up in the buffer. - (set-buffer-modified-p nil) - (goto-char (point-min)) - (save-window-excursion - (switch-to-buffer (current-buffer)) - (sit-for 120)))) + ;; The rest of the startup screen is the same on all + ;; kinds of terminals. + + ;; Give information on recovering, if there was a crash. + (and auto-save-list-file-prefix + ;; Don't signal an error if the + ;; directory for auto-save-list files + ;; does not yet exist. + (file-directory-p (file-name-directory + auto-save-list-file-prefix)) + (directory-files + (file-name-directory auto-save-list-file-prefix) + nil + (concat "\\`" + (regexp-quote (file-name-nondirectory + auto-save-list-file-prefix))) + t) + (insert "\n\nIf an Emacs session crashed recently, " + "type M-x recover-session RET\nto recover" + " the files you were editing.")) + + ;; Display the input that we set up in the buffer. + (set-buffer-modified-p nil) + (goto-char (point-min)) + (if (or (window-minibuffer-p) + (window-dedicated-p (selected-window))) + ;; There's no point is using pop-to-buffer since creating + ;; a new frame will generate enough events that the + ;; subsequent `sit-for' will immediately return anyway. + nil ;; (pop-to-buffer (current-buffer)) + (save-window-excursion + (switch-to-buffer (current-buffer)) + (sit-for 120)))) ;; Unwind ... ensure splash buffer is killed (kill-buffer "GNU Emacs")))) @@ -1592,6 +1629,15 @@ normal otherwise." (when init-file-had-error (sit-for 2)) + (when (and pure-space-overflow + (not noninteractive)) + (display-warning + 'initialization + "Building Emacs overflowed pure space. See \"(elisp)Building Emacs\" for more information." + ;; FIXME: Tell the user what kind of problems are possible and how to fix + ;; the overflow. + :warning)) + (when command-line-args-left ;; We have command args; process them. (let ((dir command-line-default-directory) @@ -1617,7 +1663,7 @@ normal otherwise." (longopts (append '(("--funcall") ("--load") ("--insert") ("--kill") ("--directory") ("--eval") ("--execute") ("--no-splash") - ("--find-file") ("--visit") ("--file")) + ("--find-file") ("--visit") ("--file") ("--no-desktop")) (mapcar (lambda (elt) (list (concat "-" (car elt)))) command-switch-alist))) @@ -1717,6 +1763,13 @@ normal otherwise." ((equal argi "-kill") (kill-emacs t)) + ;; This is for when they use --no-desktop with -q, or + ;; don't load Desktop in their .emacs. If desktop.el + ;; _is_ loaded, it will handle this switch, and we + ;; won't see it by the time we get here. + ((equal argi "-no-desktop") + (message "\"--no-desktop\" ignored because the Desktop package is not loaded")) + ((string-match "^\\+[0-9]+\\'" argi) (setq line (string-to-number argi)))