]> code.delx.au - gnu-emacs/blobdiff - lisp/startup.el
(menu-bar-help-menu): Add menu item for non-English
[gnu-emacs] / lisp / startup.el
index b30bd450ea3a21f8cee48238580e6f2c7914c1c9..a51fd018c6449237938c523e0bf14ae3270749cf 100644 (file)
@@ -50,7 +50,7 @@
 ;; --terminal FILE           Using this implies "-nw" also.
 ;;                           This option is handled by emacs.c
 ;; -------------------------
-;; -d DISPNAME               Use DISPNAME as the name of the X-windows
+;; -d DISPNAME               Use DISPNAME as the name of the X
 ;; -display DISPNAME         display for the initial frame.
 ;; --display DISPNAME        This option is handled by emacs.c
 ;; -------------------------
 ;; --debug-init              debugger run.
 ;; -------------------------
 ;; -i ICONTYPE               Set type of icon using when Emacs is
-;; -itype ICONTYPE           iconified under X-windows.
+;; -itype ICONTYPE           iconified under X.
 ;; --icon-type ICONTYPE      This option is passed on to term/x-win.el
 ;;
-;; -iconic                   Start Emacs iconified under X-windows.
+;; -iconic                   Start Emacs iconified.
 ;; --iconic                  This option is passed on to term/x-win.el
 ;; -------------------------
-;; Various X-windows options for colors/fonts/geometry/title etc.
+;; Various X options for colors/fonts/geometry/title etc.
 ;; These options are passed on to term/x-win.el which see.  Certain
 ;; of these are also found in term/pc-win.el
 ;; -------------------------
 ;; FILE                      Visit FILE.
+;; -visit FILE
+;; --visit FILE
+;; -file FILE
+;; --file FILE
 ;;
 ;; -L DIRNAME                Add DIRNAME to load-path
 ;; -directory DIRNAME
 ;;
 ;; -eval FORM                Execute Emacs lisp form FORM.
 ;; --eval FORM
+;; -execute EXPR
+;; --execute EXPR
 ;;
 ;; -insert FILE              Insert the contents of FILE into buffer.
 ;; --insert FILE
@@ -172,7 +178,7 @@ This is normally copied from `default-directory' when Emacs starts.")
 
 ;;; This is here, rather than in x-win.el, so that we can ignore these
 ;;; options when we are not using X.
-(defvar command-line-x-option-alist
+(defconst command-line-x-option-alist
   '(("-bw" 1 x-handle-numeric-switch border-width)
     ("-d" 1 x-handle-display)
     ("-display" 1 x-handle-display)
@@ -187,6 +193,7 @@ This is normally copied from `default-directory' when Emacs starts.")
     ("-font" 1 x-handle-switch font)
     ("-ib" 1 x-handle-numeric-switch internal-border-width)
     ("-g" 1 x-handle-geometry)
+    ("-lsp" 1 x-handle-numeric-switch line-spacing)
     ("-geometry" 1 x-handle-geometry)
     ("-fg" 1 x-handle-switch foreground-color)
     ("-foreground" 1 x-handle-switch foreground-color)
