all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* [PATCH] Setting user-emacs-directory
@ 2015-03-23 23:25 François Févotte
  2015-04-01 15:24 ` François Févotte
  2015-04-01 15:24 ` François Févotte
  0 siblings, 2 replies; 20+ messages in thread
From: François Févotte @ 2015-03-23 23:25 UTC (permalink / raw)
  To: emacs-devel

[-- 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


^ permalink raw reply related	[flat|nested] 20+ messages in thread
* bug#15539: 24.3; setting user-emacs-directory at command line invocation
@ 2013-10-06 17:08 Mike Carifio
  2016-02-15 10:31 ` bug#15539: [PATCH] Setting user-emacs-directory Alexis
  0 siblings, 1 reply; 20+ messages in thread
From: Mike Carifio @ 2013-10-06 17:08 UTC (permalink / raw)
  To: 15539


-----------------------

I'd like a switch for the emacs command line, something like
--user-emacs-directory, that sets the user emacs directory on startup,
rather than hardcodes ~/.emacs.d/. So, for example:

  emacs --user-emacs-directory ~/mine.d/

Will look for the emacs init.el in ~/mine.d/init.el.

-----------------------




In GNU Emacs 24.3.1 (x86_64-pc-linux-gnu, GTK+ Version 3.6.4)
 of 2013-10-03 on louvi, modified by Debian
Windowing system distributor `The X.Org Foundation', version 11.0.11303000
System Description:	Ubuntu 13.04

Configured using:
 `configure '--build' 'x86_64-linux-gnu' '--build' 'x86_64-linux-gnu'
 '--prefix=/usr' '--sharedstatedir=/var/lib' '--libexecdir=/usr/lib'
 '--localstatedir=/var/lib' '--infodir=/usr/share/info'
 '--mandir=/usr/share/man' '--with-pop=yes'
 '--enable-locallisppath=/etc/emacs24:/etc/emacs:/usr/local/share/emacs/24.3/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/24.3/site-lisp:/usr/share/emacs/site-lisp'
 '--with-crt-dir=/usr/lib/x86_64-linux-gnu' '--with-x=yes'
 '--with-x-toolkit=gtk3' '--with-toolkit-scroll-bars'
 'build_alias=x86_64-linux-gnu' 'CFLAGS=-g -O2 -fstack-protector
 --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall'
 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro'
 'CPPFLAGS=-D_FORTIFY_SOURCE=2''

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix
  default enable-multibyte-characters: t

Major mode: Lisp Interaction

Minor modes in effect:
  global-auto-complete-mode: t
  auto-complete-mode: t
  cua-mode: t
  tooltip-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
<help-echo> C-h v c o m m a n d l <backspace> - l i 
n e - a r g <tab> <return> ESC x r e p o r t - e m 
<tab> <return>

Recent messages:
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...done
Loading debian-ispell...done
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...done
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...done
Loading /etc/emacs/site-start.d/50python-docutils.el (source)...done
Loading /home/mcarifio/.emacs.d/lib/libemacs.el (source)...done
(lambda (a b) ...) quoted with ' rather than with #'
For information about GNU Emacs and the GNU system, type C-h C-a.
command-line-1: Unknown option `--user-emacs-directory'
Type C-x 1 to delete the help window.

Load-path shadows:
/usr/share/emacs/24.3/site-lisp/debian-startup hides /usr/share/emacs/site-lisp/debian-startup
/usr/share/emacs/24.3/site-lisp/cmake-data/cmake-mode hides /usr/share/emacs/site-lisp/cmake-mode
/usr/share/emacs24/site-lisp/dictionaries-common/flyspell hides /usr/share/emacs/24.3/lisp/textmodes/flyspell
/usr/share/emacs/site-lisp/rst hides /usr/share/emacs/24.3/lisp/textmodes/rst
/usr/share/emacs24/site-lisp/dictionaries-common/ispell hides /usr/share/emacs/24.3/lisp/textmodes/ispell
/home/mcarifio/.emacs.d/elpa/flymake-0.4.13/flymake hides /usr/share/emacs/24.3/lisp/progmodes/flymake
/home/mcarifio/.emacs.d/elpa/sunrise-commander-20121024.2042/.dir-locals hides /usr/share/emacs/24.3/lisp/gnus/.dir-locals

Features:
(shadow sort gnus-util mail-extr emacsbug message format-spec rfc822 mml
mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev
gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util
mail-prsvr mail-utils help-mode easymenu auto-complete-config
go-autocomplete auto-complete edmacro kmacro popup
auto-complete-autoloads flymake-go-autoloads flymake-autoloads
flymake-jshint-autoloads gist-autoloads gh-autoloads eieio byte-opt
bytecomp byte-compile cconv go-mode-autoloads
graphviz-dot-mode-autoloads js-comint-autoloads js2-mode-autoloads
logito-autoloads multi-term-autoloads nginx-mode-autoloads
nose-autoloads pcache-autoloads finder-inf popup-autoloads
sunrise-commander-autoloads package uniquify advice help-fns
advice-preload cl-macs gv cl cl-lib cua-base devhelp time-date tooltip
ediff-hook vc-hooks lisp-float-type mwheel x-win x-dnd tool-bar dnd
fontset image regexp-opt fringe tabulated-list newcomment lisp-mode
register page menu-bar rfn-eshadow timer select scroll-bar mouse
jit-lock font-lock syntax facemenu font-core frame cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese hebrew greek romanian slovak czech european ethiopic indian
cyrillic chinese case-table epa-hook jka-cmpr-hook help simple abbrev
minibuffer loaddefs button faces cus-face macroexp files text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote make-network-process dbusbind
dynamic-setting system-font-setting font-render-setting move-toolbar gtk
x-toolkit x multi-tty emacs)





^ permalink raw reply	[flat|nested] 20+ messages in thread
* bug#583: Use XDG basedir spec for configuration files?
@ 2008-07-21  6:59 Fernando
  2019-08-27 21:57 ` Paul Eggert
  0 siblings, 1 reply; 20+ messages in thread
From: Fernando @ 2008-07-21  6:59 UTC (permalink / raw)
  To: bug-gnu-emacs

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

The XDG Base Directory
Specification<http://standards.freedesktop.org/basedir-spec/>provides
some common paths in user's home to store personal application
configurations, or, using their own words "*defines where these files should
be looked for by defining one or more base directories relative to which
files should be located*".

XDG Base Directory Specification allows efficient backup, in which you can
easily choose to backup your data and/or your configuration files for
instance. An application could easily propose such backup for the whole
system if all applications were matching these specification.

Therefore, although I think that this bug/enhancement is not vital, it would
be great for Emacs to be "FreeDesktop XDG Base Directory Specification"
compliant.

Currently Emacs is using "$HOME/.emacs.d/". This is what XDG basedir spec
defines:

   - $XDG_DATA_HOME (usually $HOME/.local/share/) as "*the base directory
   relative to which user specific data files should be stored*"
   - $XDG_CONFIG_HOME (usually $HOME/.config/) as "*the base directory
   relative to which user specific configuration files should be stored*"
   - $XDG_CACHE_HOME (usually $HOME/.cache/) as "*the base directory
   relative to which user specific non-essential data files should be stored
   *"

(http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html)

In order to make Emacs XDG basedir compliant, I think that it would be nice
to use:

   - $XDG_CONFIG_HOME/emacs  ;;for "init.el" and storing customize
   configuration


   - $XDG_DATA_HOME/emacs  ;;for sessions and backups


   - $XDG_CACHE_HOME/emacs  ;;for cache files

Or maybe some other distribution. What do you think about it?

There's a small C library that may be useful check it out, written for the
sole purpose of xdg basedir spec compliance:
https://n.ethz.ch/student/nevillm/download/libxdg-basedir/

[-- Attachment #2: Type: text/html, Size: 3214 bytes --]

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2020-08-13 11:06 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-23 23:25 [PATCH] Setting user-emacs-directory François Févotte
2015-04-01 15:24 ` 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     ` Drew Adams
2015-04-01 16:48     ` bug#15539: " 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
  -- strict thread matches above, loose matches on Subject: below --
2013-10-06 17:08 bug#15539: 24.3; setting user-emacs-directory at command line invocation Mike Carifio
2016-02-15 10:31 ` bug#15539: [PATCH] Setting user-emacs-directory Alexis
2016-02-15 14:15   ` Eli Zaretskii
2016-02-24  4:03     ` Lars Ingebrigtsen
2016-02-24 17:15       ` Eli Zaretskii
2016-02-25  5:48         ` Lars Ingebrigtsen
2008-07-21  6:59 bug#583: Use XDG basedir spec for configuration files? Fernando
2019-08-27 21:57 ` Paul Eggert
2019-08-28 16:11   ` Glenn Morris
2019-08-28 18:11     ` Paul Eggert
2019-08-29  2:14       ` Glenn Morris
2019-08-29  6:22         ` Paul Eggert
2019-08-29 18:30           ` Glenn Morris
2019-08-30  8:02             ` Paul Eggert
2019-08-30 16:18               ` Glenn Morris
2019-09-01  1:56                 ` bug#15539: [PATCH] Setting user-emacs-directory Paul Eggert
2019-09-02 23:45                   ` Glenn Morris
2019-09-03  6:29                     ` Paul Eggert
2019-09-08 14:54                       ` Mike Carifio
2020-08-13 11:06                       ` Lars Ingebrigtsen

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.