aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sx-search.el13
-rw-r--r--sx-tag.el33
-rw-r--r--sx.el18
3 files changed, 37 insertions, 27 deletions
diff --git a/sx-search.el b/sx-search.el
index d47905e..8614f49 100644
--- a/sx-search.el
+++ b/sx-search.el
@@ -32,13 +32,11 @@
(require 'sx)
(require 'sx-question-list)
+(require 'sx-tag)
(defvar sx-search--query-history nil
"Query history for interactive prompts.")
-(defvar sx-search--tag-history nil
- "Tags history for interactive prompts.")
-
;;; Basic function
(defun sx-search-get-questions (site page query &optional tags excluded-tags keywords)
@@ -84,15 +82,12 @@ prefix argument, the user is asked for everything."
(when (string= query "")
(setq query nil))
(when current-prefix-arg
- (setq tags (sx--multiple-read
- (format "Tags (%s)"
- (if query "optional" "mandatory"))
- 'sx-search--tag-history))
+ (setq tags (sx-tag-multiple-read
+ site (format "Tags%s" (if query " (optional)" ""))))
(when (and (not query) (string= "" tags))
(sx-user-error "Must supply either QUERY or TAGS"))
(setq excluded-tags
- (sx--multiple-read
- "Excluded tags (optional)" 'sx-search--tag-history)))
+ (sx-tag-multiple-read site "Excluded tags (optional)")))
(list site query tags excluded-tags)))
;; Here starts the actual function
diff --git a/sx-tag.el b/sx-tag.el
index 0f726fd..41ed9eb 100644
--- a/sx-tag.el
+++ b/sx-tag.el
@@ -99,6 +99,39 @@ Return the list of invalid tags in TAGS."
:site site))))
(cl-remove-if (lambda (x) (member x result)) tags)))
+
+;;; Prompt the user for tags.
+(defvar sx-tag-history nil
+ "Tags history for interactive prompts.")
+
+;;; @TODO: Make it so that hitting BACKSPACE with an empty input
+;;; deletes a previously submitted tag.
+(defun sx-tag-multiple-read (site prompt &optional initial-value)
+ "Interactively read a list of tags for SITE.
+Call `sx-completing-read' multiple times, until input is empty.
+Return a list of tags given by the user.
+
+PROMPT is a string displayed to the user and should not end with
+a space nor a colon. INITIAL-VALUE is a list of already-selected
+tags."
+ (let ((completion-list (sx-tag-list--get site))
+ (list initial-value)
+ input)
+ (while (not (string=
+ ""
+ (setq input (sx-completing-read
+ (concat prompt " ["
+ (mapconcat #'identity list ",")
+ "]: ")
+ completion-list
+ (lambda (x) (not (member x list)))
+ nil
+ 'require-match
+ nil
+ 'sx-tag-history))))
+ (push input list))
+ list))
+
(provide 'sx-tag)
;;; sx-tag.el ends here
diff --git a/sx.el b/sx.el
index 3271755..9924308 100644
--- a/sx.el
+++ b/sx.el
@@ -176,24 +176,6 @@ All ARGS are passed to `completing-read' or `ido-completing-read'."
(apply (if ido-mode #'ido-completing-read #'completing-read)
args))
-(defun sx--multiple-read (prompt hist-var)
- "Interactively query the user for a list of strings.
-Call `read-string' multiple times, until the input is empty.
-
-PROMPT is a string displayed to the user and should not end with
-a space nor a colon. HIST-VAR is a quoted symbol, indicating a
-list in which to store input history."
- (let (list input)
- (while (not (string=
- ""
- (setq input (read-string
- (concat prompt " ["
- (mapconcat #'identity list ",")
- "]: ")
- "" hist-var))))
- (push input list))
- list))
-
(defmacro sx-sorted-insert-skip-first (newelt list &optional predicate)
"Inserted NEWELT into LIST sorted by PREDICATE.
This is designed for the (site id id ...) lists. So the first car