feature/workspaces: refactor; more reliable session/popup persistence
This commit is contained in:
parent
4ef784eff6
commit
6a3e879501
2 changed files with 43 additions and 22 deletions
|
@ -1,8 +1,5 @@
|
||||||
;;; feature/workspaces/autoload.el
|
;;; feature/workspaces/autoload.el
|
||||||
|
|
||||||
(defvar +workspace-session-file "_sessions"
|
|
||||||
"The file basename in which to store entire perspective sessions.")
|
|
||||||
|
|
||||||
(defvar +workspace-workspace-file "_workspaces"
|
(defvar +workspace-workspace-file "_workspaces"
|
||||||
"The file basename in which to store single workspace perspectives.")
|
"The file basename in which to store single workspace perspectives.")
|
||||||
|
|
||||||
|
@ -173,7 +170,8 @@ session."
|
||||||
"Session to load: "
|
"Session to load: "
|
||||||
(-map 'f-filename
|
(-map 'f-filename
|
||||||
(f--files persp-save-dir
|
(f--files persp-save-dir
|
||||||
(not (string-prefix-p "_" (f-filename it)))))))))
|
(not (string-prefix-p "_" (f-filename it)))))
|
||||||
|
nil t))))
|
||||||
(+workspace-load-session name)
|
(+workspace-load-session name)
|
||||||
(+workspace/display))
|
(+workspace/display))
|
||||||
|
|
||||||
|
@ -203,9 +201,10 @@ the session as."
|
||||||
(f--files persp-save-dir
|
(f--files persp-save-dir
|
||||||
(not (string-prefix-p "_" (f-filename it)))))))))
|
(not (string-prefix-p "_" (f-filename it)))))))))
|
||||||
(condition-case ex
|
(condition-case ex
|
||||||
|
(let ((name (or name (+workspace-current-name))))
|
||||||
(if (+workspace-save-session name)
|
(if (+workspace-save-session name)
|
||||||
(+workspace-message (format "Saved session as %s" name) 'success)
|
(+workspace-message (format "Saved session as %s" name) 'success)
|
||||||
(error "Couldn't save session as %s" name))
|
(error "Couldn't save session as %s" name)))
|
||||||
'(error (+workspace-error (cadr ex) t))))
|
'(error (+workspace-error (cadr ex) t))))
|
||||||
|
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
|
@ -247,9 +246,9 @@ workspace to delete."
|
||||||
(+workspace-switch persp-nil-name)
|
(+workspace-switch persp-nil-name)
|
||||||
(delete-other-windows-internal)
|
(delete-other-windows-internal)
|
||||||
(switch-to-buffer doom-fallback-buffer)
|
(switch-to-buffer doom-fallback-buffer)
|
||||||
(--each (unless (eq (buffer-name it) doom-fallback-buffer)
|
(--each (buffer-list)
|
||||||
(kill-buffer it))
|
(unless (eq (buffer-name it) doom-fallback-buffer)
|
||||||
(buffer-list)))
|
(kill-buffer it))))
|
||||||
|
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
(defun +workspace/new (&optional name clone-p)
|
(defun +workspace/new (&optional name clone-p)
|
||||||
|
@ -328,8 +327,10 @@ the workspace and move to the next."
|
||||||
(doom/popup-close)
|
(doom/popup-close)
|
||||||
(let ((current-persp-name (+workspace-current-name)))
|
(let ((current-persp-name (+workspace-current-name)))
|
||||||
(cond ((or (equal current-persp-name persp-nil-name)
|
(cond ((or (equal current-persp-name persp-nil-name)
|
||||||
(not (one-window-p t)))
|
(= (length (doom-visible-windows)) 1))
|
||||||
(delete-window))
|
(if (bound-and-true-p evil-mode)
|
||||||
|
(evil-window-delete)
|
||||||
|
(delete-window)))
|
||||||
((> (length (+workspace-list)) 1)
|
((> (length (+workspace-list)) 1)
|
||||||
(let* ((names (+workspace-list))
|
(let* ((names (+workspace-list))
|
||||||
(index (--find-index (equal current-persp-name it) names)))
|
(index (--find-index (equal current-persp-name it) names)))
|
||||||
|
|
|
@ -1,17 +1,25 @@
|
||||||
;;; feature/workspaces/config.el
|
;;; feature/workspaces/config.el
|
||||||
|
|
||||||
;; `persp-mode' gives me workspaces, a workspace-restricted `buffer-list', and
|
;; `persp-mode' gives me workspaces, a workspace-restricted `buffer-list', and
|
||||||
;; file-based session persistence. The switch from workgroups2 was motivated by
|
;; file-based session persistence. I had used workgroups2 for this, but
|
||||||
;; performance. Workgroups2 wasn't entirely stable either.
|
;; abandoned it because of its instability and impact on performance.
|
||||||
|
;; `persp-mode' has proven faster and more reliable (and it's still maintained).
|
||||||
|
;;
|
||||||
|
;; Note: persp-mode requires `workgroups' for file persistence in Emacs 24.4.
|
||||||
|
|
||||||
|
(defvar +workspaces-load-session-hook nil
|
||||||
|
"A hook that runs when persp loads a new session.")
|
||||||
|
|
||||||
|
|
||||||
(@use-package persp-mode :demand t
|
(@use-package persp-mode :demand t
|
||||||
:init
|
:init
|
||||||
(setq persp-autokill-buffer-on-remove 'kill-weak
|
(setq persp-autokill-buffer-on-remove 'kill-weak
|
||||||
persp-nil-name "main"
|
persp-nil-name "main"
|
||||||
persp-auto-save-fname "_autosave"
|
persp-auto-save-fname "autosave"
|
||||||
persp-save-dir (concat doom-cache-dir "workspaces/")
|
persp-save-dir (concat doom-cache-dir "workspaces/")
|
||||||
persp-set-last-persp-for-new-frames nil
|
persp-set-last-persp-for-new-frames nil
|
||||||
persp-auto-resume-time (if (display-graphic-p) 0.01 -1)
|
persp-auto-resume-time (if (display-graphic-p) 0.01 -1)
|
||||||
|
persp-auto-save-opt 0
|
||||||
persp-switch-to-added-buffer nil)
|
persp-switch-to-added-buffer nil)
|
||||||
|
|
||||||
:config
|
:config
|
||||||
|
@ -24,13 +32,13 @@
|
||||||
persp-common-buffer-filter-functions)
|
persp-common-buffer-filter-functions)
|
||||||
|
|
||||||
;; Auto-add buffers when opening them. Allows a perspective-specific buffer list.
|
;; Auto-add buffers when opening them. Allows a perspective-specific buffer list.
|
||||||
(defun doom*persp-auto-add-buffer (buffer &rest _)
|
(defun +workspaces*auto-add-buffer (buffer &rest _)
|
||||||
(when (and persp-mode (not persp-temporarily-display-buffer))
|
(when (and persp-mode (not persp-temporarily-display-buffer))
|
||||||
(persp-add-buffer buffer (get-current-persp) nil)))
|
(persp-add-buffer buffer (get-current-persp) nil)))
|
||||||
(advice-add 'switch-to-buffer :after 'doom*persp-auto-add-buffer)
|
(advice-add 'switch-to-buffer :after '+workspaces*auto-add-buffer)
|
||||||
(advice-add 'display-buffer :after 'doom*persp-auto-add-buffer)
|
(advice-add 'display-buffer :after '+workspaces*auto-add-buffer)
|
||||||
|
|
||||||
;; TODO Integration with projectile
|
;; TODO Integration with projectile?
|
||||||
;; ;; Create a new workspace on project switch
|
;; ;; Create a new workspace on project switch
|
||||||
;; (defun doom|new-workspace-on-project-change ()
|
;; (defun doom|new-workspace-on-project-change ()
|
||||||
;; (+workspace-new (f-filename (doom-project-root))))
|
;; (+workspace-new (f-filename (doom-project-root))))
|
||||||
|
@ -38,12 +46,24 @@
|
||||||
|
|
||||||
;; TODO Test per-frame perspectives
|
;; TODO Test per-frame perspectives
|
||||||
|
|
||||||
|
;; We use this instead of persp's native autosave. Why? So the "Wrote
|
||||||
|
;; .../_autosave" message appears AFTER the quit confirmation prompt!
|
||||||
|
;;
|
||||||
|
;; ...I need help.
|
||||||
|
(defun +workspace|save-on-quit ()
|
||||||
|
(when persp-mode (@quiet (persp-save-state-to-file))))
|
||||||
|
(add-hook 'kill-emacs-hook '+workspace|save-on-quit)
|
||||||
|
|
||||||
|
(defun +workspaces*reinit-popups (&rest _)
|
||||||
|
(run-hook-with-args '+workspaces-load-session-hook (window-list)))
|
||||||
|
(advice-add 'persp-load-state-from-file :after '+workspaces*reinit-popups)
|
||||||
|
|
||||||
;; Restore popups on load
|
;; Restore popups on load
|
||||||
(defun +workspaces*reinit-popups ()
|
(defun +workspaces|restore-popups (windows)
|
||||||
(dolist (window (window-list))
|
(dolist (window windows)
|
||||||
(let ((plist (window-parameter window 'popup)))
|
(let ((plist (window-parameter window 'popup)))
|
||||||
(when plist (doom-popup--init window plist)))))
|
(when plist (doom-popup--init window plist)))))
|
||||||
(advice-add 'persp-load-state-from-file :after '+workspaces*reinit-popups))
|
(add-hook '+workspaces-load-session-hook '+workspaces|restore-popups))
|
||||||
|
|
||||||
(@after ivy
|
(@after ivy
|
||||||
(defun +workspaces|ivy-ignore-non-persp-buffers (b)
|
(defun +workspaces|ivy-ignore-non-persp-buffers (b)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue