diff --git a/modules/emacs/ibuffer/autoload/workspaces.el b/modules/emacs/ibuffer/autoload/workspaces.el index ed3ed14db..0a05ceed2 100644 --- a/modules/emacs/ibuffer/autoload/workspaces.el +++ b/modules/emacs/ibuffer/autoload/workspaces.el @@ -12,3 +12,24 @@ "Open an ibuffer window for the current workspace" (interactive) (+ibuffer-workspace (+workspace-current-name))) + +;;;###autoload +(defun +ibuffer/visit-workspace-buffer (&optional select-first) + "Visit buffer, but switch to its workspace if it exists." + (interactive "P") + (let ((buf (ibuffer-current-buffer t))) + (if (not (buffer-live-p buf)) + (user-error "Not a valid or live buffer: %s" buf) + (when-let (workspaces + (cl-loop for wk in (+workspace-list) + if (+workspace-contains-buffer-p buf wk) + collect wk)) + (+workspace-switch + (persp-name + (if (and (not select-first) (cdr workspaces)) + (+workspace-get + (or (completing-read "Select workspace: " (mapcar #'persp-name workspaces)) + (user-error "Aborted"))) + (car workspaces))))) + (persp-add-buffer buf) ; then add the buffer to the current workspace + (switch-to-buffer buf)))) diff --git a/modules/emacs/ibuffer/config.el b/modules/emacs/ibuffer/config.el index 4e8cde2d7..daa0b3a43 100644 --- a/modules/emacs/ibuffer/config.el +++ b/modules/emacs/ibuffer/config.el @@ -44,7 +44,9 @@ "Filter for workspace buffers" (:reader (+workspace-get (read-string "workspace name: ")) :description "workspace") - (memq buf (+workspace-buffer-list qualifier)))) + (memq buf (+workspace-buffer-list qualifier))) + + (define-key ibuffer-mode-map [remap ibuffer-visit-buffer] #'+ibuffer/visit-workspace-buffer)) (when (featurep! :completion ivy) (defadvice! +ibuffer--use-counsel-maybe-a (_file &optional _wildcards)