]> code.delx.au - gnu-emacs/blobdiff - lisp/startup.el
(doc-view-scroll-up-or-next-page)
[gnu-emacs] / lisp / startup.el
index 6fdab938cf9e82461851d0eea5e7b799a127a72f..22a9fa02103e97b26b261dbd3d3cb8b2165edf6c 100644 (file)
@@ -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, 2006, 2007, 2008
+;;   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
 ;;   Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
@@ -47,7 +47,7 @@ directory using `find-file'.  If t, open the `*scratch*' buffer."
   :type '(choice
          (const     :tag "Startup screen" nil)
          (directory :tag "Directory" :value "~/")
-         (file      :tag "File" :value "~/file.txt")
+         (file      :tag "File" :value "~/.emacs")
          (const     :tag "Lisp scratch buffer" t))
   :version "23.1"
   :group 'initialization)
@@ -55,8 +55,8 @@ directory using `find-file'.  If t, open the `*scratch*' buffer."
 (defcustom inhibit-startup-screen nil
   "Non-nil inhibits the startup screen.
 
-This is for use in your personal init file (but NOT site-start.el), once
-you are familiar with the contents of the startup screen."
+This is for use in your personal init file (but NOT site-start.el),
+once you are familiar with the contents of the startup screen."
   :type 'boolean
   :group 'initialization)
 
@@ -66,7 +66,7 @@ you are familiar with the contents of the startup screen."
 (defvar startup-screen-inhibit-startup-screen nil)
 
 (defcustom inhibit-startup-echo-area-message nil
-  "*Non-nil inhibits the initial startup echo area message.
+  "Non-nil inhibits the initial startup echo area message.
 Setting this variable takes effect
 only if you do it with the customization buffer
 or if your `.emacs' file contains a line of this form:
@@ -80,12 +80,12 @@ the startup message unless he personally acts to inhibit it."
   :group 'initialization)
 
 (defcustom inhibit-default-init nil
-  "*Non-nil inhibits loading the `default' library."
+  "Non-nil inhibits loading the `default' library."
   :type 'boolean
   :group 'initialization)
 
 (defcustom inhibit-startup-buffer-menu nil
-  "*Non-nil inhibits display of buffer list when more than 2 files are loaded."
+  "Non-nil inhibits display of buffer list when more than 2 files are loaded."
   :type 'boolean
   :group 'initialization)
 
@@ -185,7 +185,7 @@ and VALUE is the value which is given to that frame parameter
 (defconst command-line-ns-option-alist
   '(("-NSAutoLaunch" 1 ns-ignore-1-arg)
     ("-NXAutoLaunch" 1 ns-ignore-1-arg)
-    ("-macosx" 0 ns-ignore-0-arg)
+    ("-macosx" 0 ignore)
     ("-NSHost" 1 ns-ignore-1-arg)
     ("-_NSMachLaunch" 1 ns-ignore-1-arg)
     ("-MachLaunch" 1 ns-ignore-1-arg)
@@ -220,8 +220,8 @@ and VALUE is the value which is given to that frame parameter
     ("-cr" 1 ns-handle-switch cursor-color)
     ("-vb" 0 ns-handle-switch vertical-scroll-bars t)
     ("-hb" 0 ns-handle-switch horizontal-scroll-bars t)
-    ("-bd" 1 ns-handle-switch) 
-    ;; ("--border-width" 1 ns-handle-numeric-switch border-width) 
+    ("-bd" 1 ns-handle-switch)
+    ;; ("--border-width" 1 ns-handle-numeric-switch border-width)
     ;; ("--display" 1 ns-handle-display)
     ("--name" 1 ns-handle-name-switch)
     ("--title" 1 ns-handle-switch title)
@@ -257,12 +257,6 @@ There is no `condition-case' around the running of these functions;
 therefore, if you set `debug-on-error' non-nil in `.emacs',
 an error in one of these functions will invoke the debugger.")
 
-(defvar before-init-time nil
-  "Value of `current-time' before Emacs begins initialization.")
-
-(defvar after-init-time nil
-  "Value of `current-time' after loading the init files.")
-
 (defvar emacs-startup-hook nil
   "Normal hook run after loading init files and handling the command line.")
 
@@ -335,7 +329,7 @@ this variable usefully is to set it while building and dumping Emacs."
          (error "Customizing `site-run-file' does not work")))
 
 (defcustom mail-host-address nil
-  "*Name of this machine, for purposes of naming users."
+  "Name of this machine, for purposes of naming users."
   :type '(choice (const nil) string)
   :group 'mail)
 
@@ -346,9 +340,9 @@ this variable usefully is to set it while building and dumping Emacs."
                                                 (system-name))))
                               ;; Empty string means "not set yet".
                               "")
