]> code.delx.au - gnu-emacs/blobdiff - lisp/startup.el
(normal-top-level): Reset standard-value of `user-full-name' here.
[gnu-emacs] / lisp / startup.el
index f4cc9c818757364456d71c418e57f4e77d1edc65..99de8ff30d17ac593e59c543b6a1d02b39d0fdd4 100644 (file)
@@ -70,6 +70,9 @@
 ;; -no-site-file             Do not load "site-start.el".  (This is the ONLY
 ;; --no-site-file            way to prevent loading that file.)
 ;; -------------------------
+;; -no-splash                 Don't display a splash screen on startup.
+;; --no-splash
+;; -------------------------
 ;; -u USER                   Load USER's init file instead of the init
 ;; -user USER                file belonging to the user starting Emacs.
 ;; --user USER
@@ -136,6 +139,8 @@ with the contents of the startup message."
   :type 'boolean
   :group 'initialization)
 
+(defvaralias 'inhibit-splash-screen 'inhibit-startup-message)
+
 (defcustom inhibit-startup-echo-area-message nil
   "*Non-nil inhibits the initial startup echo area message.
 Setting this variable takes effect
@@ -321,7 +326,12 @@ is less convenient."
   :type '(choice (const nil) string)
   :group 'mail)
 
-(defcustom user-mail-address nil
+(defcustom user-mail-address (if command-line-processed
+                                (concat (user-login-name) "@"
+                                        (or mail-host-address
+                                            (system-name)))
+                              ;; Empty string means "not set yet".
+                              "")
   "*Full mailing address of this user.
 This is initialized based on `mail-host-address',
 after your init file is read, in case it sets `mail-host-address'."
@@ -419,6 +429,9 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
       (save-excursion
        (set-buffer (get-buffer "*Messages*"))
        (setq default-directory dir)))
+    ;; `user-full-name' is now known; reset its standard-value here.
+    (put 'user-full-name 'standard-value
+        (list (default-value 'user-full-name)))
     ;; For root, preserve owner and group when editing files.
     (if (equal (user-uid) 0)
        (setq backup-by-copying-when-mismatch t))
@@ -753,20 +766,20 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
            (argi (pop args))
            (argval nil))
        ;; Handle --OPTION=VALUE format.
-       (if (and (string-match "\\`--" argi)
-                (string-match "=" argi))
-           (setq argval (substring argi (match-end 0))
-                 argi (substring argi 0 (match-beginning 0))))
-       (or (equal argi "--")
-           (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)))
-                 (setq argval nil)))))
+       (when (and (string-match "\\`--" argi)
+                  (string-match "=" argi))
+         (setq argval (substring argi (match-end 0))
+               argi (substring argi 0 (match-beginning 0))))
+       (unless (equal argi "--")
+         (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)))
+               (setq argval nil)))))
        (cond
         ((member argi '("-q" "-no-init-file"))
          (setq init-file-user nil))
@@ -927,6 +940,12 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
                              (sit-for 1))
                            (setq user-init-file source))))
                      
