Allow mulitple values to be read for org-ql-view-buffers-files

commit d8f29225a3
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Fri Sep 24 15:47:38 2021 -0500

    Abstract buffers-files being flattened to a list of strings

commit 2d49745425
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Fri Sep 17 17:53:21 2021 -0500

    Fix: \w duplicates & func's with buffers/names with expand/contract

commit 576f9d3512
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Thu Sep 16 18:42:32 2021 -0500

    Handling support for functions \w functions using completing-read-multiple

commit cea165192d
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Thu Sep 16 16:49:19 2021 -0500

    Cleaning up functions and improvements for clarity.

commit aa9c6ccdfa
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Wed Sep 15 17:56:19 2021 -0500

    Adding `comma separated` instruction to readme

commit 564d491604
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Mon Sep 13 17:05:14 2021 -0500

    Fixes for using mulitiple values and related test suite improvements

commit ffaebcbcbe
Merge: 788951a 94f9e6f
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Mon Sep 13 13:15:57 2021 -0500

    Merge branch 'master' of https://github.com/alphapapa/org-ql

commit 788951a4a9
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Mon Sep 13 11:01:55 2021 -0500

    Replacing org-ql-view--expand-buffers-files

commit cabf88eea5
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Mon Jul 19 00:19:52 2021 -0500

    removing duplcates when expanding buffers-files

commit b68d836562
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Sun Jul 18 23:49:54 2021 -0500

    Using completing-read-multiple for org-ql-view--complete-buffers-files

commit 06bdfc7a9e
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Sun Jul 4 23:32:08 2021 -0500

    Fn always promts for buffer/files; handle buffer obj and list

    Fn: org-ql-view--complete-buffers-files
    With buffers, org-ql-view--contract-buffers-files return the buffer
    name.
    When org-ql-view-buffers-files is a list, just dumpt it as a string
    and check if completion-read returns the same value, if so return the
    original value of org-ql-view-buffers-files

commit cc6e22dd30
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Sun Jul 4 23:31:31 2021 -0500

    Allow reading buffer names for buffers-or-names

commit 89b84768ad
Author: Ahmed Shariff <ahmed.shariff@live.com>
Date:   Sat Jul 3 21:25:10 2021 -0500

    Test cases for all org-ql-view--*-buffers-files functions

commit 7120b6334d
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Sat Jul 3 02:17:33 2021 -0500

    Refactor of org-ql-view--complete-buffers-files

    Handles the different values `org-ql-view-buffers-files` can hold.
    Use completing-read only if `org-ql-view-buffers-files` is nil or the
    contracted form of `org-ql-view-buffers-files` is a string.

commit 7b990e5275
Author: Ahmed Shariff <shariff.mfa@outlook.com>
Date:   Wed Jun 30 18:01:49 2021 -0500

    Fix for issue with initial-input in org-ql-view--complete-buffers-files
This commit is contained in:
Ahmed Shariff 2022-11-20 21:43:22 -08:00
parent 5f70636556
commit 4b19e5fb0b
2 changed files with 99 additions and 43 deletions

View file

@ -132,7 +132,7 @@ Read ~QUERY~ and search with ~org-ql~. Interactively, prompt for these variable
+ ~buffer~: search the current buffer + ~buffer~: search the current buffer
+ ~all~: search all Org buffers + ~all~: search all Org buffers
+ ~agenda~: search buffers returned by the function ~org-agenda-files~ + ~agenda~: search buffers returned by the function ~org-agenda-files~
+ A space-separated list of file or buffer names + A comma-separated list of file, buffer names, or the above keywords
~GROUPS~: An ~org-super-agenda~ group set. See variable ~org-super-agenda-groups~. ~GROUPS~: An ~org-super-agenda~ group set. See variable ~org-super-agenda-groups~.

View file