-  "*Full mailing address of this user.
+  "Full mailing address of this user.
 This is initialized with environment variable `EMAIL' or, as a
-fallback, using `mail-host-address'. This is done after your
+fallback, using `mail-host-address'.  This is done after your
 init file is read, in case it sets `mail-host-address'."
   :type 'string
   :group 'mail)
@@ -491,20 +485,19 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
         ;; the end, because the subdirs.el files may add elements to the end
         ;; of load-path and we want to take it into account.
         (setq tail (cdr tail))))
-    (unless (eq system-type 'vax-vms)
-      ;; 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))))))
+    ;; 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))
     (let ((menubar-bindings-done nil))
       (unwind-protect
@@ -610,7 +603,7 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
     ("--color"           . "-color")))
 
 (defconst tool-bar-images-pixel-height 24
-  "Height in pixels of images in the tool bar.")
+  "Height in pixels of images in the tool-bar.")
 
 (defvar tool-bar-originally-present nil
   "Non-nil if tool-bars are present before user and site init files are read.")
@@ -698,9 +691,14 @@ opening the first frame (e.g. open a connection to an X server).")
 (declare-function x-get-resource "frame.c"
                  (attribute class &optional component subclass))
 (declare-function tool-bar-mode "tool-bar" (&optional arg))
+(declare-function tool-bar-setup "tool-bar")
+
+(defvar server-name)
+(defvar server-process)
 
 (defun command-line ()
   (setq before-init-time (current-time)
+       after-init-time nil
         command-line-default-directory default-directory)
 
   ;; Choose a reasonable location for temporary files.
@@ -738,21 +736,25 @@ opening the first frame (e.g. open a connection to an X server).")
     (setq eol-mnemonic-dos  "(DOS)"
           eol-mnemonic-mac  "(Mac)")))
 
-  ;; Make sure window system's init file was loaded in loadup.el if using a window system.
+  ;; Make sure window system's init file was loaded in loadup.el if
+  ;; using a window system.
   (condition-case error
     (unless noninteractive
       (if (and initial-window-system
               (not (featurep
-                    (intern (concat (symbol-name initial-window-system) "-win")))))
+                    (intern
+                     (concat (symbol-name initial-window-system) "-win")))))
          (error "Unsupported window system `%s'" initial-window-system))
       ;; Process window-system specific command line parameters.
       (setq command-line-args
-           (funcall (or (cdr (assq initial-window-system handle-args-function-alist))
-                        (error "Unsupported window system `%s'" initial-window-system))
-                    command-line-args))
+           (funcall
+            (or (cdr (assq initial-window-system handle-args-function-alist))
+                (error "Unsupported window system `%s'" initial-window-system))
+            command-line-args))
       ;; Initialize the window system. (Open connection, etc.)