+                     (when (and (stringp custom-file)
+                                (not (assoc custom-file load-history)))
+                       ;; If the .emacs file has set `custom-file' but hasn't
+                       ;; loaded the file yet, let's load it.
+                       (load custom-file t t))
+                     
                      (or inhibit-default-init
                          (let ((inhibit-startup-message nil))
                            ;; Users are supposed to be told their rights.
@@ -996,7 +1015,7 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
        (set-language-environment current-language-environment)))
     
     ;; Do this here in case the init file sets mail-host-address.
-    (or user-mail-address
+    (if (equal user-mail-address "")
        (setq user-mail-address (concat (user-login-name) "@"
                                        (or mail-host-address
                                            (system-name)))))
@@ -1013,8 +1032,7 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
 
   ;; If *scratch* exists and init file didn't change its mode, initialize it.
   (if (get-buffer "*scratch*")
-      (save-excursion
-       (set-buffer "*scratch*")
+      (with-current-buffer "*scratch*"
        (if (eq major-mode 'fundamental-mode)
            (funcall initial-major-mode))))
   
@@ -1030,6 +1048,12 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
               (setq term (substring term 0 hyphend))
             (setq term nil)))))
 
+  ;; Update the out-of-memory error message based on user's key bindings
+  ;; for save-some-buffers.
+  (setq memory-signal-data
+       (list 'error
+             (substitute-command-keys "Memory exhausted--use \\[save-some-buffers] then exit and restart Emacs")))
+
   ;; Process the remaining args.
   (command-line-1 (cdr command-line-args))
 
@@ -1067,13 +1091,14 @@ using the mouse.\n\n"
           :face variable-pitch "\
 Emacs Tutorial\tLearn-by-doing tutorial for using Emacs efficiently
 Emacs FAQ\tFrequently asked questions and answers
+Read the Emacs Manual\tView the Emacs manual using Info
 \(Non)Warranty\tGNU Emacs comes with "
           :face (variable-pitch :slant oblique)
           "ABSOLUTELY NO WARRANTY\n"
           :face variable-pitch
           "\
 Copying Conditions\tConditions for redistributing and changing Emacs
-Ordering Manuals\tHow to order Emacs manuals from the Free Software Foundation\n")
+More Manuals / Ordering Manuals       Buying printed manuals from the FSF\n")
   (:face variable-pitch
           "You can do basic editing with the menu bar and scroll bar \
 using the mouse.\n\n"
@@ -1085,6 +1110,7 @@ Recover Session\tRecover files you were editing before a crash
 
 
 
+
 "
           ))
   "A list of texts to show in the middle part of splash screens.
@@ -1179,12 +1205,10 @@ where FACE is a valid face specification, as it can be used with
          (insert-image img (propertize "xxx" 'help-echo help-echo
                                        'keymap map)))
        (insert "\n"))))
-  (if (eq system-type 'gnu/linux)
-      (fancy-splash-insert
-       :face '(variable-pitch :foreground "red")
-       "GNU Emacs is one component of a Linux-based GNU system.")
-    (fancy-splash-insert
-     :face '(variable-pitch :foreground "red")
+  (fancy-splash-insert
+   :face '(variable-pitch :foreground "red")
+   (if (eq system-type 'gnu/linux)
+       "GNU Emacs is one component of the GNU/Linux operating system."
      "GNU Emacs is one component of the GNU operating system."))
   (insert "\n")
   (unless (equal (buffer-name fancy-splash-outer-buffer) "*scratch*")
@@ -1255,73 +1279,93 @@ where FACE is a valid face specification, as it can be used with
        (fancy-splash-outer-buffer (current-buffer))
        splash-buffer
        (old-minor-mode-map-alist minor-mode-map-alist)
+       (frame (fancy-splash-frame))
        timer)
-    (switch-to-buffer "GNU Emacs")
-    (setq tab-width 20)
-    (setq splash-buffer (current-buffer))
-    (catch 'stop-splashing
-      (unwind-protect
-         (let ((map (make-sparse-keymap)))
-           (use-local-map map)
-           (define-key map [t] 'fancy-splash-default-action)
-           (define-key map [mouse-movement] 'ignore)
-           (define-key map [mode-line t] 'ignore)
-           (setq cursor-type nil
-                 display-hourglass nil
-                 minor-mode-map-alist nil
-                 buffer-undo-list t
-                 mode-line-format (propertize "---- %b %-" 
-                                              'face '(:weight bold))
-                 fancy-splash-stop-time (+ (float-time)
-                                           (max 60 fancy-splash-max-time))
-                 timer (run-with-timer 0 fancy-splash-delay
-                                       #'fancy-splash-screens-1
-                                       splash-buffer))
-           (recursive-edit))
+    (save-selected-window
+      (select-frame frame)
+      (switch-to-buffer "GNU Emacs")
+      (setq tab-width 20)
+      (setq splash-buffer (current-buffer))
+      (catch 'stop-splashing
+       (unwind-protect
+           (let ((map (make-sparse-keymap)))
+             (use-local-map map)
+             (define-key map [switch-frame] 'ignore)
+             (define-key map [t] 'fancy-splash-default-action)
+             (define-key map [mouse-movement] 'ignore)
+             (define-key map [mode-line t] 'ignore)
+             (setq cursor-type nil
+                   display-hourglass nil
+                   minor-mode-map-alist nil
+                   buffer-undo-list t
+                   mode-line-format (propertize "---- %b %-" 
+                                                'face '(:weight bold))
+                   fancy-splash-stop-time (+ (float-time)
+                                             (max 60 fancy-splash-max-time))
+                   timer (run-with-timer 0 fancy-splash-delay
+                                         #'fancy-splash-screens-1
+                                         splash-buffer))
+             (recursive-edit))
          (cancel-timer timer)
          (setq display-hourglass old-hourglass
                minor-mode-map-alist old-minor-mode-map-alist)
-         (kill-buffer splash-buffer)))))
-
+         (kill-buffer splash-buffer))))))
+
+(defun fancy-splash-frame ()
+  "Return the frame to use for the fancy splash screen.
+Returning non-nil does not mean we should necessarily
+use the fancy splash screen, but if we do use it,
+we put it on this frame."
+  (let (chosen-frame)
+    (dolist (frame (append (frame-list) (list (selected-frame))))
+      (if (and (frame-visible-p frame)
+              (not (window-minibuffer-p (frame-selected-window frame))))
+         (setq chosen-frame frame)))
+    chosen-frame))
 
 (defun use-fancy-splash-screens-p ()
   "Return t if fancy splash screens should be used."
   (when (or (and (display-color-p)
                 (image-type-available-p 'xpm))
            (image-type-available-p 'pbm))
-    (let* ((img (create-image (or fancy-splash-image
-                                 (if (and (display-color-p)
-                                          (image-type-available-p 'xpm))
-                                     "splash.xpm" "splash.pbm"))))
-          (image-height (and img (cdr (image-size img))))
-          (window-height (1- (window-height (selected-window)))))
-      (> window-height (+ image-height 19)))))
+    (let ((frame (fancy-splash-frame)))
+      (when frame
+       (let* ((img (create-image (or fancy-splash-image
+                                     (if (and (display-color-p)
+                                              (image-type-available-p 'xpm))
+                                         "splash.xpm" "splash.pbm"))))
+              (image-height (and img (cdr (image-size img))))
+              (window-height (1- (window-height (frame-selected-window frame)))))
+         (> window-height (+ image-height 19)))))))
 
 
 (defun normal-splash-screen ()
   "Display splash screen when Emacs starts."
-  (with-current-buffer (get-buffer-create "GNU Emacs")
-    (let ((tab-width 8)
-         (mode-line-format (propertize "---- %b %-" 
-                                       'face '(:weight bold))))
-
-      ;; 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")
-      (if (eq system-type 'gnu/linux)
-         (insert ", one component of a Linux-based GNU system."))
-      (insert "\n")
-
-      (unless (equal (buffer-name (current-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 "\
+  (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))))
+
+           ;; 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:
@@ -1331,105 +1375,110 @@ Recover Session               recover files you were editing before a crash
 Important Help menu items:
 Emacs Tutorial         Learn-by-doing tutorial for using Emacs efficiently.
 Emacs FAQ              Frequently asked questions and answers
+Read the Emacs Manual  View the Emacs manual using Info
 \(Non)Warranty         GNU Emacs comes with ABSOLUTELY NO WARRANTY
 Copying Conditions     Conditions for redistributing and changing Emacs.
 Getting New Versions   How to obtain the latest version of Emacs.
-Ordering Manuals       How to order manuals from the FSF.
+More Manuals / Ordering Manuals    How to order printed manuals from the FSF.
 ")
-           (insert "\n\n" (emacs-version)
-                           "
+                 (insert "\n\n" (emacs-version)
+                         "
 Copyright (C) 2002 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-h\C-n") 'view-emacs-news))
-           (insert "
+             ;; 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)
-Undo changes      C-x u       Exit Emacs               C-x C-c
-Get a tutorial    C-h t       Use Info to read docs    C-h i
-Ordering manuals   C-h RET")
-         (insert (substitute-command-keys
-                  (format "\n
+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
 Get help          %s
-Undo changes      \\[advertised-undo]
-Exit Emacs        \\[save-buffers-kill-emacs]
-Get a tutorial    \\[help-with-tutorial]
-Use Info to read docs  \\[info]
-Ordering manuals   \\[view-order-manuals]"
-                          (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 "
+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 "
 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)
-                       "
+             (insert "\n\n" (emacs-version)
+                     "
 Copyright (C) 2002 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))))
-  (kill-buffer "GNU Emacs"))
+           ;; 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))))
+      ;; Unwind ... ensure splash buffer is killed
+      (kill-buffer "GNU Emacs"))))
+
 
 (defun startup-echo-area-message ()
   (if (eq (key-binding "\C-h\C-p") 'describe-project)
@@ -1503,7 +1552,7 @@ normal otherwise."
            ;; and long versions of what's on command-switch-alist.
            (longopts
             (append '(("--funcall") ("--load") ("--insert") ("--kill")
-                      ("--directory") ("--eval") ("--execute")
+                      ("--directory") ("--eval") ("--execute") ("--no-splash")
                       ("--find-file") ("--visit") ("--file"))
                     (mapcar (lambda (elt)
                               (list (concat "-" (car elt))))
@@ -1556,6 +1605,9 @@ normal otherwise."
                         (funcall (cdr tem) argi))
                     (funcall (cdr tem) argi)))
 
+                 ((string-equal argi "-no-splash")
+                  (setq inhibit-startup-message t))
+
                  ((member argi '("-f"  ;what the manual claims
                                  "-funcall"
                                  "-e")) ; what the source used to say