[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
29/35: emacs: Reorganize 'readers' code.
From: |
Alex Kost |
Subject: |
29/35: emacs: Reorganize 'readers' code. |
Date: |
Fri, 11 Dec 2015 11:42:41 +0000 |
alezost pushed a commit to branch wip-refactor-emacs-ui
in repository guix.
commit 4dc84ead2bbefb68780a6fdbe87426e86e57d7da
Author: Alex Kost <address@hidden>
Date: Wed Dec 9 14:12:00 2015 +0300
emacs: Reorganize 'readers' code.
* emacs/guix-base.el (guix-graph-type-names, guix-refresh-updater-names)
(guix-lint-checker-names, guix-package-names): Move to...
* emacs/guix-read.el: ... here.
(guix-read-file-name, guix-define-reader, guix-define-readers): Move to...
* emacs/guix-utils.el: ... here.
---
emacs/guix-base.el | 29 -------------
emacs/guix-read.el | 111 ++++++++++++++++-----------------------------------
emacs/guix-utils.el | 83 +++++++++++++++++++++++++++++++++++++-
3 files changed, 116 insertions(+), 107 deletions(-)
diff --git a/emacs/guix-base.el b/emacs/guix-base.el
index 4bd8899..ab8acdf 100644
--- a/emacs/guix-base.el
+++ b/emacs/guix-base.el
@@ -109,35 +109,6 @@ For the meaning of location, see `guix-find-location'."
'package-location-string id-or-name)))
-;;; Receivable lists of packages, lint checkers, etc.
-
-(guix-memoized-defun guix-graph-type-names ()
- "Return a list of names of available graph node types."
- (guix-eval-read (guix-make-guile-expression 'graph-type-names)))
-
-(guix-memoized-defun guix-refresh-updater-names ()
- "Return a list of names of available refresh updater types."
- (guix-eval-read (guix-make-guile-expression 'refresh-updater-names)))
-
-(guix-memoized-defun guix-lint-checker-names ()
- "Return a list of names of available lint checkers."
- (guix-eval-read (guix-make-guile-expression 'lint-checker-names)))
-
-(guix-memoized-defun guix-package-names ()
- "Return a list of names of available packages."
- (sort
- ;; Work around <https://github.com/jaor/geiser/issues/64>:
- ;; list of strings is parsed much slower than list of lists,
- ;; so we use 'package-names-lists' instead of 'package-names'.
-
- ;; (guix-eval-read (guix-make-guile-expression 'package-names))
-
- (mapcar #'car
- (guix-eval-read (guix-make-guile-expression
- 'package-names-lists)))
- #'string<))
-
-
;;; Getting and displaying info about packages and generations
(defcustom guix-package-list-type 'output
diff --git a/emacs/guix-read.el b/emacs/guix-read.el
index 82eccbd..3bc7b16 100644
--- a/emacs/guix-read.el
+++ b/emacs/guix-read.el
@@ -26,83 +26,40 @@
(require 'guix-help-vars)
(require 'guix-utils)
-(require 'guix-base)
-
-(defun guix-read-file-name (prompt &optional dir default-filename
- mustmatch initial predicate)
- "Read file name.
-This function is similar to `read-file-name' except it also
-expands the file name."
- (expand-file-name (read-file-name prompt dir default-filename
- mustmatch initial predicate)))
-
-(defmacro guix-define-reader (name read-fun completions prompt)
- "Define NAME function to read from minibuffer.
-READ-FUN may be `completing-read', `completing-read-multiple' or
-another function with the same arguments."
- `(defun ,name (&optional prompt initial-contents)
- (,read-fun ,(if prompt
- `(or prompt ,prompt)
- 'prompt)
- ,completions nil nil initial-contents)))
-
-(defmacro guix-define-readers (&rest args)
- "Define reader functions.
-
-ARGS should have a form [KEYWORD VALUE] ... The following
-keywords are available:
-
- - `completions-var' - variable used to get completions.
-
- - `completions-getter' - function used to get completions.
-
- - `single-reader', `single-prompt' - name of a function to read
- a single value, and a prompt for it.
-
- - `multiple-reader', `multiple-prompt' - name of a function to
- read multiple values, and a prompt for it.
-
- - `multiple-separator' - if specified, another
- `<multiple-reader-name>-string' function returning a string
- of multiple values separated the specified separator will be
- defined."
- (guix-keyword-args-let args
- ((completions-var :completions-var)
- (completions-getter :completions-getter)
- (single-reader :single-reader)
- (single-prompt :single-prompt)
- (multiple-reader :multiple-reader)
- (multiple-prompt :multiple-prompt)
- (multiple-separator :multiple-separator))
- (let ((completions
- (cond ((and completions-var completions-getter)
- `(or ,completions-var
- (setq ,completions-var
- (funcall ',completions-getter))))
- (completions-var
- completions-var)
- (completions-getter
- `(funcall ',completions-getter)))))
- `(progn
- ,(when (and completions-var
- (not (boundp completions-var)))
- `(defvar ,completions-var nil))
-
- ,(when single-reader
- `(guix-define-reader ,single-reader completing-read
- ,completions ,single-prompt))
-
- ,(when multiple-reader
- `(guix-define-reader ,multiple-reader completing-read-multiple
- ,completions ,multiple-prompt))
-
- ,(when (and multiple-reader multiple-separator)
- (let ((name (intern (concat (symbol-name multiple-reader)
- "-string"))))
- `(defun ,name (&optional prompt initial-contents)
- (guix-concat-strings
- (,multiple-reader prompt initial-contents)
- ,multiple-separator))))))))
+(require 'guix-backend)
+(require 'guix-guile)
+
+
+;;; Receivable lists of packages, lint checkers, etc.
+
+(guix-memoized-defun guix-graph-type-names ()
+ "Return a list of names of available graph node types."
+ (guix-eval-read (guix-make-guile-expression 'graph-type-names)))
+
+(guix-memoized-defun guix-refresh-updater-names ()
+ "Return a list of names of available refresh updater types."
+ (guix-eval-read (guix-make-guile-expression 'refresh-updater-names)))
+
+(guix-memoized-defun guix-lint-checker-names ()
+ "Return a list of names of available lint checkers."
+ (guix-eval-read (guix-make-guile-expression 'lint-checker-names)))
+
+(guix-memoized-defun guix-package-names ()
+ "Return a list of names of available packages."
+ (sort
+ ;; Work around <https://github.com/jaor/geiser/issues/64>:
+ ;; list of strings is parsed much slower than list of lists,
+ ;; so we use 'package-names-lists' instead of 'package-names'.
+
+ ;; (guix-eval-read (guix-make-guile-expression 'package-names))
+
+ (mapcar #'car
+ (guix-eval-read (guix-make-guile-expression
+ 'package-names-lists)))
+ #'string<))
+
+
+;;; Readers
(guix-define-readers
:completions-var guix-help-system-types
diff --git a/emacs/guix-utils.el b/emacs/guix-utils.el
index 872ed40..a67d0e7 100644
--- a/emacs/guix-utils.el
+++ b/emacs/guix-utils.el
@@ -230,6 +230,14 @@ Return time value."
(require 'org)
(org-read-date nil t nil prompt))
+(defun guix-read-file-name (prompt &optional dir default-filename
+ mustmatch initial predicate)
+ "Read file name.
+This function is similar to `read-file-name' except it also
+expands the file name."
+ (expand-file-name (read-file-name prompt dir default-filename
+ mustmatch initial predicate)))
+
(defcustom guix-find-file-function #'find-file
"Function used to find a file.
The function is called by `guix-find-file' with a file name as a
@@ -395,6 +403,77 @@ See `guix-alist-put' for details."
(diff old new (or switches guix-diff-switches) no-async))
+;;; Completing readers definers
+
+(defmacro guix-define-reader (name read-fun completions prompt)
+ "Define NAME function to read from minibuffer.
+READ-FUN may be `completing-read', `completing-read-multiple' or
+another function with the same arguments."
+ `(defun ,name (&optional prompt initial-contents)
+ (,read-fun ,(if prompt
+ `(or prompt ,prompt)
+ 'prompt)
+ ,completions nil nil initial-contents)))
+
+(defmacro guix-define-readers (&rest args)
+ "Define reader functions.
+
+ARGS should have a form [KEYWORD VALUE] ... The following
+keywords are available:
+
+ - `completions-var' - variable used to get completions.
+
+ - `completions-getter' - function used to get completions.
+
+ - `single-reader', `single-prompt' - name of a function to read
+ a single value, and a prompt for it.
+
+ - `multiple-reader', `multiple-prompt' - name of a function to
+ read multiple values, and a prompt for it.
+
+ - `multiple-separator' - if specified, another
+ `<multiple-reader-name>-string' function returning a string
+ of multiple values separated the specified separator will be
+ defined."
+ (guix-keyword-args-let args
+ ((completions-var :completions-var)
+ (completions-getter :completions-getter)
+ (single-reader :single-reader)
+ (single-prompt :single-prompt)
+ (multiple-reader :multiple-reader)
+ (multiple-prompt :multiple-prompt)
+ (multiple-separator :multiple-separator))
+ (let ((completions
+ (cond ((and completions-var completions-getter)
+ `(or ,completions-var
+ (setq ,completions-var
+ (funcall ',completions-getter))))
+ (completions-var
+ completions-var)
+ (completions-getter
+ `(funcall ',completions-getter)))))
+ `(progn
+ ,(when (and completions-var
+ (not (boundp completions-var)))
+ `(defvar ,completions-var nil))
+
+ ,(when single-reader
+ `(guix-define-reader ,single-reader completing-read
+ ,completions ,single-prompt))
+
+ ,(when multiple-reader
+ `(guix-define-reader ,multiple-reader completing-read-multiple
+ ,completions ,multiple-prompt))
+
+ ,(when (and multiple-reader multiple-separator)
+ (let ((name (intern (concat (symbol-name multiple-reader)
+ "-string"))))
+ `(defun ,name (&optional prompt initial-contents)
+ (guix-concat-strings
+ (,multiple-reader prompt initial-contents)
+ ,multiple-separator))))))))
+
+
;;; Memoizing
(defun guix-memoize (function)
@@ -434,7 +513,9 @@ See `defun' for the meaning of arguments."
(defvar guix-utils-font-lock-keywords
(eval-when-compile
- `((,(rx "(" (group (or "guix-keyword-args-let"
+ `((,(rx "(" (group (or "guix-define-reader"
+ "guix-define-readers"
+ "guix-keyword-args-let"
"guix-with-indent"))
symbol-end)
. 1)
- 03/35: emacs: Add API for 'guix-entry'., (continued)
- 03/35: emacs: Add API for 'guix-entry'., Alex Kost, 2015/12/11
- 19/35: emacs: Split 'guix-param-titles' variable., Alex Kost, 2015/12/11
- 24/35: emacs: Improve messages for packages found by ID., Alex Kost, 2015/12/11
- 21/35: emacs: Split 'guix-root-map' keymap., Alex Kost, 2015/12/11
- 23/35: emacs: Generalize buffer reverting., Alex Kost, 2015/12/11
- 25/35: emacs: info: Buttonize package name heading., Alex Kost, 2015/12/11
- 22/35: emacs: Generalize buffer redisplaying., Alex Kost, 2015/12/11
- 27/35: emacs: info: Get rid of syntactic fontification., Alex Kost, 2015/12/11
- 18/35: emacs: info: Split 'guix-info-format' variable., Alex Kost, 2015/12/11
- 17/35: emacs: Factorize macros for defining interfaces., Alex Kost, 2015/12/11
- 29/35: emacs: Reorganize 'readers' code.,
Alex Kost <=
- 31/35: emacs: Add 'list-single' variables., Alex Kost, 2015/12/11
- 33/35: emacs: Return nil instead of "" in completing readers., Alex Kost, 2015/12/11
- 26/35: emacs: Generalize buffer naming., Alex Kost, 2015/12/11
- 32/35: emacs: Add 'guix-list-get-display-entries'., Alex Kost, 2015/12/11
- 16/35: emacs: info: Generalize inserting and formatting., Alex Kost, 2015/12/11
- 35/35: emacs: Add "B" key to display latest builds., Alex Kost, 2015/12/11
- 34/35: emacs: Add Hydra interface., Alex Kost, 2015/12/11
- 28/35: emacs: Generalize buffer interface., Alex Kost, 2015/12/11
- 30/35: emacs: Reorganize package/generation UI code., Alex Kost, 2015/12/11