branch: externals/denote-search
commit ef84b0f9c610f2a0c327cf5691f3ef9f8314d898
Author: Lucas Quintana <[email protected]>
Commit: Lucas Quintana <[email protected]>
Add commands for filtering by keyword (bound to 'X' and 'I')
The manual has been updated with details.
---
README.org | 19 +++++++++++++++++--
denote-search.el | 37 +++++++++++++++++++++++++++++++++++--
2 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/README.org b/README.org
index ca86ad03c7..dca5bd0f24 100644
--- a/README.org
+++ b/README.org
@@ -222,6 +222,9 @@ can give you a quick overlook of all the files that matched
the
search. If there are many, you can proceed to filter the output
(see [[*filtering the search results][filtering the search results]]).
+Press ~o~ (~delete-other-windows~) to close other windows displayed in
+the frame.
+
* Filtering the search results
#+findex: denote-search-exclude-files
@@ -251,16 +254,28 @@ matches for the search query you made originally only for
those
specific files. You can of course keep filtering further.
To "break the chain" and start a totally new search, you can simply
-call ~denote-search~, which is bound to =s= in the results buffer for
+call ~denote-search~, which is bound to ~s~ in the results buffer for
convenience.
It's possible that you don't want to start a new search, but rather to
search something on the curated file list you got. See [[*focused
search][focused
search]].
+Filtering by keyword is such a common operation that two special
+commands exist just for that: ~X~
+(~denote-search-exclude-files-with-keyword~) and ~I~
+(~denote-search-only-include-files-with-keyword~). They are
+equivalent to calling its regular counterparts and issuing a word with
+a leading underscore; however, they also offer completion for
+available keywords (using ~denote-keywords~, so its actual behaviour
+is governed by the variables ~denote-infer-keywords~ and
+~denote-known-keywords~).
+
History is available when filtering. Press ~M-p~
(~previous-history-element~) to view past queries. This history is
-kept separately from that available when searching.
+kept separately from that available when searching. In the case of
+keyword filtering, history is shared with other Denote keyword
+prompts.
* Focused search
diff --git a/denote-search.el b/denote-search.el
index 4c59dd1d8b..66ee720188 100644
--- a/denote-search.el
+++ b/denote-search.el
@@ -131,6 +131,17 @@ non-nil."
"Only include file names matching: ")
nil 'denote-search-file-regexp-history)))
+(defun denote-search-keyword-prompt (&optional include)
+ "Prompt for a keyword in the minibuffer, with completion.
+
+The prompt assumes the user wants to exclude the keyword, unless INCLUDE
+is non-nil."
+ (list (completing-read
+ (if (not include)
+ "Exclude files with keyword: "
+ "Only include files with keyword: ")
+ (denote-keywords) nil t nil 'denote-keyword-history)))
+
(defun denote-search-query-prompt (&optional type)
"Prompt for a search query in the minibuffer.
@@ -239,7 +250,9 @@ The results are populated in a buffer whose major mode is
(xref-matches-in-files
query
(or set (denote-directory-files nil nil :text-only)
- (user-error "Sorry, the directory `%s' doesn't have any text
files to search." denote-directory))))))
+ (user-error
+ "Directory `%s' doesn't have any text files to search"
+ denote-directory))))))
(or xref-alist (user-error "No matches for `%s'" query))
;; Set internal variables for last set of files and last query
(setq denote-search--last-files nil)
@@ -360,6 +373,24 @@ See also `denote-search-exlude-files'."
(denote-search denote-search--last-query final-files)
(user-error "No remaining files when applying that filter"))))
+(defun denote-search-exclude-files-with-keyword (keyword)
+ "Exclude files with KEYWORD from current `denote-search' buffer.
+
+This is equivalent to passing the argument \"_KEYWORD\" to
+`denote-search-exclude-files'. This command, however, offers completion
+for available keywords."
+ (interactive (denote-search-keyword-prompt))
+ (denote-search-exclude-files (concat "_" keyword)))
+
+(defun denote-search-only-include-files-with-keyword (keyword)
+ "Exclude files without KEYWORD from current `denote-search' buffer.
+
+This is equivalent to passing the argument \"_KEYWORD\" to
+`denote-search-only-include-files'. This command, however, offers
+completion for available keywords."
+ (interactive (denote-search-keyword-prompt :include))
+ (denote-search-only-include-files (concat "_" keyword)))
+
;;;; Keymap and mode definition:
(defvar-keymap denote-search-mode-map
@@ -372,7 +403,9 @@ See also `denote-search-exlude-files'."
"s" #'denote-search
"v" #'outline-cycle
"x" #'denote-search-exclude-files
- "i" #'denote-search-only-include-files)
+ "i" #'denote-search-only-include-files
+ "X" #'denote-search-exclude-files-with-keyword
+ "I" #'denote-search-only-include-files-with-keyword)
(define-minor-mode denote-search-mode
"Minor mode enabled in the buffer generated by `denote-search'.