X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Fstartup.el;h=26cc29935de961eea1ce9fe7fa53d4485e8d32bc;hb=02f6299e149f2fbedd2b39392e115d5122b8577f;hp=e3473aa98e47ae87cd9f7b59eef83c384f405e93;hpb=59eec5f21669e81977b5b1fe9bf717cab49cf7fb;p=chise%2Fxemacs-chise.git.1 diff --git a/lisp/startup.el b/lisp/startup.el index e3473aa..26cc299 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -77,9 +77,9 @@ The frame system uses this to open frames to display messages while XEmacs loads the user's initialization file.") (defvar after-init-hook nil - "*Functions to call after loading the init file (`.emacs'). + "*Functions to call after loading the init file. The call is not protected by a condition-case, so you can set `debug-on-error' -in `.emacs', and put all the actual code on `after-init-hook'.") +in the init file, and put all the actual code on `after-init-hook'.") (defvar term-setup-hook nil "*Functions to be called after loading terminal-specific Lisp code. @@ -136,7 +136,7 @@ Otherwise, XEmacs will offer migration to the init directory.") ;; #### called `site-run-file' in FSFmacs -(defvar site-start-file (purecopy "site-start") +(defvar site-start-file "site-start" "File containing site-wide run-time initializations. This file is loaded at run-time before `.emacs'. It contains inits that need to be in place for the entire site, but @@ -171,11 +171,6 @@ after your init file is read, in case it sets `mail-host-address'." :type 'string :group 'mail) -(defvar auto-save-list-file-prefix "~/.saves-" - "Prefix for generating auto-save-list-file-name. -Emacs's pid and the system name will be appended to -this prefix to create a unique file name.") - (defvar init-file-debug nil) (defvar init-file-had-error nil) @@ -190,23 +185,22 @@ after, and will not be true at any time before.") (defvar command-switch-alist - (purecopy - '(("-help" . command-line-do-help) - ("-version". command-line-do-version) - ("-V" . command-line-do-version) - ("-funcall". command-line-do-funcall) - ("-f" . command-line-do-funcall) - ("-e" . command-line-do-funcall-1) - ("-eval" . command-line-do-eval) - ("-load" . command-line-do-load) - ("-l" . command-line-do-load) - ("-insert" . command-line-do-insert) - ("-i" . command-line-do-insert) - ("-kill" . command-line-do-kill) - ;; Options like +35 are handled specially. - ;; Window-system, site, or package-specific code might add to this. - ;; X11 handles its options by letting Xt remove args from this list. - )) + '(("-help" . command-line-do-help) + ("-version". command-line-do-version) + ("-V" . command-line-do-version) + ("-funcall". command-line-do-funcall) + ("-f" . command-line-do-funcall) + ("-e" . command-line-do-funcall-1) + ("-eval" . command-line-do-eval) + ("-load" . command-line-do-load) + ("-l" . command-line-do-load) + ("-insert" . command-line-do-insert) + ("-i" . command-line-do-insert) + ("-kill" . command-line-do-kill) + ;; Options like +35 are handled specially. + ;; Window-system, site, or package-specific code might add to this. + ;; X11 handles its options by letting Xt remove args from this list. + ) "Alist of command-line switches. Elements look like (SWITCH-STRING . HANDLER-FUNCTION). HANDLER-FUNCTION receives switch name as sole arg; @@ -233,6 +227,9 @@ command line options plus the following: In addition, the") "The")) (princ " following options are accepted: + -sd Show dump ID. Ignored when configured without --pdump. + -nd Don't load the dump file. Roughly like old temacs. + Ignored when configured without --pdump. -t Use TTY instead of the terminal for input and output. This implies the -nw option. -nw Inhibit the use of any window-system-specific @@ -241,17 +238,15 @@ In addition, the") -debug-init Enter the debugger if an error in the init file occurs. -unmapped Do not map the initial frame. -no-site-file Do not load the site-specific init file (site-start.el). - -no-init-file Do not load the user-specific init file (~/.emacs). + -no-init-file Do not load the user-specific init file. -no-early-packages Do not process early packages. -no-autoloads Do not load global symbol files (auto-autoloads) at startup. Also implies `-vanilla'. -vanilla Equivalent to -q -no-site-file -no-early-packages. -q Same as -no-init-file. -user-init-file Use as init file. - -user-init-directory use as init directory. + -user-init-directory Use as init directory. -user Load user's init file instead of your own. - Equivalent to -user-init-file ~/.emacs - -user-init-directory ~/.xemacs/ -u Same as -user.\n") (let ((l command-switch-alist) (insert (lambda (&rest x) @@ -418,18 +413,23 @@ Type ^H^H^H (Control-h Control-h Control-h) to get more help options.\n") '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)) + (startup-find-roots-warning)) + (startup-setup-paths emacs-roots + user-init-directory + inhibit-early-packages + inhibit-site-lisp + debug-paths) (startup-setup-paths-warning)) - (if (and (not inhibit-autoloads) - lisp-directory) - (load (expand-file-name (file-name-sans-extension autoload-file-name) - lisp-directory) nil t)) + (when (and (not inhibit-autoloads) + lisp-directory) + (load (expand-file-name (file-name-sans-extension autoload-file-name) + lisp-directory) nil t) + (if (featurep 'utf-2000) + (load (expand-file-name + (file-name-sans-extension autoload-file-name) + (expand-file-name "utf-2000" lisp-directory)) + nil t))) (if (not inhibit-autoloads) (progn @@ -438,23 +438,27 @@ Type ^H^H^H (Control-h Control-h Control-h) to get more help options.\n") (packages-load-package-auto-autoloads late-package-load-path) (packages-load-package-auto-autoloads last-package-load-path))) - (unwind-protect - (command-line) - ;; Do this again, in case .emacs defined more abbreviations. + (let (error-data) + (condition-case data + (command-line) + ;; catch non-error signals, especially quit + (t (setq error-data data))) + ;; Do this again, in case the init file defined more abbreviations. (setq default-directory (abbreviate-file-name default-directory)) ;; Specify the file for recording all the auto save files of ;; this session. This is used by recover-session. - (setq auto-save-list-file-name - (expand-file-name - (format "%s%d-%s" - auto-save-list-file-prefix - (emacs-pid) - (system-name)))) + (if auto-save-list-file-prefix + (setq auto-save-list-file-name + (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)) (setq term-setup-hook nil) - ;; ;; Modify the initial frame based on what .emacs puts into + ;; ;; Modify the initial frame based on what the init file puts into ;; ;; ...-frame-alist. (frame-notice-user-settings) ;; ;;####FSFmacs junk @@ -463,28 +467,18 @@ Type ^H^H^H (Control-h Control-h Control-h) to get more help options.\n") ;; (font-menu-add-default)) (when window-setup-hook (run-hooks 'window-setup-hook)) - (setq window-setup-hook nil)) + (setq window-setup-hook nil) + (if error-data + ;; re-signal, and don't allow continuation as that will probably + ;; wipe out the user's .emacs if she hasn't migrated yet! + (signal-error (car error-data) (cdr error-data)))) (if load-user-init-file-p (maybe-migrate-user-init-file)) - ;;####FSFmacs junk - ;; (or menubar-bindings-done - ;; (precompute-menubar-bindings)) + ;; FSF calls precompute-menubar-bindings. We don't mix menubars + ;; and keymaps. )) -;;####FSFmacs junk -;;; Precompute the keyboard equivalents in the menu bar items. -;;(defun precompute-menubar-bindings () -;; (if (eq window-system 'x) -;; (let ((submap (lookup-key global-map [menu-bar]))) -;; (while submap -;; (and (consp (car submap)) -;; (symbolp (car (car submap))) -;; (stringp (car-safe (cdr (car submap)))) -;; (keymapp (cdr (cdr (car submap)))) -;; (x-popup-menu nil (cdr (cdr (car submap))))) -;; (setq submap (cdr submap)))))) - (defun command-line-early (args) ;; This processes those switches which need to be processed before ;; starting up the window system. @@ -569,6 +563,7 @@ Type ^H^H^H (Control-h Control-h Control-h) to get more help options.\n") (push (pop args) new-args))) (t (push arg new-args)))) + ;; obsolete, initialize for backward compatibility (setq init-file-user (and load-user-init-file-p "")) (nreverse new-args))) @@ -595,6 +590,9 @@ If this is nil, no message will be displayed.") ;; handled here instead of down in C. (setq command-line-args-left (command-line-early command-line-args-left)) + (when (eq system-type 'windows-nt) + (init-mswindows-at-startup)) + ;; Setup the toolbar icon directory (when (featurep 'toolbar) (init-toolbar-location)) @@ -707,6 +705,9 @@ After the migration, init.el/init.elc holds user-written initialization code. Moreover the customize settings will be in custom.el. +You can undo the migration at any time with +M-x maybe-unmigrate-user-init-file. + 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.") @@ -714,35 +715,107 @@ perform the migration at any time with M-x migrate-user-init-file.") (yes-or-no-p-minibuf (concat "Migrate init file to " user-init-directory "? ")))) - (migrate-user-init-file) + + (let ((backup (migrate-user-init-file))) + (with-output-to-temp-buffer (help-buffer-name nil) + (progn + (princ "The initialization code has now been migrated to the ") + (princ user-init-directory) + (princ "directory. + +For backwards compatibility with, for example, older versions of XEmacs, +XEmacs can create a special old-style .emacs file in your home +directory which will load the relocated initialization code.") + (if backup + (progn + (princ "\nMoreover, a backup of your old .emacs file was created as\n") + (princ backup) + (princ ".\n"))) + (show-temp-buffer-in-current-frame standard-output) + (maybe-create-compatibility-dot-emacs)))) (customize-save-variable 'load-home-init-file t)))) +(defun maybe-create-compatibility-dot-emacs () + "Ask user if she wants to create a .emacs compatibility file." + (if (yes-or-no-p-minibuf "Create compatibility .emacs? ") + (create-compatibility-dot-emacs))) + (defun migrate-user-init-file () - "Migrate the init file from the home directory." + "Migrate the init file from the home directory. +Return the name of backup file, if one was created." (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.")) + (let* ((backup (concat user-init-file ".backup")) + (backup-p + (and (not (file-exists-p backup)) + (progn + (copy-file user-init-file backup) + t)))) + (customize-set-value 'load-home-init-file nil) + (custom-migrate-custom-file (make-custom-file-name user-init-file + 'force-new)) + (message "Moving init file...") + (let ((new-user-init-file (expand-file-name user-init-file-base + user-init-directory))) + (rename-file user-init-file new-user-init-file) + (setq user-init-file new-user-init-file)) + (message "Migration done.") + (and backup-p backup))) + +(defun create-compatibility-dot-emacs () + "Create .emacs compatibility file for migrated setup." + (message "Creating .emacs compatibility file.") + (with-temp-file (expand-file-name ".emacs" "~") + (insert ";;; XEmacs backwards compatibility file\n") + (insert "(setq user-init-file\n") + (insert " (expand-file-name \"init.el\"\n") + (insert " (expand-file-name \".xemacs\" \"~\")))\n") + (insert "(setq custom-file\n") + (insert " (expand-file-name \"custom.el\"\n") + (insert " (expand-file-name \".xemacs\" \"~\")))\n") + (insert "\n") + (insert "(load-file user-init-file)\n") + (insert "(load-file custom-file)")) + (message "Created .emacs compatibility file.")) + +(defun maybe-unmigrate-user-init-file () + "Possibly unmigrate the user's init and custom files." + (interactive) + (let ((dot-emacs-file-name (expand-file-name ".emacs" "~"))) + (if (and (not load-home-init-file) + (or (not (file-exists-p dot-emacs-file-name)) + (yes-or-no-p-minibuf (concat "Overwrite " dot-emacs-file-name + "? ")))) + (unmigrate-user-init-file dot-emacs-file-name)))) + +(defun unmigrate-user-init-file (&optional target-file-name) + "Unmigrate the user's init and custom files." + (interactive) + (let ((target-file-name + (or target-file-name (expand-file-name ".emacs" "~")))) + (rename-file user-init-file target-file-name 'ok-if-already-exists) + (setq user-init-file target-file-name) + (let ((old-custom-file custom-file)) + (custom-migrate-custom-file target-file-name) + (customize-save-variable 'load-home-init-file t) + (delete-file old-custom-file)))) (defun load-user-init-file () "This function actually reads the init file." (if (not user-init-file) (setq user-init-file (find-user-init-file user-init-directory))) + (if (not custom-file) + (setq custom-file (make-custom-file-name user-init-file))) + ;; #### should test load-user-init-file-p here, not in load-init-file + ;; see comment there (if (and user-init-file (file-readable-p user-init-file)) (load user-init-file t t t)) - (if (not custom-file) - (setq custom-file (make-custom-file-name user-init-file))) (if (and custom-file (or (not user-init-file) (not (string= custom-file user-init-file))) @@ -774,12 +847,15 @@ perform the migration at any time with M-x migrate-user-init-file.") (debug-on-error-initial (if (eq init-file-debug t) 'startup init-file-debug))) (let ((debug-on-error debug-on-error-initial)) + ;; #### I believe this test is incorrect, it leads to custom-file + ;; (at least) being undefined (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)) (condition-case error (progn + ;; #### probably incorrect, see comment above (if load-user-init-file-p (load-user-init-file)) (setq init-file-had-error nil)) @@ -1068,11 +1144,13 @@ XEmacs, by either running the command `xemacs-mule', or by using the X resource ": how to get the latest version\n") "\n--\n" (face italic "\ -Copyright (C) 1985-1999 Free Software Foundation, Inc. +Copyright (C) 1985-2001 Free Software Foundation, Inc. Copyright (C) 1990-1994 Lucid, Inc. 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")) +Copyright (C) 1995-2001 Ben Wing +Copyright (C) 1996-2002 MORIOKA Tomohiko +")) ((face (blue bold underline) "\nInformation, on-line help:\n\n") "XEmacs comes with plenty of documentation...\n\n" @@ -1094,7 +1172,7 @@ Copyright (C) 1995-1996 Ben Wing\n")) ((key about-xemacs) ": see who's developing XEmacs\n")) ((face (blue bold underline) "\nUseful stuff:\n\n") - "Things that you should know rather quickly...\n\n" + "Things that you should learn rather quickly...\n\n" ((key find-file) ": visit a file\n") ((key save-buffer) ": save changes\n") ((key advertised-undo) ": undo changes\n") @@ -1220,6 +1298,28 @@ It's idempotent, so call this as often as you like!" (princ (format "lisp-directory:\n%S\n" lisp-directory) 'external-debugging-output)) + (if (featurep 'mule) + (progn + (setq mule-lisp-directory + (paths-find-mule-lisp-directory roots + lisp-directory)) + (if debug-paths + (princ (format "mule-lisp-directory:\n%S\n" + mule-lisp-directory) + 'external-debugging-output))) + (setq mule-lisp-directory '())) + + (if (featurep 'utf-2000) + (progn + (setq utf-2000-lisp-directory + (paths-find-utf-2000-lisp-directory roots + lisp-directory)) + (if debug-paths + (princ (format "utf-2000-lisp-directory:\n%S\n" + utf-2000-lisp-directory) + 'external-debugging-output))) + (setq utf-2000-lisp-directory '())) + (setq site-directory (and (null inhibit-site-lisp) (paths-find-site-lisp-directory roots))) @@ -1232,7 +1332,9 @@ It's idempotent, so call this as often as you like!" late-package-load-path last-package-load-path lisp-directory - site-directory)) + site-directory + mule-lisp-directory + utf-2000-lisp-directory)) (setq Info-directory-list (paths-construct-info-path roots @@ -1299,6 +1401,12 @@ It's idempotent, so call this as often as you like!" (erase-buffer) (buffer-disable-undo (current-buffer)) (if (null lisp-directory) (push "lisp-directory" warnings)) + (if (and (featurep 'mule) + (null mule-lisp-directory)) + (push "mule-lisp-directory" warnings)) + (if (and (featurep 'utf-2000) + (null utf-2000-lisp-directory)) + (push "utf-2000-lisp-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))