@@ -217,6 +224,7 @@ This is normally copied from `default-directory' when Emacs starts.")
     ("--xrm" 1 x-handle-xrm-switch)
     ("--cursor-color" 1 x-handle-switch cursor-color)
     ("--vertical-scroll-bars" 0 x-handle-switch vertical-scroll-bars t)
+    ("--line-spacing" 1 x-handle-numeric-switch line-spacing)
     ("--border-color" 1 x-handle-switch border-width))
   "Alist of X Windows options.
 Each element has the form
@@ -296,15 +304,6 @@ is less convenient."
   :type '(choice (const :tag "none" nil) string)
   :group 'initialization)
 
-(defconst iso-8859-n-locale-regexp "8859[-_]?\\([1-49]\\)\\>"
-  "Regexp that specifies when to enable an ISO 8859-N character set.
-We do that if this regexp matches the locale name specified by
-one of the environment variables LC_ALL, LC_CTYPE, or LANG.
-The paren group in the regexp should match the specific character
-set number, N.  Currently only Latin-[12345] are supported.
-\(Note that Latin-5 is ISO 8859-9, because 8859-[678] are non-Latin
-alphabets; hence, supported values of N are [12349].\)")
-
 (defcustom mail-host-address nil
   "*Name of this machine, for purposes of naming users."
   :type '(choice (const nil) string)
@@ -318,33 +317,22 @@ after your init file is read, in case it sets `mail-host-address'."
   :group 'mail)
 
 (defcustom auto-save-list-file-prefix
-  (if (eq system-type 'ms-dos)
-      "~/_s"  ; MS-DOS cannot have initial dot, and allows only 8.3 names
-    "~/.saves-")
+  (cond ((eq system-type 'ms-dos)
+        ;; MS-DOS cannot have initial dot, and allows only 8.3 names
+        "~/_emacs.d/auto-save.list/_s")
+       (t
+        "~/.emacs.d/auto-save-list/.saves-"))
   "Prefix for generating `auto-save-list-file-name'.
 This is used after reading your `.emacs' file to initialize
 `auto-save-list-file-name', by appending Emacs's pid and the system name,
 if you have not already set `auto-save-list-file-name' yourself.
+Directories in the prefix will be created if necessary.
 Set this to nil if you want to prevent `auto-save-list-file-name'
 from being initialized."
   :type '(choice (const :tag "Don't record a session's auto save list" nil)
                 string)
   :group 'auto-save)
 
-(defvar locale-translation-file-name
-  (let ((files '("/usr/lib/X11/locale/locale.alias" ; e.g. X11R6.4
-                "/usr/X11R6/lib/X11/locale/locale.alias" ; e.g. RedHat 4.2
-                "/usr/openwin/lib/locale/locale.alias" ; e.g. Solaris 2.6
-                ;;
-                ;; The following name appears after the X-related names above,
-                ;; since the X-related names are what X actually uses.
-                "/usr/share/locale/locale.alias" ; GNU/Linux sans X
-                )))
-    (while (and files (not (file-exists-p (car files))))
-      (setq files (cdr files)))
-    (car files))
-  "*File name for the system's file of locale-name aliases, or nil if none.")
-
 (defvar init-file-debug nil)
 
 (defvar init-file-had-error nil)
@@ -373,6 +361,10 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
          (while contents
            (unless (member (car contents) '("." ".." "RCS" "CVS"))
              (when (and (string-match "\\`[a-zA-Z0-9]" (car contents))
+                        ;; Avoid doing a `stat' when it isn't necessary
+                        ;; because that can cause trouble when an NFS server
+                        ;; is down.
+                        (not (string-match "\\.elc?\\'" (car contents)))
                         (file-directory-p (car contents)))
                (let ((expanded (expand-file-name (car contents))))
                  (unless (file-exists-p (expand-file-name ".nosearch"
@@ -390,11 +382,15 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   (let ((tail load-path)
        (thisdir (directory-file-name default-directory)))
     (while (and tail
+               ;;Don't go all the way to the nil terminator.
+               (cdr tail)
                (not (equal thisdir (car tail)))
                (not (and (memq system-type '(ms-dos windows-nt))
                          (equal (downcase thisdir) (downcase (car tail))))))
       (setq tail (cdr tail)))
-    (setcdr tail (append (mapcar 'expand-file-name dirs) (cdr tail)))))
+    ;;Splice the new section in.
+    (when tail
+      (setcdr tail (append (mapcar 'expand-file-name dirs) (cdr tail))))))
 
 (defun normal-top-level ()
   (if command-line-processed
@@ -416,8 +412,9 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
          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))
+       (condition-case nil
+           (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
@@ -447,16 +444,23 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
                 (setq auto-save-list-file-name
                       ;; Under MS-DOS our PID is almost always reused between
                       ;; Emacs invocations.  We need something more unique.
-                      (if (eq system-type 'ms-dos)
-                          (concat 
-                           (make-temp-name
-                            (expand-file-name auto-save-list-file-prefix))
-                           "~")
-
-                        (expand-file-name (format "%s%d-%s~"
-                                                  auto-save-list-file-prefix
-                                                  (emacs-pid)
-                                                  (system-name)))))))
+                      (cond ((eq system-type 'ms-dos)
+                             ;; We are going to access the auto-save
+                             ;; directory, so make sure it exists.
+                             (make-directory
+                              (file-name-directory auto-save-list-file-prefix)
+                              t)
+                             (concat 
+                              (make-temp-name
+                               (expand-file-name
+                                auto-save-list-file-prefix))
+                              "~"))
+                            (t
+                             (expand-file-name
+                              (format "%s%d-%s~"
+                                      auto-save-list-file-prefix
+                                      (emacs-pid)
+                                      (system-name))))))))
        (run-hooks 'emacs-startup-hook)
        (and term-setup-hook
             (run-hooks 'term-setup-hook))
@@ -500,6 +504,9 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
                (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "SYS$SCRATCH:"))
               (t
                (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp")))))
+  (setq small-temporary-file-directory
+       (if (eq system-type 'ms-dos)
+           (getenv "TMPDIR")))
 
   ;; See if we should import version-control from the environment variable.
   (let ((vc (getenv "VERSION_CONTROL")))
@@ -514,45 +521,7 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
               (string= vc "simple"))
           (setq version-control 'never))))
 
-  (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)))))
-    ;; Translate "swedish" into "sv_SE.ISO-8859-1", and so on,
-    ;; using the translation file that GNU/Linux systems have.
-    (and ctype
-        locale-translation-file-name
-        (not (string-match iso-8859-n-locale-regexp ctype))
-        (with-temp-buffer
-          (insert-file-contents locale-translation-file-name)
-          (if (re-search-forward
-               (concat "^" (regexp-quote ctype) ":?[ \t]+") nil t)
-              (setq ctype (buffer-substring (point)
-                                            (progn (end-of-line) (point)))))))
-    ;; Now see if the locale specifies an ISO 8859 character set.
-    (when (and ctype
-              (string-match iso-8859-n-locale-regexp ctype))
-      (let (charset (which (match-string 1 ctype)))
-       (if (equal "9" which)
-           (setq which "5"))
-       (setq charset (concat "latin-" which))
-       (when (string-match "latin-[12345]" charset)
-         ;; Set up for this character set.
-         ;; This is now the right way to do it
-         ;; for both unibyte and multibyte modes.
-         (set-language-environment charset)
-         (unless (or noninteractive (eq window-system 'x))
-           ;; Send those codes literally to a non-X terminal.
-           (when default-enable-multibyte-characters
-             ;; If this is nil, we are using single-byte characters,
-             ;; so the terminal coding system is irrelevant.
-             (set-terminal-coding-system
-              (intern (downcase charset)))))
-         (standard-display-european-internal)))))
+  (set-locale-environment nil)
 
   ;;! This has been commented out; I currently find the behavior when
   ;;! split-window-keep-point is nil disturbing, but if I can get used
@@ -589,11 +558,11 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
        (if (memq 'file-error (get (car error) 'error-conditions))
            (format "%s: %s"
                     (nth 1 error)
-                    (mapconcat '(lambda (obj) (prin1-to-string obj t))
+                    (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))
+                  (mapconcat (lambda (obj) (prin1-to-string obj t))
                              (cdr error) ", "))))
       'external-debugging-output)
      (setq window-system nil)
@@ -673,8 +642,9 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   (if (fboundp 'frame-initialize)
       (frame-initialize))
   ;; If frame was created with a menu bar, set menu-bar-mode on.
-  (if (or (not (memq window-system '(x w32)))
-         (> (cdr (assq 'menu-bar-lines (frame-parameters))) 0))
+  (if (and (not noninteractive)
+          (or (not (memq window-system '(x w32)))
+              (> (cdr (assq 'menu-bar-lines (frame-parameters))) 0)))
       (menu-bar-mode t))
 
   (run-hooks 'before-init-hook)
@@ -720,6 +690,24 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
                    ;; into user-init-file.
                    (setq user-init-file t)
                    (load user-init-file-1 t t)
+                   ;; If we did not find the user's init file,
+                   ;; set user-init-file conclusively to nil;
+                   ;; don't let it be set from default.el.
+                   (if (eq user-init-file t)
+                       (setq user-init-file nil))
+                   ;; If we loaded a compiled file, set
+                   ;; `user-init-file' to the source version if that
+                   ;; exists.
+                   (when (and user-init-file
+                              (equal (file-name-extension user-init-file)
+                                     "elc")
+                              (file-exists-p user-init-file-1))
+                     (when (file-newer-than-file-p
+                            user-init-file-1 user-init-file)
+                       (message "Warning: %s is newer than %s"
+                                user-init-file-1 user-init-file)
+                       (sit-for 1))
+                     (setq user-init-file user-init-file-1))
                    (or inhibit-default-init
                        (let ((inhibit-startup-message nil))
                          ;; Users are supposed to be told their rights.
@@ -776,6 +764,21 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
        (set-buffer "*scratch*")
        (if (eq major-mode 'fundamental-mode)
            (funcall initial-major-mode))))
+
+  ;; Register default TTY colors for the case the terminal hasn't a
+  ;; terminal init file.
+  (or (memq window-system '(x w32))
+      (not (tty-display-color-p))
+      (let* ((colors (cond ((eq window-system 'pc)
+                            msdos-color-values)
+                           ((eq system-type 'windows-nt)
+                            w32-tty-standard-colors)
+                           (t tty-standard-colors)))
+            (color (car colors)))
+       (while colors
+         (tty-color-define (car color) (cadr color) (cddr color))
+         (setq colors (cdr colors) color (car colors)))))
+  
   ;; Load library for our terminal type.
   ;; User init file can set term-file-prefix to nil to prevent this.
   (and term-file-prefix (not noninteractive) (not window-system)
@@ -794,12 +797,12 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   ;; If -batch, terminate after processing the command options.
   (if noninteractive (kill-emacs t)))
 
-(defcustom initial-scratch-message "\
-This buffer is for notes you don't want to save, and for Lisp evaluation.
-If you want to create a file, visit that file with C-x C-f,
-then enter the text in that file's own buffer.
+(defcustom initial-scratch-message (purecopy "\
+;; This buffer is for notes you don't want to save, and for Lisp evaluation.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer.
 
-"
+")
   "Initial message displayed in *scratch* buffer at startup.
 If this is nil, no message will be displayed."
   :type 'string)
@@ -862,8 +865,8 @@ If this is nil, no message will be displayed."
             (setq window-setup-hook nil)
             ;; Do this now to avoid an annoying delay if the user
             ;; clicks the menu bar during the sit-for.
-            (if (memq window-system '(x w32))
-                (precompute-menubar-bindings))
+            (when (memq window-system '(x w32))
+              (precompute-menubar-bindings))
             (setq menubar-bindings-done t)
             (when (= (buffer-size) 0)
               (let ((buffer-undo-list t))
@@ -888,13 +891,14 @@ 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
 \(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.
 ")
                             (insert "\n\n" (emacs-version)
                                     "
-Copyright (C) 1999 Free Software Foundation, Inc."))
+Copyright (C) 2000 Free Software Foundation, Inc."))
                         ;; If keys have their default meanings,
                         ;; use precomputed string to save lots of time.
                         (if (and (eq (key-binding "\C-h") 'help-command)
@@ -938,6 +942,11 @@ Mode-specific menu   C-mouse-3 (third button, with CTRL)"))
 \(`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.)")
                         (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
@@ -951,7 +960,7 @@ If you have no Meta key, you may instead type ESC followed by the character.)")
 
                         (insert "\n\n" (emacs-version)
                                 "
-Copyright (C) 1999 Free Software Foundation, Inc.")
+Copyright (C) 2000 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))
@@ -989,9 +998,10 @@ Type \\[describe-distribution] for information on getting the latest version."))
          ;; and long versions of what's on command-switch-alist.
          (longopts
           (append '(("--funcall") ("--load") ("--insert") ("--kill")
-                    ("--directory") ("--eval") ("--find-file") ("--visit"))
-                  (mapcar '(lambda (elt)
-                             (list (concat "-" (car elt))))
+                    ("--directory") ("--eval") ("--execute")
+                    ("--find-file") ("--visit") ("--file"))
+                  (mapcar (lambda (elt)
+                            (list (concat "-" (car elt))))
                           command-switch-alist)))
          (line 0))
 
@@ -1041,6 +1051,7 @@ Type \\[describe-distribution] for information on getting the latest version."))
                            (cons argval command-line-args-left)))
                       (funcall (cdr tem) argi))
                   (funcall (cdr tem) argi)))
+               
                ((or (string-equal argi "-f")  ;what the manual claims
                     (string-equal argi "-funcall")
                     (string-equal argi "-e")) ; what the source used to say
@@ -1051,13 +1062,16 @@ Type \\[describe-distribution] for information on getting the latest version."))
                 (if (arrayp (symbol-function tem))
                     (command-execute tem)
                   (funcall tem)))
-               ((string-equal argi "-eval")
+               
+               ((or (string-equal argi "-eval")
+                    (string-equal argi "-execute"))
                 (if argval
                     (setq tem argval)
                   (setq tem (car command-line-args-left))
                   (setq command-line-args-left (cdr command-line-args-left)))
                 (eval (read tem)))
                ;; Set the default directory as specified in -L.
+               
                ((or (string-equal argi "-L")
                     (string-equal argi "-directory"))
                 (if argval
@@ -1069,6 +1083,7 @@ Type \\[describe-distribution] for information on getting the latest version."))
                       (cons (expand-file-name tem) extra-load-path))
                 (setq load-path (append (nreverse extra-load-path)
                                         initial-load-path)))
+               
                ((or (string-equal argi "-l")
                     (string-equal argi "-load"))
                 (if argval
@@ -1081,6 +1096,7 @@ Type \\[describe-distribution] for information on getting the latest version."))
                   (if (file-exists-p (expand-file-name file))
                       (setq file (expand-file-name file)))
                   (load file nil t)))
+               
                ((string-equal argi "-insert")
                 (if argval
                     (setq tem argval)
@@ -1089,28 +1105,38 @@ Type \\[describe-distribution] for information on getting the latest version."))
                 (or (stringp tem)
                     (error "File name omitted from `-insert' option"))
                 (insert-file-contents (command-line-normalize-file-name tem)))
+               
                ((string-equal argi "-kill")
                 (kill-emacs t))
+               
                ((string-match "^\\+[0-9]+\\'" argi)
                 (setq line (string-to-int argi)))
+               
                ((setq tem (assoc argi command-line-x-option-alist))
                 ;; Ignore X-windows options and their args if not using X.
                 (setq command-line-args-left
                       (nthcdr (nth 1 tem) command-line-args-left)))
+               
                ((or (string-equal argi "-find-file")
+                    (string-equal argi "-file")
                     (string-equal argi "-visit"))
                 ;; An explicit option to specify visiting a file.
+                (if argval
+                    (setq tem argval)
+                  (setq tem (car command-line-args-left)
+                        command-line-args-left (cdr command-line-args-left)))
+                (unless (stringp tem)
+                  (error "File name omitted from `%s' option" argi))
                 (setq file-count (1+ file-count))
-                (let ((file
-                       (expand-file-name
-                        (command-line-normalize-file-name orig-argi)
-                        dir)))
+                (let ((file (expand-file-name
+                             (command-line-normalize-file-name tem) dir)))
                   (if (= file-count 1)
                       (setq first-file-buffer (find-file file))
                     (find-file-other-window file)))
                 (or (zerop line)
                     (goto-line line))
                 (setq line 0))
+               
                ((equal argi "--")
                 (setq just-files t))
                (t