-      (funcall (or (cdr (assq initial-window-system window-system-initialization-alist))
-                  (error "Unsupported window system `%s'" initial-window-system))))
+      (funcall
+       (or (cdr (assq initial-window-system window-system-initialization-alist))
+          (error "Unsupported window system `%s'" initial-window-system))))
     ;; If there was an error, print the error message and exit.
     (error
      (princ
@@ -879,14 +881,14 @@ opening the first frame (e.g. open a connection to an X server).")
   (run-hooks 'before-init-hook)
 
   ;; Under X Window, this creates the X frame and deletes the terminal frame.
-  (when (fboundp 'frame-initialize)
+  (unless (daemonp)
     (frame-initialize))
 
   ;; Turn off blinking cursor if so specified in X resources.  This is here
   ;; only because all other settings of no-blinking-cursor are here.
   (unless (or noninteractive
              emacs-basic-display
-             (and (memq window-system '(x w32 mac ns))
+             (and (memq window-system '(x w32 ns))
                   (not (member (x-get-resource "cursorBlink" "CursorBlink")
                                '("off" "false")))))
     (setq no-blinking-cursor t))
@@ -898,12 +900,17 @@ opening the first frame (e.g. open a connection to an X server).")
                    (<= (frame-parameter nil 'menu-bar-lines) 0)))
     (menu-bar-mode 1))
 
-  ;; If frame was created with a tool bar, switch tool-bar-mode on.
-  (unless (or noninteractive
-             emacs-basic-display
-              (not (display-graphic-p))
-              (<= (frame-parameter nil 'tool-bar-lines) 0))
-    (tool-bar-mode 1))
+  (unless (or noninteractive (not (fboundp 'tool-bar-mode)))
+    ;; Set up the tool-bar.  Do this even in tty frames, so that there
+    ;; is a tool-bar if Emacs later opens a graphical frame.
+    (if (or emacs-basic-display
+           (and (numberp (frame-parameter nil 'tool-bar-lines))
+                (<= (frame-parameter nil 'tool-bar-lines) 0)))
+       ;; On a graphical display with the toolbar disabled via X
+       ;; resources, set up the toolbar without enabling it.
+       (tool-bar-setup)
+      ;; Otherwise, enable tool-bar-mode.
+      (tool-bar-mode 1)))
 
   ;; Can't do this init in defcustom because the relevant variables
   ;; are not set.
@@ -927,7 +934,11 @@ opening the first frame (e.g. open a connection to an X server).")
   ;; since users can connect to color-capable terminals and also
   ;; switch color support on or off in mid-session by setting the
   ;; tty-color-mode frame parameter.
-  (tty-register-default-colors)
+  ;; Exception: the `pc' ``window system'' has only 16 fixed colors,
+  ;; and they are already set at this point by a suitable function in
+  ;; window-system-initialization-alist.
+  (or (eq initial-window-system 'pc)
+      (tty-register-default-colors))
 
   ;; Record whether the tool-bar is present before the user and site
   ;; init files are processed.  frame-notice-user-settings uses this
@@ -967,13 +978,15 @@ opening the first frame (e.g. open a connection to an X server).")
                                   init-file-user)
                           :error)
        (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)
+                              ;; We don't support ~USER on MS-Windows
+                              ;; and MS-DOS 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 (memq system-type '(windows-nt ms-dos))
                                   "~"
                                 (concat "~" init-file-user))))
            nil
@@ -1007,8 +1020,6 @@ opening the first frame (e.g. open a connection to an X server).")
                                   "~/_emacs"
                                 ;; But default to .emacs if _emacs does not exist.
                                 "~/.emacs")))
-                           ((eq system-type 'vax-vms)
-                            "sys$login:.emacs")
                            (t
                             (concat "~" init-file-user "/.emacs")))))
                      ;; This tells `load' to store the file name found
@@ -1065,28 +1076,20 @@ opening the first frame (e.g. open a connection to an X server).")
                (funcall inner)
                (setq init-file-had-error nil))
            (error
-            (let ((message-log-max nil))
-              (with-current-buffer (get-buffer-create "*Messages*")
-                (insert "\n\n"
-                        (format "An error has occurred while loading `%s':\n\n"
-                                user-init-file)
-                        (format "%s%s%s"
-                                (get (car error) 'error-message)
-                                (if (cdr error) ": " "")
-                                (mapconcat (lambda (s) (prin1-to-string s t)) (cdr error) ", "))
-                        "\n\n"
-                        "To ensure normal operation, you should investigate and remove the\n"
-                        "cause of the error in your initialization file.  Start Emacs with\n"
-                        "the `--debug-init' option to view a complete error backtrace.\n\n"))
-              (message "Error in init file: %s%s%s"
-                       (get (car error) 'error-message)
-                       (if (cdr error) ": " "")
-                       (mapconcat 'prin1-to-string (cdr error) ", "))
-              (let ((pop-up-windows nil))
-                (pop-to-buffer "*Messages*"))
-              (setq init-file-had-error t)))))
-
-       (if (and deactivate-mark transient-mark-mode)
+            (display-warning
+             'initialization
+             (format "An error occurred while loading `%s':\n\n%s%s%s\n\n\
+To ensure normal operation, you should investigate and remove the
+cause of the error in your initialization file.  Start Emacs with
+the `--debug-init' option to view a complete error backtrace."
+                     user-init-file
+                     (get (car error) 'error-message)
+                     (if (cdr error) ": " "")
+                     (mapconcat (lambda (s) (prin1-to-string s t)) (cdr error) ", "))
+             :warning)
+            (setq init-file-had-error t))))
+
+      (if (and deactivate-mark transient-mark-mode)
            (with-current-buffer (window-buffer)
              (deactivate-mark)))
 
@@ -1210,6 +1213,23 @@ opening the first frame (e.g. open a connection to an X server).")
   ;; If -batch, terminate after processing the command options.
   (if noninteractive (kill-emacs t))
 
+  ;; In daemon mode, start the server to allow clients to connect.
+  ;; This is done after loading the user's init file and after
+  ;; processing all command line arguments to allow e.g. `server-name'
+  ;; to be changed before the server starts.
+  (let ((dn (daemonp)))
+    (when dn
+      (when (stringp dn) (setq server-name dn))
+      (server-start)
+      (if server-process
+         (daemon-initialized)
+       (if (stringp dn)
+           (message
+            "Unable to start daemon: Emacs server named %S already running"
+            server-name)
+         (message "Unable to start the daemon.\nAnother instance of Emacs is running the server, either as daemon or interactively.\nYou can use emacsclient to connect to that Emacs process."))
+       (kill-emacs 1))))
+
   ;; Run emacs-session-restore (session management) if started by
   ;; the session manager and we have a session manager connection.
   (if (and (boundp 'x-session-previous-id)
@@ -1250,6 +1270,7 @@ If this is nil, no message will be displayed."
         '("GNU" (lambda (button) (describe-gnu-project))
           "Display info on the GNU project")))
      " operating system.\n\n"
+     :face variable-pitch
      :link ("Emacs Tutorial" (lambda (button) (help-with-tutorial)))
      "\tLearn basic keystroke commands"
      (lambda ()
@@ -1269,7 +1290,6 @@ If this is nil, no message will be displayed."
             ""
           (concat " (" title ")"))))
      "\n"
-     :face variable-pitch
      :link ("Emacs Guided Tour"
            (lambda (button) (browse-url "http://www.gnu.org/software/emacs/tour/"))
            "Browse http://www.gnu.org/software/emacs/tour/")
@@ -1378,7 +1398,7 @@ Each element in the list should be a list of strings or pairs
   :group 'initialization)
 
 (defcustom fancy-splash-image nil
-  "*The image to show in the splash screens, or nil for defaults."
+  "The image to show in the splash screens, or nil for defaults."
   :group 'fancy-splash-screen
   :type '(choice (const :tag "Default" nil)
                 (file :tag "File")))
@@ -1975,12 +1995,14 @@ Type \\[describe-distribution] for information on "))
   (insert "\tBuying printed manuals from the FSF\n"))
 
 (defun startup-echo-area-message ()
-  (if (eq (key-binding "\C-h\C-a") 'about-emacs)
-      "For information about GNU Emacs and the GNU system, type C-h C-a."
-    (substitute-command-keys
-     "For information about GNU Emacs and the GNU system, type \
-\\[about-emacs].")))
-
+  (cond ((daemonp)
+        "Starting Emacs daemon.")
+       ((eq (key-binding "\C-h\C-a") 'about-emacs)
+        "For information about GNU Emacs and the GNU system, type C-h C-a.")
+       (t
+        (substitute-command-keys
+         "For information about GNU Emacs and the GNU system, type \
+\\[about-emacs]."))))
 
 (defun display-startup-echo-area-message ()
   (let ((resize-mini-windows t))
@@ -2040,17 +2062,12 @@ A fancy display is used on graphic displays, normal otherwise."
 
 (defun command-line-1 (command-line-args-left)
   (display-startup-echo-area-message)
-
-  ;; Delay 2 seconds after an init file error message
-  ;; was displayed, so user can read it.
-  (when init-file-had-error
-    (sit-for 2))
-
   (when (and pure-space-overflow
             (not noninteractive))
     (display-warning
      'initialization
-     "Building Emacs overflowed pure space.  (See the node Pure Storage in the Lisp manual for details.)"
+     "Building Emacs overflowed pure space.\
+  (See the node Pure Storage in the Lisp manual for details.)"
      :warning))
 
   (let ((file-count 0)
@@ -2205,10 +2222,10 @@ A fancy display is used on graphic displays, normal otherwise."
                   (setq command-line-args-left
                         (nthcdr (nth 1 tem) command-line-args-left)))
 
-               ((setq tem (assoc argi command-line-ns-option-alist))
-                ;; Ignore NS-windows options and their args if not using NS.
-                (setq command-line-args-left
-                      (nthcdr (nth 1 tem) command-line-args-left)))
+                 ((setq tem (assoc argi command-line-ns-option-alist))
+                  ;; Ignore NS-windows options and their args if not using NS.
+                  (setq command-line-args-left
+                        (nthcdr (nth 1 tem) command-line-args-left)))
 
                  ((member argi '("-find-file" "-file" "-visit"))
                   (setq inhibit-startup-screen t)