branch: externals/consult commit 3b3e62b0fe84d195e8c7fd9f034691a20d3f476c Author: Daniel Mendler <m...@daniel-mendler.de> Commit: Daniel Mendler <m...@daniel-mendler.de>
Show number of buffers in the multi buffer prompt Co-authored-by: JD Smith <93749+jdtsm...@users.noreply.github.com> --- consult-imenu.el | 26 +++++++----------- consult.el | 81 ++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 60 insertions(+), 47 deletions(-) diff --git a/consult-imenu.el b/consult-imenu.el index fd032db..4a0f70c 100644 --- a/consult-imenu.el +++ b/consult-imenu.el @@ -147,11 +147,9 @@ TYPES is the mode-specific types configuration." (buffer-name) (error-message-string err)) nil))) -(defun consult-imenu--multi-items (query) - "Return all imenu items from buffers matching QUERY." - (apply #'append (consult--buffer-map - (apply #'consult--buffer-query query) - #'consult-imenu--items-safe))) +(defun consult-imenu--multi-items (buffers) + "Return all imenu items from BUFFERS." + (apply #'append (consult--buffer-map buffers #'consult-imenu--items-safe))) (defun consult-imenu--jump (item) "Jump to imenu ITEM via `consult--jump'. @@ -222,17 +220,13 @@ In order to determine the buffers belonging to the same project, the same major mode as the current buffer are used. See also `consult-imenu' for more details. In order to search a subset of buffers, QUERY can be set to a plist according to `consult--buffer-query'." - (interactive) - (let ((scope "Multiple buffers")) - (when-let (project (and (not (keywordp (car-safe query))) - (consult--project-root))) - (setq scope (format "Project %s" (consult--project-name project)) - query `(:directory ,project :mode ,major-mode :sort alpha))) - (if query - (consult-imenu--select - (format "Go to item (%s): " scope) - (consult-imenu--multi-items query)) - (consult-imenu)))) + (interactive "P") + (unless (keywordp (car-safe query)) + (setq query (list :sort 'alpha :mode major-mode + :directory (and (not query) 'project)))) + (let ((buffers (consult--buffer-query-prompt "Go to item" query))) + (consult-imenu--select (car buffers) + (consult-imenu--multi-items (cdr buffers))))) (define-obsolete-function-alias 'consult-project-imenu diff --git a/consult.el b/consult.el index 0f111e5..3194257 100644 --- a/consult.el +++ b/consult.el @@ -793,20 +793,23 @@ The line beginning/ending BEG/END is bound in BODY." (kill-local-variable ',(cdr x)))) local))))))) +(defun consult--abbreviate-directory (dir) + "Return abbreviated directory DIR for use in prompts." + (save-match-data + (let ((adir (abbreviate-file-name dir))) + (if (string-match "/\\([^/]+\\)/\\([^/]+\\)/\\'" adir) + (format "…/%s/%s/" (match-string 1 adir) (match-string 2 adir)) + adir)))) + (defun consult--directory-prompt-1 (prompt dir) "Format PROMPT, expand directory DIR and return them as a pair." - (save-match-data - (let ((edir (file-name-as-directory (expand-file-name dir))) - (ddir (file-name-as-directory (expand-file-name default-directory)))) - (cons - (if (string= ddir edir) - (concat prompt ": ") - (let ((adir (abbreviate-file-name edir))) - (if (string-match "/\\([^/]+\\)/\\([^/]+\\)/\\'" adir) - (format "%s in …/%s/%s/: " prompt - (match-string 1 adir) (match-string 2 adir)) - (format "%s in %s: " prompt adir)))) - edir)))) + (let ((edir (file-name-as-directory (expand-file-name dir))) + (ddir (file-name-as-directory (expand-file-name default-directory)))) + (cons + (if (string= ddir edir) + (concat prompt ": ") + (format "%s (%s): " prompt (consult--abbreviate-directory dir))) + edir))) (defun consult--directory-prompt (prompt dir) "Return prompt and directory. @@ -831,7 +834,7 @@ Otherwise the `default-directory' is returned." (let ((this-command this-command)) (read-directory-name "Directory: " nil nil t)))) ((when-let (root (consult--project-root)) - (cons (format "%s in project %s: " prompt (consult--project-name root)) + (cons (format "%s (Project %s): " prompt (consult--project-name root)) root))) (t (consult--directory-prompt-1 prompt default-directory)))) @@ -2801,12 +2804,11 @@ changed if the START prefix argument is set. The symbol at point and the last ;;;;; Command: consult-line-multi -(defun consult--line-multi-candidates (query) +(defun consult--line-multi-candidates (buffers) "Collect the line candidates from multiple buffers. -QUERY is passed to `consult--buffer-query'." +BUFFERS is the list of buffers." (or (apply #'nconc - (consult--buffer-map - (apply #'consult--buffer-query query) + (consult--buffer-map buffers #'consult--line-candidates 'top most-positive-fixnum)) (user-error "No lines"))) @@ -2819,16 +2821,12 @@ non-nil, all buffers are searched. Optional INITIAL input can be provided. See `consult-line' for more information. In order to search a subset of buffers, QUERY can be set to a plist according to `consult--buffer-query'." (interactive "P") - (let ((scope "Multiple buffers")) - (unless (keywordp (car-safe query)) - (let ((project (and (not query) (consult--project-root)))) - (setq query `(:sort alpha :directory ,project) - scope (if project - (format "Project %s" (consult--project-name project)) - "All buffers")))) + (unless (keywordp (car-safe query)) + (setq query (list :sort 'alpha :directory (and (not query) 'project)))) + (let ((buffers (consult--buffer-query-prompt "Go to line" query))) (consult--line - (consult--line-multi-candidates query) - :prompt (format "Go to line (%s): " scope) + (consult--line-multi-candidates (cdr buffers)) + :prompt (car buffers) :initial initial :group #'consult--line-group))) @@ -3750,8 +3748,32 @@ The command supports previewing the currently selected theme." nil))) (nconc (nreverse hidden) buffers (list (current-buffer))))) +(defun consult--normalize-directory (dir) + "Normalize directory DIR. +DIR can be project, nil or a path." + (cond + ((eq dir 'project) (consult--project-root)) + (dir (expand-file-name dir)))) + +(defun consult--buffer-query-prompt (prompt query) + "Buffer query function returning a scope description. +PROMPT is the prompt format string. +QUERY is passed to `consult--buffer-query'." + (let* ((dir (plist-get query :directory)) + (ndir (consult--normalize-directory dir)) + (buffers (apply #'consult--buffer-query :directory ndir query)) + (count (length buffers))) + (cons (format "%s (%d buffer%s%s): " prompt count + (if (= count 1) "" "s") + (cond + ((and ndir (eq dir 'project)) + (format ", Project %s" (consult--project-name ndir))) + (ndir (concat ", " (consult--abbreviate-directory ndir))) + (t ""))) + buffers))) + (cl-defun consult--buffer-query (&key sort directory mode as predicate (filter t) - include (exclude consult-buffer-filter) ) + include (exclude consult-buffer-filter)) "Buffer query function. DIRECTORY can either be project or a path. SORT can be visibility, alpha or nil. @@ -3764,10 +3786,7 @@ AS is a conversion function." ;; This function is the backbone of most `consult-buffer' source. The ;; function supports filtering by various criteria which are used throughout ;; Consult. - (when-let (root (pcase-exhaustive directory - ('project (consult--project-root)) - ('nil t) - ((pred stringp) (expand-file-name directory)))) + (when-let (root (or (consult--normalize-directory directory) t)) (let ((buffers (buffer-list))) (when sort (setq buffers (funcall (intern (format "consult--buffer-sort-%s" sort)) buffers)))