doomemacs/modules/completion/vertico/autoload/workspaces.el
Henrik Lissner ad6a3d0f33
refactor: deprecate featurep! for modulep!
featurep! will be renamed modulep! in the future, so it's been
deprecated. They have identical interfaces, and can be replaced without
issue.

featurep! was never quite the right name for this macro. It implied that
it had some connection to featurep, which it doesn't (only that it was
similar in purpose; still, Doom modules are not features). To undo such
implications and be consistent with its namespace (and since we're
heading into a storm of breaking changes with the v3 release anyway),
now was the best opportunity to begin the transition.
2022-08-14 20:43:35 +02:00

93 lines
4.4 KiB
EmacsLisp

;;; completion/vertico/autoload/workspaces.el -*- lexical-binding: t; -*-
;;;###if (modulep! :ui workspaces)
(defun +vertico--workspace-buffer-state ()
(let ((preview
;; Only preview in current window and other window.
;; Preview in frames and tabs is not possible since these don't get cleaned up.
(if (memq consult--buffer-display
'(switch-to-buffer switch-to-buffer-other-window))
(let ((orig-buf (current-buffer))
other-win
cleanup-buffers)
(lambda (action cand)
(when (eq action 'preview)
(when (and (eq consult--buffer-display #'switch-to-buffer-other-window)
(not other-win))
(switch-to-buffer-other-window orig-buf)
(setq other-win (selected-window)))
(let ((win (or other-win (selected-window))))
(when (window-live-p win)
(with-selected-window win
(cond
((and cand (get-buffer cand))
(unless (+workspace-contains-buffer-p cand)
(cl-pushnew cand cleanup-buffers))
(switch-to-buffer cand 'norecord))
((buffer-live-p orig-buf)
(switch-to-buffer orig-buf 'norecord)
(mapc #'persp-remove-buffer cleanup-buffers)))))))))
#'ignore)))
(lambda (action cand)
(funcall preview action cand))))
(defun +vertico--workspace-generate-sources ()
"Generate list of consult buffer sources for all workspaces"
(let* ((active-workspace (+workspace-current-name))
(workspaces (+workspace-list-names))
(key-range (append (cl-loop for i from ?1 to ?9 collect i)
(cl-loop for i from ?a to ?z collect i)
(cl-loop for i from ?A to ?Z collect i)))
(last-i (length workspaces))
(i 0))
(mapcar (lambda (name)
(cl-incf i)
`(:name ,name
:hidden ,(not (string= active-workspace name))
:narrow ,(nth (1- i) key-range)
:category buffer
:state +vertico--workspace-buffer-state
:items ,(lambda ()
(consult--buffer-query
:sort 'visibility
:as #'buffer-name
:predicate
(lambda (buf)
(when-let (workspace (+workspace-get name t))
(+workspace-contains-buffer-p buf workspace)))))))
(+workspace-list-names))))
(autoload 'consult--multi "consult")
;;;###autoload
(defun +vertico/switch-workspace-buffer (&optional force-same-workspace)
"Switch to another buffer in the same or a specified workspace.
Type the workspace's number (starting from 1) followed by a space to display its
buffer list. Selecting a buffer in another workspace will switch to that
workspace instead. If FORCE-SAME-WORKSPACE (the prefix arg) is non-nil, that
buffer will be opened in the current workspace instead."
(interactive "P")
(when-let (buffer (consult--multi (+vertico--workspace-generate-sources)
:require-match
(confirm-nonexistent-file-or-buffer)
:prompt (format "Switch to buffer (%s): "
(+workspace-current-name))
:history 'consult--buffer-history
:sort nil))
(let ((origin-workspace (plist-get (cdr buffer) :name)))
;; Switch to the workspace the buffer belongs to, maybe
(if (or (equal origin-workspace (+workspace-current-name))
force-same-workspace)
(funcall consult--buffer-display (car buffer))
(+workspace-switch origin-workspace)
(message "Switched to %S workspace" origin-workspace)
(if-let (window (get-buffer-window (car buffer)))
(select-window window)
(funcall consult--buffer-display (car buffer)))))))
;;;###autoload
(defun +vertico/embark-open-in-new-workspace (x)
"Open X (a file) in a new workspace."
(interactive)
(+workspace/new)
(find-file x))