Mercurial > hg > xemacs-beta
diff lisp/startup.el @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | de805c49cfc1 |
children | da8ed4261e83 |
line wrap: on
line diff
--- a/lisp/startup.el Mon Aug 13 11:19:22 2007 +0200 +++ b/lisp/startup.el Mon Aug 13 11:20:41 2007 +0200 @@ -20,7 +20,7 @@ ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with XEmacs; see the file COPYING. If not, write to the +;; along with XEmacs; see the file COPYING. If not, write to the ;; Free Software Foundation, 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. @@ -30,7 +30,7 @@ ;; This file is dumped with XEmacs. -;; -batch, -t, and -nw are processed by main() in emacs.c and are +;; -batch, -t, and -nw are processed by main() in emacs.c and are ;; never seen by lisp code. ;; -version and -help are special-cased as well: they imply -batch, @@ -104,35 +104,18 @@ (defvar emacs-roots nil "List of plausible roots of the XEmacs hierarchy.") -(defvar user-init-directory-base ".xemacs" - "Base of directory where user-installed init files may go.") - -(defvar user-init-directory - (file-name-as-directory - (paths-construct-path (list "~" user-init-directory-base))) - "Directory where user-installed init files may go.") - -(defvar user-init-file-base "init.el" - "Default name of the user init file if uncompiled. -This should be used for migration purposes only.") +(defvar init-file-user nil + "Identity of user whose `.emacs' file is or was read. +The value is nil if no init file is being used; otherwise, it may be either +the null string, meaning that the init file was taken from the user that +originally logged in, or it may be a string containing a user's name. -(defvar user-init-file-base-list '("init.elc" "init.el") - "List of allowed init files in the user's init directory. -The first one found takes precedence.") +In either of the latter cases, `(concat \"~\" init-file-user \"/\")' +evaluates to the name of the directory in which the `.emacs' file was +searched for. -(defvar user-home-init-file-base-list - (append '(".emacs.elc" ".emacs.el" ".emacs") - (and (eq system-type 'windows-nt) - '("_emacs.elc" "_emacs.el" "_emacs"))) - "List of allowed init files in the user's home directory. -The first one found takes precedence.") - -(defvar load-home-init-file nil - "Non-nil if XEmacs should load the init file from the home directory. -Otherwise, XEmacs will offer migration to the init directory.") - -(defvar load-user-init-file-p t - "Non-nil if XEmacs should load the user's init file.") +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'.") ;; #### called `site-run-file' in FSFmacs @@ -217,18 +200,12 @@ (princ (concat "\n" (emacs-version) "\n\n")) (princ (if (featurep 'x) - (concat "When creating a window on an X display, " - (emacs-name) - " accepts all standard X Toolkit -command line options plus the following: - -iconname <title> Use title as the icon name. - -mc <color> Use color as the mouse color. - -cr <color> Use color as the text-cursor foregound color. - -private Install a private colormap. - -In addition, the") + (concat (emacs-name) + " accepts all standard X Toolkit command line options.\n" + "In addition, the") "The")) (princ " following options are accepted: + -t <device> Use TTY <device> instead of the terminal for input and output. This implies the -nw option. -nw Inhibit the use of any window-system-specific @@ -243,11 +220,7 @@ startup. Also implies `-vanilla'. -vanilla Equivalent to -q -no-site-file -no-early-packages. -q Same as -no-init-file. - -user-init-file <file> Use <file> as init file. - -user-init-directory <directory> use <directory> as init directory. -user <user> Load user's init file instead of your own. - Equivalent to -user-init-file ~<user>/.emacs - -user-init-directory ~<user>/.xemacs/ -u <user> Same as -user.\n") (let ((l command-switch-alist) (insert (lambda (&rest x) @@ -382,10 +355,11 @@ (princ "\n\n" stream))) (when (not suppress-early-error-handler-backtrace) (backtrace stream t))) - (if (fboundp 'mswindows-message-box) - (mswindows-message-box "Initialization error")) (kill-emacs -1)) +(defvar lock-directory) +(defvar superlock-file) + (defun normal-top-level () (if command-line-processed (message "Back to top level.") @@ -408,15 +382,14 @@ (setq emacs-roots (paths-find-emacs-roots invocation-directory invocation-name)) - + (if debug-paths (princ (format "emacs-roots:\n%S\n" emacs-roots) 'external-debugging-output)) - + (if (null emacs-roots) (startup-find-roots-warning) (startup-setup-paths emacs-roots - user-init-directory inhibit-early-packages inhibit-site-lisp debug-paths)) @@ -426,7 +399,7 @@ lisp-directory) (load (expand-file-name (file-name-sans-extension autoload-file-name) lisp-directory) nil t)) - + (if (not inhibit-autoloads) (progn (if (not inhibit-early-packages) @@ -460,9 +433,6 @@ (when window-setup-hook (run-hooks 'window-setup-hook)) (setq window-setup-hook nil)) - - (if load-user-init-file-p - (maybe-migrate-user-init-file)) ;;####FSFmacs junk ;; (or menubar-bindings-done ;; (precompute-menubar-bindings)) @@ -511,11 +481,16 @@ ;; (and (not (equal string "")) string))))) ;; (and ctype ;; (string-match iso-8859-1-locale-regexp ctype))) - ;; (progn + ;; (progn ;; (standard-display-european t) ;; (require 'iso-syntax))) - (setq load-user-init-file-p (not (noninteractive))) + ;; Figure out which user's init file to load, + ;; either from the environment or from the options. + (setq init-file-user (if (noninteractive) nil (user-login-name))) + ;; If user has not done su, use current $HOME to find .emacs. + (and init-file-user (string= init-file-user (user-real-login-name)) + (setq init-file-user "")) ;; Allow (at least) these arguments anywhere in the command line (let ((new-args nil) @@ -525,7 +500,7 @@ (cond ((or (string= arg "-q") (string= arg "-no-init-file")) - (setq load-user-init-file-p nil)) + (setq init-file-user nil)) ((string= arg "-no-site-file") (setq site-start-file nil)) ((or (string= arg "-no-early-packages") @@ -536,23 +511,11 @@ ;; Some work on this one already done in emacs.c. (string= arg "-no-autoloads") (string= arg "--no-autoloads")) - (setq load-user-init-file-p nil + (setq init-file-user nil site-start-file nil)) - ((string= arg "-user-init-file") - (setq user-init-file (pop args))) - ((string= arg "-user-init-directory") - (setq user-init-directory (file-name-as-directory (pop args)))) ((or (string= arg "-u") - (string= arg "-user")) - (let* ((user (pop args)) - (home-user (concat "~" user))) - (setq user-init-directory (file-name-as-directory - (paths-construct-path - (list home-user user-init-directory-base)))) - (setq user-init-file - (find-user-init-file user-init-directory home-user)) - (setq custom-file - (make-custom-file-name user-init-file)))) + (string= arg "-user")) + (setq init-file-user (pop args))) ((string= arg "-debug-init") (setq init-file-debug t)) ((string= arg "-unmapped") @@ -564,9 +527,7 @@ (while args (push (pop args) new-args))) (t (push arg new-args)))) - - (setq init-file-user (and load-user-init-file-p "")) - + (nreverse new-args))) (defconst initial-scratch-message "\ @@ -607,11 +568,6 @@ ;; and deletes the stdio device. (frame-initialize)) - ;; Reinitialize faces if necessary. This function changes face if - ;; it is created during auto-autoloads loading. Otherwise, it - ;; does nothing. - (startup-initialize-custom-faces) - ;; ;; We have normality, I repeat, we have normality. Anything you still ;; can't cope with is therefore your own problem. (And we don't need @@ -620,7 +576,7 @@ ;;; Load init files. (load-init-file) - + (with-current-buffer (get-buffer "*scratch*") (erase-buffer) ;; (insert initial-scratch-message) @@ -645,7 +601,7 @@ ;; If -batch, terminate after processing the command options. (when (noninteractive) (kill-emacs t)))) -(defun load-terminal-library () +(defun load-terminal-library () (when term-file-prefix (let ((term (getenv "TERM")) hyphend) @@ -656,94 +612,43 @@ (setq term (substring term 0 hyphend)) (setq term nil)))))) -(defun find-user-init-directory-init-file (&optional init-directory) - "Determine the user's init file if in the init directory." - (let ((init-directory (or init-directory user-init-directory))) - (catch 'found - (dolist (file user-init-file-base-list) - (let ((expanded (expand-file-name file init-directory))) - (when (file-exists-p expanded) - (throw 'found expanded))))))) - -(defun find-user-home-directory-init-file (&optional home-directory) - "Determine the user's init file if in the home directory." - (let ((home-directory (or home-directory "~"))) - (catch 'found - (dolist (file user-home-init-file-base-list) - (let ((expanded (expand-file-name file home-directory))) - (when (file-exists-p expanded) - (throw 'found expanded)))) - nil))) - -(defun find-user-init-file (&optional init-directory home-directory) - "Determine the user's init file." - (if load-home-init-file - (find-user-home-directory-init-file home-directory) - (or (find-user-init-directory-init-file init-directory) - (find-user-home-directory-init-file home-directory)))) - -(defun maybe-migrate-user-init-file () - "Ask user if she wants to migrate the init file(s) to new location." - (if (and (not load-home-init-file) - (not (find-user-init-directory-init-file user-init-directory)) - (file-exists-p user-init-file)) - (if (with-output-to-temp-buffer (help-buffer-name nil) - (progn - (princ "XEmacs recommends that the initialization code in -") - (princ user-init-file) - (princ " -be migrated to the ") - (princ user-init-directory) - (princ " directory. XEmacs can -perform the migration automatically. +(defconst user-init-directory "/.xemacs/" + "Directory where user-installed packages may go.") +(define-obsolete-variable-alias + 'emacs-user-extension-dir + 'user-init-directory) -After the migration, init.el/init.elc holds user-written -initialization code. Moreover the customize settings will be in -custom.el. - -If you choose not to do this now, XEmacs will not ask you this -question in the future. However, you can still make XEmacs -perform the migration at any time with M-x migrate-user-init-file.") - (show-temp-buffer-in-current-frame standard-output) - (yes-or-no-p-minibuf (concat "Migrate init file to " - user-init-directory - "? ")))) - (migrate-user-init-file) - (customize-save-variable 'load-home-init-file t)))) - -(defun migrate-user-init-file () - "Migrate the init file from the home directory." - (interactive) - (if (not (file-exists-p user-init-directory)) - (progn - (message "Creating %s directory..." user-init-directory) - (make-directory user-init-directory))) - (message "Migrating custom file...") - (custom-migrate-custom-file (make-custom-file-name user-init-file - 'force-new)) - (message "Moving init file...") - (rename-file user-init-file - (expand-file-name user-init-file-base - user-init-directory)) - (message "Migration done.")) - -(defun load-user-init-file () - "This function actually reads the init file." - (if (or user-init-file - (setq user-init-file (find-user-init-file user-init-directory))) - (load user-init-file t t t)) - (if (not custom-file) - (setq custom-file (make-custom-file-name user-init-file))) - (if (and (not (string= custom-file user-init-file)) - (file-exists-p custom-file)) - (load custom-file t t t)) - (unless inhibit-default-init - (let ((inhibit-startup-message nil)) - ;; Users are supposed to be told their rights. - ;; (Plus how to get help and how to undo.) - ;; Don't you dare turn this off for anyone except yourself. - (load "default" t t)))) +(defun load-user-init-file (init-file-user) + "This function actually reads the init file, .emacs." + (when init-file-user +;; purge references to init.el and options.el +;; convert these to use paths-construct-path for eventual migration to init.el +;; needs to be converted when idiom for constructing "~user" paths is created +; (setq user-init-file +; (paths-construct-path (list (concat "~" init-file-user) +; user-init-directory +; "init.el"))) +; (unless (file-exists-p (expand-file-name user-init-file)) + (setq user-init-file + (paths-construct-path (list (concat "~" init-file-user) + (cond + ((eq system-type 'ms-dos) "_emacs") + (t ".emacs"))))) +; ) + (load user-init-file t t t) +;; This should not be loaded since custom stuff currently goes into .emacs +; (let ((default-custom-file +; (paths-construct-path (list (concat "~" init-file-user) +; user-init-directory +; "options.el"))) +; (when (string= custom-file default-custom-file) +; (load default-custom-file t t))) + (unless inhibit-default-init + (let ((inhibit-startup-message nil)) + ;; Users are supposed to be told their rights. + ;; (Plus how to get help and how to undo.) + ;; Don't you dare turn this off for anyone except yourself. + (load "default" t t))))) ;;; Load user's init file and default ones. (defun load-init-file () @@ -764,14 +669,12 @@ (debug-on-error-initial (if (eq init-file-debug t) 'startup init-file-debug))) (let ((debug-on-error debug-on-error-initial)) - (if (and load-user-init-file-p init-file-debug) - (progn - ;; Do this without a condition-case if the user wants to debug. - (load-user-init-file)) + (if init-file-debug + ;; Do this without a condition-case if the user wants to debug. + (load-user-init-file init-file-user) (condition-case error (progn - (if load-user-init-file-p - (load-user-init-file)) + (load-user-init-file init-file-user) (setq init-file-had-error nil)) (error (message "Error in init file: %s" (error-message-string error)) @@ -864,7 +767,7 @@ (file-count 0) (line nil) (end-of-options nil) - file-p arg tem) + first-file-buffer file-p arg tem) (while command-line-args-left (setq arg (pop command-line-args-left)) (cond @@ -885,14 +788,14 @@ (setq end-of-options t)) (t (setq file-p t))) - + (when file-p (setq file-p nil) (incf file-count) (setq arg (expand-file-name arg dir)) (cond - ((= file-count 1) - (find-file arg)) + ((= file-count 1) (setq first-file-buffer + (progn (find-file arg) (current-buffer)))) (noninteractive (find-file arg)) (t (find-file-other-window arg))) (when line @@ -923,7 +826,7 @@ (setq e (read-key-sequence (let ((p (keymap-prompt map t))) (cond ((symbolp map) - (if p + (if p (format "%s %s " map p) (format "%s " map))) (p) @@ -1002,7 +905,7 @@ (defun startup-center-spaces (glyph) ;; Return the number of spaces to insert in order to center ;; the given glyph (may be a string or a pixmap). - ;; Assume spaces are as wide as avg-pixwidth. + ;; Assume spaces are as wide as avg-pixwidth. ;; Won't be quite right for proportional fonts, but it's the best we can do. ;; Maybe the new redisplay will export something a glyph-width function. ;;; #### Yes, there is a glyph-width function but it isn't quite what @@ -1013,7 +916,7 @@ ;; This function is used in about.el too. (let* ((avg-pixwidth (round (/ (frame-pixel-width) (frame-width)))) (fill-area-width (* avg-pixwidth (- fill-column left-margin))) - (glyph-pixwidth (cond ((stringp glyph) + (glyph-pixwidth (cond ((stringp glyph) (* avg-pixwidth (length glyph))) ;; #### the pixmap option should be removed ;;((pixmapp glyph) @@ -1033,12 +936,12 @@ `( "\ Sun provides support for the WorkShop/XEmacs integration package only. All other XEmacs packages are provided to you \"AS IS\".\n" - ,@(let ((lang (or (getenv "LC_ALL") (getenv "LC_MESSAGES") + ,@(let ((lang (or (getenv "LC_ALL") (getenv "LC_MESSAGES") (getenv "LANG")))) (if (and (not (featurep 'mule)) ;; Already got mule? ;; No Mule support on tty's yet - (not (eq 'tty (console-type))) + (not (eq 'tty (console-type))) lang ;; Non-English locale? (not (string= lang "C")) (not (string-match "^en" lang)) @@ -1050,7 +953,7 @@ XEmacs, by either running the command `xemacs-mule', or by using the X resource `ESERVE*defaultXEmacsPath: xemacs-mule' when starting XEmacs from Sun WorkShop. \n"))))) - ((key describe-no-warranty) + ((key describe-no-warranty) ": "(face (red bold) "XEmacs comes with ABSOLUTELY NO WARRANTY\n")) ((key describe-copying) ": conditions to give out copies of XEmacs\n") @@ -1063,11 +966,11 @@ Copyright (C) 1993-1997 Sun Microsystems, Inc. All Rights Reserved. Copyright (C) 1994-1996 Board of Trustees, University of Illinois Copyright (C) 1995-1996 Ben Wing\n")) - + ((face (blue bold underline) "\nInformation, on-line help:\n\n") "XEmacs comes with plenty of documentation...\n\n" ,@(if (string-match "beta" emacs-version) - `((key describe-beta) + `((key describe-beta) ": " (face (red bold) "This is an Experimental version of XEmacs.\n")) `( "\n")) @@ -1096,7 +999,7 @@ ; "If non-nil, function called to provide the startup logo. ;This function should return an initialized glyph if it is used.") -;; This will hopefully go away when gettext is functional. +;; This will hopefully go away when gettext is functionnal. (defconst splash-frame-static-body `(,(emacs-version) "\n\n" (face italic "`C-' means the control key,`M-' means the meta key\n\n"))) @@ -1117,7 +1020,7 @@ (1+ indice ))) ))) -;; #### This function now returns the (possibly nil) timeout circulating the +;; ### This function now returns the (possibly nil) timeout circulating the ;; splash-frame elements (defun display-splash-frame () (let ((logo xemacs-logo) @@ -1166,8 +1069,7 @@ ;; don't let /tmp_mnt/... get into the load-path or exec-path. (abbreviate-file-name invocation-directory))) -(defun startup-setup-paths (roots user-init-directory - &optional +(defun startup-setup-paths (roots &optional inhibit-early-packages inhibit-site-lisp debug-paths) "Setup all the various paths. @@ -1182,9 +1084,7 @@ early)) (setq late-packages late) (setq last-packages last)) - (packages-find-packages - roots - (packages-compute-package-locations user-init-directory))) + (packages-find-packages roots)) (setq early-package-load-path (packages-find-package-load-path early-packages)) (setq late-package-load-path (packages-find-package-load-path late-packages)) @@ -1228,11 +1128,23 @@ (paths-construct-info-path roots early-packages late-packages last-packages)) - + (if debug-paths (princ (format "Info-directory-list:\n%S\n" Info-directory-list) 'external-debugging-output)) + (if (boundp 'lock-directory) + (progn + (setq lock-directory (paths-find-lock-directory roots)) + (setq superlock-file (paths-find-superlock-file lock-directory)) + + (if debug-paths + (progn + (princ (format "lock-directory:\n%S\n" lock-directory) + 'external-debugging-output) + (princ (format "superlock-file:\n%S\n" superlock-file) + 'external-debugging-output))))) + (setq exec-directory (paths-find-exec-directory roots)) (if debug-paths @@ -1246,7 +1158,7 @@ (if debug-paths (princ (format "exec-path:\n%S\n" exec-path) 'external-debugging-output)) - + (setq doc-directory (paths-find-doc-directory roots)) (if debug-paths @@ -1280,15 +1192,20 @@ (princ (buffer-string) 'external-debugging-output))) (defun startup-setup-paths-warning () - (let ((warnings '())) + (let ((lock (if (boundp 'lock-directory) lock-directory 't)) + (warnings '())) + (if (and (stringp lock) (null (file-directory-p lock))) + (setq lock nil)) (cond ((null (and lisp-directory exec-directory data-directory doc-directory - load-path)) + load-path + lock)) (save-excursion (set-buffer (get-buffer-create " *warning-tmp*")) (erase-buffer) (buffer-disable-undo (current-buffer)) (if (null lisp-directory) (push "lisp-directory" warnings)) + (if (null lock) (push "lock-directory" warnings)) (if (null exec-directory) (push "exec-directory" warnings)) (if (null data-directory) (push "data-directory" warnings)) (if (null doc-directory) (push "doc-directory" warnings))