all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "François Févotte" <fevotte@gmail.com>
To: emacs-devel@gnu.org
Subject: [PATCH] Setting user-emacs-directory
Date: Tue, 24 Mar 2015 00:25:16 +0100	[thread overview]
Message-ID: <CAADsv94GP0tVZtsS0na6RWtOc+WpDDAYDZqw299hw6j5Rq8sUw@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1407 bytes --]

Hello emacs-devel,

below is a patch trying to address old bug #15539.

It introduces an EMACS_USER_DIRECTORY environment variable which (if
present) has two effects:
1- it provides a custom value for `user-emacs-directory' (instead of
the default `~/.emacs.d').
2- it instructs emacs to look for the initialization file in the
provided directory (instead of `~USER/.emacs.d')

As explained in the bug's discussion, this covers more use cases than
simply symlinking ~/.emacs.d. Here are for example a few words about
my use case: at work, I try to maintain a sensible set of init files
for my co-workers to use (with the very outdated default version that
we have installed by default on our systems: 23.2). On the other hand,
on my machine, I maintain a locally-installed Emacs version that is
more up-to-date. In order to maintain both sets of init files, I need
to be able to run
both versions of Emacs at the same time, which prevents me from
symlinking ~/.emacs.d/
There are also reddit[1] and stackexchange[2] questions hinting at the
same kind of use.

Please do not hesitate to comment and criticize the patch; this is my
first time and I might very well have overlooked some details.

Thanks in advance,
   François


[1] http://www.reddit.com/r/emacs/comments/2y1b3a/how_can_i_easily_keep_different_emacsd_folders/

[2] http://emacs.stackexchange.com/q/4253/221

[-- Attachment #2: 0001-Look-for-an-EMACS_USER_DIRECTORY-environment-variabl.patch --]
[-- Type: text/x-patch, Size: 5189 bytes --]

From f98d2af08d2346121556f4fd91628dc0316cbff0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20F=C3=A9votte?= <francois.fevotte@ensta.org>
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


             reply	other threads:[~2015-03-23 23:25 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-23 23:25 François Févotte [this message]
2015-04-01 15:24 ` [PATCH] Setting user-emacs-directory François Févotte
2015-04-01 15:38   ` bug#15539: " Oleh Krehel
2015-04-01 15:49     ` Drew Adams
2015-04-01 15:49     ` bug#15539: " Drew Adams
2015-04-01 16:48     ` Oleh Krehel
2015-04-01 17:16       ` François Févotte
2015-04-01 21:03         ` Stefan Monnier
2015-04-02  8:12           ` François Févotte
2015-04-01 15:24 ` François Févotte

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAADsv94GP0tVZtsS0na6RWtOc+WpDDAYDZqw299hw6j5Rq8sUw@mail.gmail.com \
    --to=fevotte@gmail.com \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.