From 7735c503b5b8dfe7d8963207f4f2cf0b7dfd3894 Mon Sep 17 00:00:00 2001 From: Alex Kost Date: Fri, 20 Nov 2015 12:38:31 +0300 Subject: 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" --- emacs/guix-list.el | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) (limited to 'emacs/guix-list.el') 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 -- cgit v1.2.3