From f98d2af08d2346121556f4fd91628dc0316cbff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20F=C3=A9votte?= Date: Tue, 17 Mar 2015 08:50:01 +0100 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 | 21 +++++++++++++++++---- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi index 42c8e33..1cc8ac3 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 @@ -600,6 +602,11 @@ does not use @env{TZ} at all. @item USER 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 Used to initialize the @code{version-control} variable (@pxref{Backup Names}). 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..2b2c324 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 ((ued (getenv "EMACS_USER_DIRECTORY"))) + (when ued + (setq user-emacs-directory (file-name-as-directory ued)))) + ;;! 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. @@ -1101,11 +1108,15 @@ please check its value") delayed-warnings-list) "~/_emacs") (t ;; But default to .emacs if _emacs does not exist. - "~/.emacs")))) + "~/.emacs"))) + (user-emacs-directory--from-env (getenv "EMACS_USER_DIRECTORY"))) ;; 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 +1125,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, -- 1.7.2.5