From e15fd3120a995e38708ca73d293973dd8e596b22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20F=C3=A9votte?= Date: Thu, 2 Apr 2015 09:17:03 +0200 Subject: [PATCH] Look for an `EMACS_USER_DIRECTORY' environment variable. This sets `user-emacs-directory' and looks for `init.el' in it. Fixes: bug#15539 --- doc/emacs/cmdargs.texi | 9 ++++++++- doc/emacs/custom.texi | 8 ++++++++ lisp/custom.el | 1 + lisp/startup.el | 20 ++++++++++++++++---- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi index 071cd68..30d3472 100644 --- a/doc/emacs/cmdargs.texi +++ b/doc/emacs/cmdargs.texi @@ -349,7 +349,9 @@ Do not reload any saved desktop. @xref{Saving Emacs Sessions}. @opindex --user @cindex load init file of another user Load @var{user}'s initialization file instead of your -own@footnote{This option has no effect on MS-Windows.}. +own@footnote{This option has no effect on MS-Windows, nor when the +@env{EMACS_USER_DIRECTORY} environment variable is set (@pxref{General +Variables}).}. @item --debug-init @opindex --debug-init @@ -642,6 +644,11 @@ does not use @env{TZ} at all. @vindex USER, environment variable The user's login name. See also @env{LOGNAME}. On MS-DOS, this defaults to @samp{root}. +@item EMACS_USER_DIRECTORY +This specifies a directory in which the initialization file will be +looked for; @xref{Find Init}. This directory will also be used as the +default place where user-specific configuration data will be stored; +@xref{Standard File Names,,, elisp}. @item VERSION_CONTROL @vindex VERSION_CONTROL, environment variable Used to initialize the @code{version-control} variable (@pxref{Backup diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi index 9fd823b..1e1d482 100644 --- a/doc/emacs/custom.texi +++ b/doc/emacs/custom.texi @@ -2516,6 +2516,14 @@ otherwise, it looks up the home directory corresponding to that user name in the system's data base of users. @c LocalWords: backtab + The whole mechanism described above is bypassed if the +@env{EMACS_USER_DIRECTORY} environment variable is specified, in which +case Emacs directly looks for @file{init.el} inside the directory +specified by @env{EMACS_USER_DIRECTORY} (@pxref{General Variables}). +This directory is also used to hold user-specific configuration +(@pxref{Standard File Names,,, elisp}). + + @node Init Non-ASCII @subsection Non-@acronym{ASCII} Characters in Init Files @cindex international characters in @file{.emacs} diff --git a/lisp/custom.el b/lisp/custom.el index e5fe0eb..36983aa 100644 --- a/lisp/custom.el +++ b/lisp/custom.el @@ -1119,6 +1119,7 @@ directory. By default, Emacs searches for custom themes in this directory first---see `custom-theme-load-path'." :type 'string :group 'customize + :initialize 'custom-initialize-delay :version "22.1") (defcustom custom-theme-load-path (list 'custom-theme-directory t) diff --git a/lisp/startup.el b/lisp/startup.el index 7fa929a..1c403c6 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -397,7 +397,8 @@ 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) + :group 'auto-save + :initialize 'custom-initialize-delay) (defvar emacs-basic-display nil) @@ -814,6 +815,12 @@ Amongst another things, it parses the command-line arguments." ((member vc '("never" "simple")) (setq version-control 'never)))) + ;; Set `user-emacs-directory' early so that delayed init variables + ;; can be updated. + (let ((user-emacs-directory--from-env (getenv "EMACS_USER_DIRECTORY"))) + (when user-emacs-directory--from-env + (setq user-emacs-directory (file-name-as-directory user-emacs-directory--from-env))) + ;;! This has been commented out; I currently find the behavior when ;;! split-window-keep-point is nil disturbing, but if I can get used ;;! to it, then it would be better to eliminate the option. @@ -1105,7 +1112,10 @@ please check its value") ;; This tells `load' to store the file name found ;; into user-init-file. (setq user-init-file t) - (load user-init-file-1 t t) + + ;; Don't load `~/.emacs' if EMACS_USER_DIRECTORY was set + (unless user-emacs-directory--from-env + (load user-init-file-1 t t)) (when (eq user-init-file t) ;; If we did not find ~/.emacs, try @@ -1114,7 +1124,9 @@ please check its value") (expand-file-name "init" (file-name-as-directory - (concat "~" init-file-user "/.emacs.d"))))) + (if user-emacs-directory--from-env + user-emacs-directory + (concat "~" init-file-user "/.emacs.d")))))) (load otherfile t t) ;; If we did not find the user's init file, @@ -1227,7 +1239,7 @@ the `--debug-init' option to view a complete error backtrace." ;; be realized. (unless (and (eq scalable-fonts-allowed old-scalable-fonts-allowed) (eq face-ignored-fonts old-face-ignored-fonts)) - (clear-face-cache))) + (clear-face-cache)))) ;; If any package directory exists, initialize the package system. (and user-init-file -- 1.7.2.5