@ -1019,6 +1019,27 @@ property."
;; source code of `check-declare' shows that it searches for "cl-defun" declarations. ;; source code of `check-declare' shows that it searches for "cl-defun" declarations.
(declare-function org-ql-search-directories-files "org-ql-search" t) (declare-function org-ql-search-directories-files "org-ql-search" t)
(defun org-ql-view--buffers-files-to-uniq-strings (buffers-files)
"Flatten, remove duplicates and convert elements in BUFFERS-FILES to strings.
This used by `org-ql-view--contract-buffers-files' and
`org-ql-view--expand-buffers-files'. Would signal error
if an element is not a buffer or string."
(cl-labels ((convert-to-strings
;; Expanding all buffers to file names or buffer names to remove duplicate entries.
(list) (--map
(pcase-exhaustive it
((pred bufferp) (or (buffer-file-name it)
(buffer-name it)))
;; Any values at this point should be a buffer or string.
;; Testing for string anyways.
((pred stringp) it))
list)))
(--> buffers-files
-flatten
-non-nil
convert-to-strings
-uniq)))
(defun org-ql-view--contract-buffers-files (buffers-files) (defun org-ql-view--contract-buffers-files (buffers-files)
"Return BUFFERS-FILES in its \"contracted\" form. "Return BUFFERS-FILES in its \"contracted\" form.
The contracted form is \"org-agenda-files\" if BUFFERS-FILES The contracted form is \"org-agenda-files\" if BUFFERS-FILES
@ -1033,8 +1054,12 @@ current buffer. Otherwise BUFFERS-FILES is returned unchanged."
(string (expand-file-name it)) (string (expand-file-name it))
(otherwise it)) (otherwise it))
list))) list)))
(let ((contracted-buffers-files
;; TODO: Test this more exhaustively. ;; TODO: Test this more exhaustively.
(pcase buffers-files (pcase buffers-files
((pred functionp) (pcase buffers-files
('org-agenda-files "org-agenda-files")
(_ buffers-files)))
((pred listp) ((pred listp)
(pcase (expand-files buffers-files) (pcase (expand-files buffers-files)
((pred (seq-set-equal-p (mapcar #'expand-file-name (org-agenda-files)))) ((pred (seq-set-equal-p (mapcar #'expand-file-name (org-agenda-files))))
@ -1050,37 +1075,68 @@ current buffer. Otherwise BUFFERS-FILES is returned unchanged."
"org-agenda-files") "org-agenda-files")
((and (pred bufferp) (guard (buffer-file-name buffers-files))) ((and (pred bufferp) (guard (buffer-file-name buffers-files)))
(buffer-file-name buffers-files)) (buffer-file-name buffers-files))
((pred bufferp)
(buffer-name buffers-files))
(_ buffers-files)))) (_ buffers-files))))
;; To filter duplicates with the extend counterpart of this function,
;; this needs to be a string or a list of string.
;; Hence, making sure the buffers are convered to file names or buffer names.
;; Using file-names when it's a file-buffer to avoid duplicates resulting from
;; the file-buffer and file name being entered.
(cl-typecase contracted-buffers-files
(function contracted-buffers-files)
(string contracted-buffers-files)
(list (org-ql-view--buffers-files-to-uniq-strings contracted-buffers-files))
(t (error (format "Value %s is not a string, a valid function or a list of buffer/strings" contracted-buffers-files)))))))
(defun org-ql-view--complete-buffers-files () (defun org-ql-view--complete-buffers-files ()
"Return value for `org-ql-view-buffers-files' using completion." "Return value for `org-ql-view-buffers-files' using completion.
(cl-labels ((initial-input When `org-ql-view-buffers-files' cannot be contracted to a string
() (when org-ql-view-buffers-files representation `org-ql-view-buffers-files' is returned."
(let* ((contracted-org-ql-view-buffers-files
(when org-ql-view-buffers-files
(org-ql-view--contract-buffers-files (org-ql-view--contract-buffers-files
org-ql-view-buffers-files)))) org-ql-view-buffers-files)))
(if (and org-ql-view-buffers-files (initial-input (pcase contracted-org-ql-view-buffers-files
(bufferp org-ql-view-buffers-files)) ('nil nil)
;; Buffers can't be input by name, so if the default value is a buffer, just use it. ('string contracted-org-ql-view-buffers-files)
;; TODO: Find a way to fix this. ((pred functionp) contracted-org-ql-view-buffers-files)
org-ql-view-buffers-files ((pred listp)
(org-ql-view--expand-buffers-files (mapconcat 'identity contracted-org-ql-view-buffers-files
(completing-read "Buffers/Files: " ","))
(_ (format "%s" contracted-org-ql-view-buffers-files))))
(completion-read-result (if (functionp contracted-org-ql-view-buffers-files)
contracted-org-ql-view-buffers-files
(completing-read-multiple
"Buffers/Files: "
(list 'buffer 'org-agenda-files 'org-directory 'all) (list 'buffer 'org-agenda-files 'org-directory 'all)
nil nil (initial-input)))))) nil nil initial-input))))
(if (equal completion-read-result initial-input)
org-ql-view-buffers-files
(org-ql-view--expand-buffers-files completion-read-result))))
(defun org-ql-view--expand-buffers-files (buffers-files) (defun org-ql-view--expand-buffers-files (buffers-files)
"Return BUFFERS-FILES expanded to a list of files or buffers. "Return BUFFERS-FILES expanded to a list of files or buffers.
The counterpart to `org-ql-view--contract-buffers-files'." The counterpart to `org-ql-view--contract-buffers-files'.
(pcase-exhaustive buffers-files This always returns a list of string values."
(let ((expanded-buffers-files
(--> buffers-files
-list -non-nil
(-map (lambda (buffer-file)
(pcase-exhaustive buffer-file
("all" (--select (equal (buffer-local-value 'major-mode it) 'org-mode) ("all" (--select (equal (buffer-local-value 'major-mode it) 'org-mode)
(buffer-list))) (buffer-list)))
("org-agenda-files" (org-agenda-files)) ("org-agenda-files" (org-agenda-files))
("org-directory" (org-ql-search-directories-files)) ("org-directory" (org-ql-search-directories-files))
((or "" "buffer") (current-buffer)) ((or "" "buffer")
((pred bufferp) buffers-files) (current-buffer))
((pred listp) buffers-files) ((or (pred bufferp)
;; A single filename. ;; A single filename.
((pred stringp) buffers-files))) (pred stringp))
buffer-file)
(_ (error (format "Value %s is not a valid buffer/file" buffer-file)))))
it))))
(org-ql-view--buffers-files-to-uniq-strings expanded-buffers-files)))
(defun org-ql-view--complete-super-groups () (defun org-ql-view--complete-super-groups ()
"Return value for `org-ql-view-super-groups' using completion." "Return value for `org-ql-view-super-groups' using completion."