aboutsummaryrefslogtreecommitdiff
path: root/emacs/guix-info.el
diff options
context:
space:
mode:
authorAlex Kost <alezost@gmail.com>2015-11-20 21:25:10 +0300
committerAlex Kost <alezost@gmail.com>2016-01-02 17:25:35 +0300
commit9193fb7c1dedcf2233287baa819a9c9ded8242a8 (patch)
treee0eab450b51b5f3ae2300bf486fd9da2bda1b990 /emacs/guix-info.el
parent7735c503b5b8dfe7d8963207f4f2cf0b7dfd3894 (diff)
downloadguix-9193fb7c1dedcf2233287baa819a9c9ded8242a8.tar
guix-9193fb7c1dedcf2233287baa819a9c9ded8242a8.tar.gz
emacs: info: Split 'guix-info-format' variable.
* emacs/guix-info.el: Generate 'guix-ENTRY-TYPE-info-format' variables for 'package', 'installed-output', 'output' and 'generation' entry types. (guix-info-format): Remove. (guix-info-data): New variable. (guix-info-value): New procedure. (guix-info-define-interface): Add ':format' keyword. * emacs/guix-base.el (guix-buffer-define-interface): Add ':reduced?' keyword. * doc/emacs.texi (Emacs Appearance): Adjust accordingly.
Diffstat (limited to 'emacs/guix-info.el')
-rw-r--r--emacs/guix-info.el174
1 files changed, 101 insertions, 73 deletions
diff --git a/emacs/guix-info.el b/emacs/guix-info.el
index d31e0377ff..bf43b40e9e 100644
--- a/emacs/guix-info.el
+++ b/emacs/guix-info.el
@@ -114,76 +114,16 @@ This string is used by `guix-info-insert-value-format'.")
(defvar guix-info-delimiter "\n\f\n"
"String used to separate entries.")
-(defvar guix-info-format
- '((package
- guix-package-info-insert-heading
- ignore
- (synopsis ignore (simple guix-package-info-synopsis))
- ignore
- (description ignore (simple guix-package-info-description))
- ignore
- (outputs simple guix-package-info-insert-outputs)
- (source simple guix-package-info-insert-source)
- (location format (format guix-package-location))
- (home-url format (format guix-url))
- (license format (format guix-package-info-license))
- (inputs format (format guix-package-input))
- (native-inputs format (format guix-package-native-input))
- (propagated-inputs format (format guix-package-propagated-input)))
- (installed
- (path simple (indent guix-file))
- (dependencies simple (indent guix-file)))
- (output
- (name format (format guix-package-info-name))
- (version format guix-output-info-insert-version)
- (output format guix-output-info-insert-output)
- (synopsis simple (indent guix-package-info-synopsis))
- (source simple guix-package-info-insert-source)
- (path simple (indent guix-file))
- (dependencies simple (indent guix-file))
- (location format (format guix-package-location))
- (home-url format (format guix-url))
- (license format (format guix-package-info-license))
- (inputs format (format guix-package-input))
- (native-inputs format (format guix-package-native-input))
- (propagated-inputs format (format guix-package-propagated-input))
- (description simple (indent guix-package-info-description)))
- (generation
- (number format guix-generation-info-insert-number)
- (prev-number format (format))
- (current format guix-generation-info-insert-current)
- (path simple (indent guix-file))
- (time format (time))))
- "Methods for inserting parameter values.
-Each element of the list should have a form:
-
- (ENTRY-TYPE . (METHOD ...))
-
-Each METHOD should be either a function or should have the
-following form:
-
- (PARAM INSERT-TITLE INSERT-VALUE)
-
-If METHOD is a function, it is called with an entry as argument.
-
-PARAM is a name of entry parameter.
-
-INSERT-TITLE may be either a symbol or a list. If it is a
-symbol, it should be a function or an alias from
-`guix-info-title-aliases', in which case it is called with title
-as argument. If it is a list, it should have a
-form (FUN-OR-ALIAS [ARGS ...]), in which case FUN-OR-ALIAS is
-called with title and ARGS as arguments.
+
+;;; Wrappers for 'info' variables
-INSERT-VALUE may be either a symbol or a list. If it is a
-symbol, it should be a function or an alias from
-`guix-info-value-aliases', in which case it is called with value
-and entry as arguments. If it is a list, it should have a
-form (FUN-OR-ALIAS [ARGS ...]), in which case FUN-OR-ALIAS is
-called with value and ARGS as arguments.
+(defvar guix-info-data nil
+ "Alist with 'info' data.
+This alist is filled by `guix-info-define-interface' macro.")
-Parameters are inserted in the same order as defined by this list.
-After calling each METHOD, a new line is inserted.")
+(defun guix-info-value (entry-type symbol)
+ "Return SYMBOL's value for ENTRY-TYPE from `guix-info-data'."
+ (symbol-value (guix-assq-value guix-info-data entry-type symbol)))
(defun guix-info-param-title (entry-type param)
"Return a title of an ENTRY-TYPE parameter PARAM."
@@ -191,7 +131,7 @@ After calling each METHOD, a new line is inserted.")
(defun guix-info-format (entry-type)
"Return 'info' format for ENTRY-TYPE."
- (guix-assq-value guix-info-format entry-type))
+ (guix-info-value entry-type 'format))
(defun guix-info-displayed-params (entry-type)
"Return a list of ENTRY-TYPE parameters that should be displayed."
@@ -473,18 +413,86 @@ See `insert-text-button' for the meaning of PROPERTIES."
"Define 'info' interface for displaying ENTRY-TYPE entries.
Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
+Required keywords:
+
+ - `:format' - default value of the generated
+ `guix-ENTRY-TYPE-info-format' variable.
+
The rest keyword arguments are passed to
`guix-buffer-define-interface' macro."
(declare (indent 1))
- `(guix-buffer-define-interface info ,entry-type
- ,@args))
+ (let* ((entry-type-str (symbol-name entry-type))
+ (prefix (concat "guix-" entry-type-str "-info"))
+ (group (intern prefix))
+ (format-var (intern (concat prefix "-format"))))
+ (guix-keyword-args-let args
+ ((format-val :format))
+ `(progn
+ (defcustom ,format-var ,format-val
+ ,(format "\
+List of methods for inserting '%s' entry.
+Each METHOD should be either a function or should have the
+following form:
+
+ (PARAM INSERT-TITLE INSERT-VALUE)
+
+If METHOD is a function, it is called with an entry as argument.
+
+PARAM is a name of '%s' entry parameter.
+
+INSERT-TITLE may be either a symbol or a list. If it is a
+symbol, it should be a function or an alias from
+`guix-info-title-aliases', in which case it is called with title
+as argument. If it is a list, it should have a
+form (FUN-OR-ALIAS [ARGS ...]), in which case FUN-OR-ALIAS is
+called with title and ARGS as arguments.
+
+INSERT-VALUE may be either a symbol or a list. If it is a
+symbol, it should be a function or an alias from
+`guix-info-value-aliases', in which case it is called with value
+and entry as arguments. If it is a list, it should have a
+form (FUN-OR-ALIAS [ARGS ...]), in which case FUN-OR-ALIAS is
+called with value and ARGS as arguments.
+
+Parameters are inserted in the same order as defined by this list.
+After calling each METHOD, a new line is inserted."
+ entry-type-str entry-type-str)
+ :type 'sexp
+ :group ',group)
+
+ (guix-alist-put!
+ '((format . ,format-var))
+ 'guix-info-data ',entry-type)
+
+ (guix-buffer-define-interface info ,entry-type
+ ,@%foreign-args)))))
;;; Displaying packages
(guix-ui-info-define-interface package
+ :format '(guix-package-info-insert-heading
+ ignore
+ (synopsis ignore (simple guix-package-info-synopsis))
+ ignore
+ (description ignore (simple guix-package-info-description))
+ ignore
+ (outputs simple guix-package-info-insert-outputs)
+ (source simple guix-package-info-insert-source)
+ (location format (format guix-package-location))
+ (home-url format (format guix-url))
+ (license format (format guix-package-info-license))
+ (inputs format (format guix-package-input))
+ (native-inputs format (format guix-package-native-input))
+ (propagated-inputs format
+ (format guix-package-propagated-input)))
:required '(id name version installed non-unique))
+(guix-info-define-interface installed-output
+ :format '((path simple (indent guix-file))
+ (dependencies simple (indent guix-file)))
+ :reduced? t)
+
(defface guix-package-info-heading
'((t :inherit guix-info-heading))
"Face for package name and version headings."
@@ -641,7 +649,7 @@ current OUTPUT is installed (if there is such output in
(guix-package-info-insert-action-button 'upgrade entry output))
(insert "\n")
(when installed-entry
- (guix-info-insert-entry installed-entry 'installed 2))))
+ (guix-info-insert-entry installed-entry 'installed-output 2))))
(defun guix-package-info-insert-action-button (type entry output)
"Insert button to process an action on a package OUTPUT at point.
@@ -771,6 +779,21 @@ This function is used to hide a \"Download\" button if needed."
(guix-ui-info-define-interface output
:buffer-name "*Guix Package Info*"
+ :format '((name format (format guix-package-info-name))
+ (version format guix-output-info-insert-version)
+ (output format guix-output-info-insert-output)
+ (synopsis simple (indent guix-package-info-synopsis))
+ (source simple guix-package-info-insert-source)
+ (path simple (indent guix-file))
+ (dependencies simple (indent guix-file))
+ (location format (format guix-package-location))
+ (home-url format (format guix-url))
+ (license format (format guix-package-info-license))
+ (inputs format (format guix-package-input))
+ (native-inputs format (format guix-package-native-input))
+ (propagated-inputs format
+ (format guix-package-propagated-input))
+ (description simple (indent guix-package-info-description)))
:required '(id package-id installed non-unique))
(defun guix-output-info-insert-version (version entry)
@@ -799,7 +822,12 @@ This function is used to hide a \"Download\" button if needed."
;;; Displaying generations
-(guix-ui-info-define-interface generation)
+(guix-ui-info-define-interface generation
+ :format '((number format guix-generation-info-insert-number)
+ (prev-number format (format))
+ (current format guix-generation-info-insert-current)
+ (path simple (indent guix-file))
+ (time format (time))))
(defface guix-generation-info-number
'((t :inherit font-lock-keyword-face))