summary refs log tree commit diff
path: root/emacs/guix-base.el
diff options
context:
space:
mode:
authorAlex Kost <alezost@gmail.com>2015-11-18 22:28:13 +0300
committerAlex Kost <alezost@gmail.com>2016-01-02 17:25:35 +0300
commit4ba476f94992247cd54541ac09b0a516660f20e5 (patch)
treefc7fbed8d2aef413850f469fe96710d775942404 /emacs/guix-base.el
parent376af769f9cad7f521611c230d192ac639159fda (diff)
downloadguix-4ba476f94992247cd54541ac09b0a516660f20e5.tar.gz
emacs: Add 'guix-keyword-args-let'.
* emacs/guix-utils.el (guix-keyword-args-let): New macro.
  (guix-utils-font-lock-keywords): Add it.
* emacs/guix-base.el (guix-define-buffer-type): Use it.
* emacs/guix-list.el (guix-list-define-entry-type): Use it.
* emacs/guix-read.el (guix-define-readers): Use it.
Diffstat (limited to 'emacs/guix-base.el')
-rw-r--r--emacs/guix-base.el106
1 files changed, 49 insertions, 57 deletions
diff --git a/emacs/guix-base.el b/emacs/guix-base.el
index 91b52db188..f55e1c67e0 100644
--- a/emacs/guix-base.el
+++ b/emacs/guix-base.el
@@ -382,63 +382,55 @@ following keywords are available:
          (buf-name-var   (intern (concat prefix "-buffer-name")))
          (revert-var     (intern (concat prefix "-revert-no-confirm")))
          (history-var    (intern (concat prefix "-history-size")))
-         (params-var     (intern (concat prefix "-required-params")))
-         (buf-name-val   (format "*Guix %s %s*" Entry-type-str Buf-type-str))
-         (revert-val     nil)
-         (history-val    20)
-         (params-val     '(id)))
-
-    ;; Process the keyword args.
-    (while (keywordp (car args))
-      (pcase (pop args)
-	(`:required     (setq params-val (pop args)))
-	(`:history-size (setq history-val (pop args)))
-	(`:revert       (setq revert-val (pop args)))
-        (`:buffer-name  (setq buf-name-val (pop args)))
-	(_ (pop args))))
-
-    `(progn
-       (defgroup ,group nil
-         ,(concat Buf-type-str " buffer with " entry-str ".")
-         :prefix ,(concat prefix "-")
-         :group ',(intern (concat "guix-" buf-type-str)))
-
-       (defgroup ,faces-group nil
-         ,(concat "Faces for " buf-type-str " buffer with " entry-str ".")
-         :group ',(intern (concat "guix-" buf-type-str "-faces")))
-
-       (defcustom ,buf-name-var ,buf-name-val
-         ,(concat "Default name of the " buf-str " for displaying " entry-str ".")
-         :type 'string
-         :group ',group)
-
-       (defcustom ,history-var ,history-val
-         ,(concat "Maximum number of items saved in the history of the " buf-str ".\n"
-                  "If 0, the history is disabled.")
-         :type 'integer
-         :group ',group)
-
-       (defcustom ,revert-var ,revert-val
-         ,(concat "If non-nil, do not ask to confirm for reverting the " buf-str ".")
-         :type 'boolean
-         :group ',group)
-
-       (defvar ,params-var ',params-val
-         ,(concat "List of required " entry-type-str " parameters.\n\n"
-                  "Displayed parameters and parameters from this list are received\n"
-                  "for each " entry-type-str ".\n\n"
-                  "May be a special value `all', in which case all supported\n"
-                  "parameters are received (this may be very slow for a big number\n"
-                  "of entries).\n\n"
-                  "Do not remove `id' from this list as it is required for\n"
-                  "identifying an entry."))
-
-       (define-derived-mode ,mode ,parent-mode ,(concat "Guix-" Buf-type-str)
-         ,(concat "Major mode for displaying information about " entry-str ".\n\n"
-                  "\\{" mode-map-str "}")
-         (setq-local revert-buffer-function 'guix-revert-buffer)
-         (setq-local guix-history-size ,history-var)
-         (and (fboundp ',mode-init-fun) (,mode-init-fun))))))
+         (params-var     (intern (concat prefix "-required-params"))))
+    (guix-keyword-args-let args
+        ((params-val :required '(id))
+         (history-val :history-size 20)
+         (revert-val :revert)
+         (buf-name-val :buffer-name
+                       (format "*Guix %s %s*" Entry-type-str Buf-type-str)))
+      `(progn
+         (defgroup ,group nil
+           ,(concat Buf-type-str " buffer with " entry-str ".")
+           :prefix ,(concat prefix "-")
+           :group ',(intern (concat "guix-" buf-type-str)))
+
+         (defgroup ,faces-group nil
+           ,(concat "Faces for " buf-type-str " buffer with " entry-str ".")
+           :group ',(intern (concat "guix-" buf-type-str "-faces")))
+
+         (defcustom ,buf-name-var ,buf-name-val
+           ,(concat "Default name of the " buf-str " for displaying " entry-str ".")
+           :type 'string
+           :group ',group)
+
+         (defcustom ,history-var ,history-val
+           ,(concat "Maximum number of items saved in the history of the " buf-str ".\n"
+                    "If 0, the history is disabled.")
+           :type 'integer
+           :group ',group)
+
+         (defcustom ,revert-var ,revert-val
+           ,(concat "If non-nil, do not ask to confirm for reverting the " buf-str ".")
+           :type 'boolean
+           :group ',group)
+
+         (defvar ,params-var ',params-val
+           ,(concat "List of required " entry-type-str " parameters.\n\n"
+                    "Displayed parameters and parameters from this list are received\n"
+                    "for each " entry-type-str ".\n\n"
+                    "May be a special value `all', in which case all supported\n"
+                    "parameters are received (this may be very slow for a big number\n"
+                    "of entries).\n\n"
+                    "Do not remove `id' from this list as it is required for\n"
+                    "identifying an entry."))
+
+         (define-derived-mode ,mode ,parent-mode ,(concat "Guix-" Buf-type-str)
+           ,(concat "Major mode for displaying information about " entry-str ".\n\n"
+                    "\\{" mode-map-str "}")
+           (setq-local revert-buffer-function 'guix-revert-buffer)
+           (setq-local guix-history-size ,history-var)
+           (and (fboundp ',mode-init-fun) (,mode-init-fun)))))))
 
 (put 'guix-define-buffer-type 'lisp-indent-function 'defun)