summary refs log tree commit diff
path: root/emacs/guix-list.el
diff options
context:
space:
mode:
authorAlex Kost <alezost@gmail.com>2015-11-20 12:38:31 +0300
committerAlex Kost <alezost@gmail.com>2016-01-02 17:25:35 +0300
commit7735c503b5b8dfe7d8963207f4f2cf0b7dfd3894 (patch)
treeabff13562165160b51938a84a7f93ab32c39f329 /emacs/guix-list.el
parent2c7ed388cf403120c17b5e222ac5dda093f5ad94 (diff)
downloadguix-7735c503b5b8dfe7d8963207f4f2cf0b7dfd3894.tar.gz
emacs: Factorize macros for defining interfaces.
Make a root 'guix-buffer-define-interface' macro.  It should generate a
common code for any type of interface.  Inherit 'guix-info-define-interface'
and 'guix-list-define-interface' from it.  They should provide a general
'info'/'list' interface for any data.  Finally, make
'guix-ui-define-interface' for the common code for interfaces to Guix
packages and generations, and inherit 'guix-ui-info-define-interface' and
'guix-ui-list-define-interface' from it.

* emacs/guix-base.el (guix-define-buffer-type): Rename to...
  (guix-buffer-define-interface): ... this.  Rename internal
  variables ('buf-' -> 'buffer-').  Move ':required' keyword to
  'guix-ui-define-interface'.
* emacs/guix-info.el (guix-info-define-interface): New macro.
  (guix-info-font-lock-keywords): New variable.
* emacs/guix-list.el (guix-list-define-entry-type): Rename to...
  (guix-list-define-interface): ... this.
  (guix-list-font-lock-keywords): New variable.
  (guix-list-describe-ids): Move and rename to...
* emacs/guix-ui.el: New file.
  (guix-ui-list-describe): ... this.
  (guix-ui-define-interface, guix-ui-info-define-interface)
  (guix-ui-list-define-interface): New macros.
  (guix-ui-font-lock-keywords): New variable.
* emacs.am (ELFILES): Add "emacs/guix-ui.el"
Diffstat (limited to 'emacs/guix-list.el')
-rw-r--r--emacs/guix-list.el47
1 files changed, 24 insertions, 23 deletions
diff --git a/emacs/guix-list.el b/emacs/guix-list.el
index e1fc199639..8943e8f589 100644
--- a/emacs/guix-list.el
+++ b/emacs/guix-list.el
@@ -30,6 +30,7 @@
 (require 'guix-base)
 (require 'guix-entry)
 (require 'guix-utils)
+(require 'guix-ui)
 
 (defgroup guix-list nil
   "General settings for list buffers."
@@ -73,17 +74,12 @@ With prefix argument, describe entries marked with any mark."
                                 count)))
       (guix-list-describe-entries entry-type ids))))
 
-(defun guix-list-describe-ids (ids)
-  "Describe entries with IDS (list of identifiers)."
-  (apply #'guix-get-show-entries
-         guix-profile 'info guix-entry-type 'id ids))
-
 
 ;;; Wrappers for 'list' variables
 
 (defvar guix-list-data nil
   "Alist with 'list' data.
-This alist is filled by `guix-list-define-entry-type' macro.")
+This alist is filled by `guix-list-define-interface' macro.")
 
 (defun guix-list-value (entry-type symbol)
   "Return SYMBOL's value for ENTRY-TYPE from `guix-list-data'."
@@ -416,8 +412,8 @@ Same as `tabulated-list-sort', but also restore marks after sorting."
   (setq-local guix-list-marks   (guix-list-marks entry-type))
   (tabulated-list-init-header))
 
-(defmacro guix-list-define-entry-type (entry-type &rest args)
-  "Define common stuff for displaying ENTRY-TYPE entries in list buffers.
+(defmacro guix-list-define-interface (entry-type &rest args)
+  "Define 'list' interface for displaying ENTRY-TYPE entries.
 Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
 
 Required keywords:
@@ -435,7 +431,10 @@ Optional keywords:
 
   - `:marks' - default value of the generated
     `guix-ENTRY-TYPE-list-marks' variable.
-"
+
+The rest keyword arguments are passed to
+`guix-buffer-define-interface' macro."
+  (declare (indent 1))
   (let* ((entry-type-str     (symbol-name entry-type))
          (prefix             (concat "guix-" entry-type-str "-list"))
          (group              (intern prefix))
@@ -518,17 +517,15 @@ See also `guix-list-describe'."
             (format         . ,format-var)
             (sort-key       . ,sort-key-var)
             (marks          . ,marks-var))
-          'guix-list-data ',entry-type)))))
+          'guix-list-data ',entry-type)
 
-(put 'guix-list-define-entry-type 'lisp-indent-function 'defun)
+         (guix-buffer-define-interface list ,entry-type
+           ,@%foreign-args)))))
 
 
 ;;; Displaying packages
 
-(guix-define-buffer-type list package)
-
-(guix-list-define-entry-type package
-  :describe-function 'guix-list-describe-ids
+(guix-ui-list-define-interface package
   :format '((name guix-package-list-get-name 20 t)
             (version nil 10 nil)
             (outputs nil 13 t)
@@ -717,17 +714,15 @@ The specification is suitable for `guix-process-package-actions'."
 
 ;;; Displaying outputs
 
-(guix-define-buffer-type list output
+(guix-ui-list-define-interface output
   :buffer-name "*Guix Package List*"
-  :required (package-id))
-
-(guix-list-define-entry-type output
   :describe-function 'guix-output-list-describe
   :format '((name guix-package-list-get-name 20 t)
             (version nil 10 nil)
             (output nil 9 t)
             (installed nil 12 t)
             (synopsis guix-list-get-one-line 30 nil))
+  :required '(package-id)
   :sort-key '(name)
   :marks '((install . ?I)
            (upgrade . ?U)
@@ -816,10 +811,7 @@ See `guix-package-info-type'."
 
 ;;; Displaying generations
 
-(guix-define-buffer-type list generation)
-
-(guix-list-define-entry-type generation
-  :describe-function 'guix-list-describe-ids
+(guix-ui-list-define-interface generation
   :format '((number nil 5 guix-list-sort-numerically-0 :right-align t)
             (current guix-generation-list-get-current 10 t)
             (time guix-list-get-time 20 t)
@@ -954,6 +946,15 @@ With ARG, mark all generations for deletion."
         (user-error "No generations marked for deletion"))
     (guix-delete-generations guix-profile marked (current-buffer))))
 
+
+(defvar guix-list-font-lock-keywords
+  (eval-when-compile
+    `((,(rx "(" (group "guix-list-define-interface")
+            symbol-end)
+       . 1))))
+
+(font-lock-add-keywords 'emacs-lisp-mode guix-list-font-lock-keywords)
+
 (provide 'guix-list)
 
 ;;; guix-list.el ends here