From a411471f262408ccbd1fa68d75d3d6a454d0afdb Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Sat, 5 Dec 2015 10:55:33 +0200 Subject: [PATCH] Make eyebrowse workspaces local to perspective Integrates persp-mode and eyebrowse, so each perspective has its own set of eyebrowse workspaces. --- .../spacemacs-layouts/funcs.el | 41 +++++++++++++++++++ .../spacemacs-layouts/packages.el | 7 +++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/layers/+window-management/spacemacs-layouts/funcs.el b/layers/+window-management/spacemacs-layouts/funcs.el index e48ba980e464..890e9fec6a7c 100644 --- a/layers/+window-management/spacemacs-layouts/funcs.el +++ b/layers/+window-management/spacemacs-layouts/funcs.el @@ -133,3 +133,44 @@ Cancels autosave on exiting perspectives mode." (when spacemacs--layouts-autosave-timer (cancel-timer spacemacs--layouts-autosave-timer) (setq spacemacs--layouts-autosave-timer nil)))) + +;; Eyebrowse - allow perspective-local workspaces -------------------------- + +(defun spacemacs/load-eyebrowse-for-perspective (&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." + (let* ((persp (get-frame-persp frame)) + (window-configs (persp-parameter 'eyebrowse-window-configs persp)) + (current-slot (persp-parameter 'eyebrowse-current-slot persp)) + (last-slot (persp-parameter 'eyebrowse-last-slot persp))) + (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) + (spacemacs/save-eyebrowse-for-perspective frame)))) + +(defun spacemacs/update-eyebrowse-for-perspective (_new-persp-name) + "Update and save current frame's eyebrowse workspace to its perspective. +Parameter _NEW-PERSP-NAME is ignored, and exists only for compatibility with +`persp-before-switch-functions'." + (eyebrowse--update-window-config-element + (eyebrowse--current-window-config (eyebrowse--get 'current-slot) + (eyebrowse--get 'current-tag))) + (spacemacs/save-eyebrowse-for-perspective)) + +(defun spacemacs/save-eyebrowse-for-perspective (&optional frame) + "Save FRAME's eyebrowse workspace to FRAME's perspective. +FRAME defaults to the current frame." + (let ((persp (get-frame-persp frame))) + (set-persp-parameter + 'eyebrowse-window-configs (eyebrowse--get 'window-configs frame) persp) + (set-persp-parameter + 'eyebrowse-current-slot (eyebrowse--get 'current-slot frame) persp) + (set-persp-parameter + 'eyebrowse-last-slot (eyebrowse--get 'last-slot frame) persp))) diff --git a/layers/+window-management/spacemacs-layouts/packages.el b/layers/+window-management/spacemacs-layouts/packages.el index 07064abb3a5c..a5b168c5c8fc 100644 --- a/layers/+window-management/spacemacs-layouts/packages.el +++ b/layers/+window-management/spacemacs-layouts/packages.el @@ -9,7 +9,7 @@ ;; This file is not part of GNU Emacs. ;; ;;; License: GPLv3 -(setq spacemacs-layouts-packages '(persp-mode spaceline)) +(setq spacemacs-layouts-packages '(persp-mode spaceline eyebrowse)) (defun spacemacs-layouts/init-persp-mode () (use-package persp-mode @@ -298,3 +298,8 @@ format so they are supported by the (or (not (equal persp-nil-name (safe-persp-name (get-frame-persp)))) dotspacemacs-display-default-layout)))) + +(defun spacemacs-layouts/post-init-eyebrowse () + (add-hook 'persp-before-switch-functions #'spacemacs/update-eyebrowse-for-perspective) + (add-hook 'eyebrowse-post-window-switch-hook #'spacemacs/save-eyebrowse-for-perspective) + (add-hook 'persp-activated-hook #'spacemacs/load-eyebrowse-for-perspective))