unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Artur Malabarba <bruce.connor.am@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel <emacs-devel@gnu.org>
Subject: Re: Customizable modes and package.el
Date: Sun, 29 Mar 2015 15:48:35 +0100	[thread overview]
Message-ID: <CAAdUY-LiQCQam1=YuR2UrV+YDcN7m1QPL8Oj-HhudPDB6+CvSQ@mail.gmail.com> (raw)
In-Reply-To: <jwv7fu03ldn.fsf-monnier+emacs@gnu.org>

Initial draft

The only thing I'm totally sure on is the `now' parameter. I think
it's not a problem, because it's meant to indicate "set the value
wihout waiting for the defcustom" and not "set the value immediately",
but I don't know its real use-case, so it's hard to say for sure.

diff --git a/lisp/custom.el b/lisp/custom.el
index e5fe0eb..d07f0c0 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -933,6 +933,37 @@ handle SYMBOL properly.
 COMMENT is a comment string about SYMBOL."
   (apply 'custom-theme-set-variables 'user args))

+(defun custom--load-entry (entry &optional requests)
+  "Load custom ENTRY, after requiring all features in REQUESTS.
+Signal a meaningful error if any of the features are absent."
+  ;; Now set the variable.
+  (let* ((now (nth 2 entry))
+         (comment (nth 4 entry))
+         (symbol (indirect-variable (nth 0 entry)))
+         (value (nth 1 entry))
+         set)
+    (dolist (f requests)
+      (unless (require f nil t)
+        (error "Cannot find load file `%s', required by `%s' inside your `%s'"
+               f symbol 'custom-set-variables)))
+    (setq set (or (get symbol 'custom-set) 'custom-set-default))
+    (put symbol 'saved-value (list value))
+    (put symbol 'saved-variable-comment comment)
+    ;; Allow for errors in the case where the setter has
+    ;; changed between versions, say, but let the user know.
+    (condition-case data
+        (cond (now
+               ;; Rogue variable, set it now.
+               (put symbol 'force-value t)
+               (funcall set symbol (eval value)))
+              ((default-boundp symbol)
+               ;; Something already set this, overwrite it.
+               (funcall set symbol (eval value))))
+      (error
+          (message "Error setting %s: %s" symbol data)))
+    (and (or now (default-boundp symbol))
+         (put symbol 'variable-comment comment))))
+
 (defun custom-theme-set-variables (theme &rest args)
   "Initialize variables for theme THEME according to settings in ARGS.
 Each of the arguments in ARGS should be a list of this form:
@@ -972,31 +1003,16 @@ COMMENT is a comment string about SYMBOL."
        (value (nth 1 entry)))
       (custom-push-theme 'theme-value symbol theme 'set value)
       (unless custom--inhibit-theme-enable
-    ;; Now set the variable.
-    (let* ((now (nth 2 entry))
-           (requests (nth 3 entry))
-           (comment (nth 4 entry))
-           set)
-      (when requests
-        (put symbol 'custom-requests requests)
-        (mapc 'require requests))
-      (setq set (or (get symbol 'custom-set) 'custom-set-default))
-      (put symbol 'saved-value (list value))
-      (put symbol 'saved-variable-comment comment)
-      ;; Allow for errors in the case where the setter has
-      ;; changed between versions, say, but let the user know.
-      (condition-case data
-          (cond (now
-             ;; Rogue variable, set it now.
-             (put symbol 'force-value t)
-             (funcall set symbol (eval value)))
-            ((default-boundp symbol)
-             ;; Something already set this, overwrite it.
-             (funcall set symbol (eval value))))
-        (error
-         (message "Error setting %s: %s" symbol data)))
-      (and (or now (default-boundp symbol))
-           (put symbol 'variable-comment comment)))))))
+        (let* ((requests (nth 3 entry)))
+          (when requests
+            (put symbol 'custom-requests requests))
+          ;; If a symbol has requirements, we don't even try to load
+          ;; them now, because we might accidentally load an old
+          ;; built-in instead of a newer installed version.
+          (if requests
+              (add-hook 'after-init-hook
+                        (apply-partially #'custom--load-entry entry requests))
+            (custom--load-entry entry)))))))

 (defvar custom--sort-vars-table)
 (defvar custom--sort-vars-result)



  reply	other threads:[~2015-03-29 14:48 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-28  8:58 Customizable modes and package.el Sebastian Wiesner
2015-03-28  9:30 ` Philipp Stephani
2015-03-28 12:26 ` Stefan Monnier
2015-03-28 14:59   ` Sebastian Wiesner
2015-03-28 17:55     ` Artur Malabarba
2015-03-28 20:42       ` Stefan Monnier
2015-03-29 14:48         ` Artur Malabarba [this message]
2015-03-30  0:41           ` Stefan Monnier
2015-03-30  7:05             ` Artur Malabarba
2015-03-30 13:39               ` Stefan Monnier
2015-03-30 14:31                 ` Artur Malabarba
2015-03-30 14:55                   ` Robert Pluim
2015-03-30 16:07                     ` Artur Malabarba
2015-03-30 17:09                       ` Drew Adams
2015-03-30 17:28                     ` Stefan Monnier
2015-11-08  3:26                       ` David Reitter
2015-11-08  3:43                         ` Kaushal Modi
2015-11-08  4:33                           ` Drew Adams
2015-11-08 10:48                         ` Artur Malabarba
2015-11-08 10:50                           ` Artur Malabarba
2015-03-30 17:45               ` Achim Gratz
2015-04-18  1:52                 ` Ted Zlatanov
2015-04-18  4:30                   ` Stefan Monnier
2015-04-18  4:46                   ` Artur Malabarba
2015-03-30 19:06             ` Artur Malabarba
2015-03-30 20:36               ` Stefan Monnier
2015-03-31 20:14                 ` João Távora
  -- strict thread matches above, loose matches on Subject: below --
2015-04-18  8:36 Richard Y. Kim

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

  List information: https://www.gnu.org/software/emacs/

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

  git send-email \
    --in-reply-to='CAAdUY-LiQCQam1=YuR2UrV+YDcN7m1QPL8Oj-HhudPDB6+CvSQ@mail.gmail.com' \
    --to=bruce.connor.am@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    /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 public inbox

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).