Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| ;;; feature/workspaces/autoload.el | |
| ;;;###autoload | |
| (defun +workspace-exists-p (name) | |
| "Returns t if NAME is the name of an existing workspace." | |
| (when (symbolp name) | |
| (setq name (symbol-name name))) | |
| (unless (stringp name) | |
| (error "Expected a string, got a %s" (type-of name))) | |
| (member name (persp-names-current-frame-fast-ordered))) | |
| ;;;###autoload | |
| (defun +workspace-switch-last () | |
| "Switches to the last workspace" | |
| (interactive) | |
| (if (+workspace-exists-p +workspaces-last-persp) | |
| (persp-switch +workspaces-last-persp) | |
| (error "No previous workspace."))) | |
| ;;;###autoload | |
| (defun +workspace-switch-project (arg) | |
| (interactive "P") | |
| (ivy-read "Switch to Project Perspective: " | |
| (if (projectile-project-p) | |
| (cons (abbreviate-file-name (projectile-project-root)) | |
| (projectile-relevant-known-projects)) | |
| projectile-known-projects) | |
| :action (lambda (project) | |
| (let ((persp-reset-windows-on-nil-window-conf t)) | |
| (persp-switch project) | |
| (let ((projectile-completion-system 'ivy)) | |
| (projectile-switch-project-by-name project)))))) | |
| ;; BMACS - eyebrowse integration | |
| ;; Eyebrowse and Persp integration (from spacemacs - spacemacs-layouts/funcs.el) | |
| ;;;###autoload | |
| (defun workspaces/get-persp-workspace (&optional persp frame) | |
| "Get the correct workspace parameters for perspective. | |
| PERSP is the perspective, and defaults to the current perspective. | |
| FRAME is the frame where the parameters are expected to be used, and | |
| defaults to the current frame." | |
| (let ((param-names (if (display-graphic-p frame) | |
| '(gui-eyebrowse-window-configs | |
| gui-eyebrowse-current-slot | |
| gui-eyebrowse-last-slot) | |
| '(term-eyebrowse-window-configs | |
| term-eyebrowse-current-slot | |
| term-eyebrowse-last-slot)))) | |
| (--map (persp-parameter it persp) param-names))) | |
| ;;;###autoload | |
| (defun workspaces/set-persp-workspace (workspace-params &optional persp frame) | |
| "Set workspace parameters for perspective. | |
| WORKSPACE-PARAMS should be a list containing 3 elements in this order: | |
| - window-configs, as returned by (eyebrowse--get 'window-configs) | |
| - current-slot, as returned by (eyebrowse--get 'current-slot) | |
| - last-slot, as returned by (eyebrowse--get 'last-slot) | |
| PERSP is the perspective, and defaults to the current perspective. | |
| FRAME is the frame where the parameters came from, and defaults to the | |
| current frame. | |
| Each perspective has two sets of workspace parameters: one set for | |
| graphical frames, and one set for terminal frames." | |
| (let ((param-names (if (display-graphic-p frame) | |
| '(gui-eyebrowse-window-configs | |
| gui-eyebrowse-current-slot | |
| gui-eyebrowse-last-slot) | |
| '(term-eyebrowse-window-configs | |
| term-eyebrowse-current-slot | |
| term-eyebrowse-last-slot)))) | |
| (--zip-with (set-persp-parameter it other persp) | |
| param-names workspace-params))) | |
| ;;;###autoload | |
| (defun workspaces/load-eyebrowse-for-perspective (type &optional frame) | |
| "Load an eyebrowse workspace according to a perspective's parameters. | |
| FRAME's perspective is the perspective that is considered, defaulting to | |
| the current frame's perspective. | |
| If the perspective doesn't have a workspace, create one." | |
| (when (eq type 'frame) | |
| (let* ((workspace-params (workspaces/get-persp-workspace (get-frame-persp frame) frame)) | |
| (window-configs (nth 0 workspace-params)) | |
| (current-slot (nth 1 workspace-params)) | |
| (last-slot (nth 2 workspace-params))) | |
| (if window-configs | |
| (progn | |
| (eyebrowse--set 'window-configs window-configs frame) | |
| (eyebrowse--set 'current-slot current-slot frame) | |
| (eyebrowse--set 'last-slot last-slot frame) | |
| (eyebrowse--load-window-config current-slot)) | |
| (eyebrowse--set 'window-configs nil frame) | |
| (eyebrowse-init frame) | |
| (workspaces/save-eyebrowse-for-perspective frame))))) | |
| ;;;###autoload | |
| (defun workspaces/load-eyebrowse-after-loading-layout (_state-file _phash persp-names) | |
| "Bridge between `persp-after-load-state-functions' and | |
| `workspaces/load-eyebrowse-for-perspective'. | |
| _PHASH is the hash were the loaded perspectives were placed, and | |
| PERSP-NAMES are the names of these perspectives." | |
| (let ((cur-persp (get-current-persp))) | |
| ;; load eyebrowse for current perspective only if it was one of the loaded | |
| ;; perspectives | |
| (when (member (or (and cur-persp (persp-name cur-persp)) | |
| persp-nil-name) | |
| persp-names) | |
| (workspaces/load-eyebrowse-for-perspective 'frame)))) | |
| ;;;###autoload | |
| (defun workspaces/update-eyebrowse-for-perspective (&rest _args) | |
| "Update and save current frame's eyebrowse workspace to its perspective." | |
| (let* ((current-slot (eyebrowse--get 'current-slot)) | |
| (current-tag (nth 2 (assoc current-slot (eyebrowse--get 'window-configs))))) | |
| (eyebrowse--update-window-config-element | |
| (eyebrowse--current-window-config current-slot current-tag))) | |
| (workspaces/save-eyebrowse-for-perspective)) | |
| ;;;###autoload | |
| (defun workspaces/save-eyebrowse-for-perspective (&optional frame) | |
| "Save FRAME's eyebrowse workspace to FRAME's perspective. | |
| FRAME defaults to the current frame." | |
| (workspaces/set-persp-workspace (list (eyebrowse--get 'window-configs frame) | |
| (eyebrowse--get 'current-slot frame) | |
| (eyebrowse--get 'last-slot frame)) | |
| (get-frame-persp frame) | |
| frame)) |