2017-02-04 03:21:04 -05:00
|
|
|
;;; feature/workspaces/config.el
|
|
|
|
|
2017-02-08 01:54:24 -05:00
|
|
|
;; `persp-mode' gives me workspaces, a workspace-restricted `buffer-list', and
|
2017-02-11 00:52:25 -05:00
|
|
|
;; file-based session persistence. I had used workgroups2 for this, but
|
|
|
|
;; abandoned it because of its instability and impact on performance.
|
|
|
|
;; `persp-mode' has proven faster and more reliable (and it's still maintained).
|
|
|
|
;;
|
2017-02-22 04:28:20 -05:00
|
|
|
;; I've disabled auto-load/save. I prefer that session persistence be manual.
|
|
|
|
;; You can save a session with :ss or `+workspace/save-session', and load the
|
|
|
|
;; last saved session with :sl or `+workspace/load-session'.
|
|
|
|
;;
|
2017-02-11 00:52:25 -05:00
|
|
|
;; 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.")
|
|
|
|
|
2017-02-04 03:21:04 -05:00
|
|
|
|
2017-02-23 00:06:12 -05:00
|
|
|
(def-package! persp-mode :demand t
|
2017-02-19 18:40:39 -05:00
|
|
|
:config
|
2017-02-08 01:54:24 -05:00
|
|
|
(setq persp-autokill-buffer-on-remove 'kill-weak
|
|
|
|
persp-nil-name "main"
|
2017-02-11 00:52:25 -05:00
|
|
|
persp-auto-save-fname "autosave"
|
2017-02-08 01:54:24 -05:00
|
|
|
persp-save-dir (concat doom-cache-dir "workspaces/")
|
|
|
|
persp-set-last-persp-for-new-frames nil
|
2017-02-22 04:28:20 -05:00
|
|
|
persp-switch-to-added-buffer nil
|
|
|
|
|
|
|
|
;; Don't auto-load on startup
|
2017-02-19 18:40:39 -05:00
|
|
|
persp-auto-resume-time -1
|
2017-02-22 04:28:20 -05:00
|
|
|
;; Don't auto-save
|
|
|
|
persp-auto-save-opt 0)
|
2017-02-04 03:21:04 -05:00
|
|
|
|
2017-02-19 18:40:39 -05:00
|
|
|
(add-hook 'after-init-hook 'persp-mode)
|
|
|
|
|
|
|
|
(define-key persp-mode-map [remap delete-window] '+workspace/close-window-or-workspace)
|
2017-02-09 04:22:08 -05:00
|
|
|
|
2017-02-08 01:54:24 -05:00
|
|
|
;; Auto-add buffers when opening them. Allows a perspective-specific buffer list.
|
2017-02-11 00:52:25 -05:00
|
|
|
(defun +workspaces*auto-add-buffer (buffer &rest _)
|
2017-02-19 18:40:39 -05:00
|
|
|
(when (and persp-mode
|
|
|
|
(not persp-temporarily-display-buffer)
|
|
|
|
(doom-real-buffer-p buffer))
|
|
|
|
(persp-add-buffer buffer (get-current-persp) nil)
|
|
|
|
(redisplay)))
|
2017-02-11 00:52:25 -05:00
|
|
|
(advice-add 'switch-to-buffer :after '+workspaces*auto-add-buffer)
|
|
|
|
(advice-add 'display-buffer :after '+workspaces*auto-add-buffer)
|
2017-02-08 01:54:24 -05:00
|
|
|
|
2017-02-21 00:44:06 -05:00
|
|
|
;; Create a new workspace on project switch
|
|
|
|
(defun doom|new-workspace-on-project-change ()
|
|
|
|
(let ((project-name (projectile-project-name)))
|
|
|
|
(if (+workspace-exists-p project-name)
|
|
|
|
(+workspace/switch-to project-name)
|
|
|
|
(+workspace/new project-name))))
|
|
|
|
(add-hook 'projectile-before-switch-project-hook 'doom|new-workspace-on-project-change)
|
2017-02-08 01:54:24 -05:00
|
|
|
|
|
|
|
;; TODO Test per-frame perspectives
|
|
|
|
|
2017-02-19 18:40:39 -05:00
|
|
|
;; Be quiet when saving
|
2017-02-23 00:06:12 -05:00
|
|
|
(defun +workspace*silence (orig-fn &rest args) (quiet! (apply orig-fn args)))
|
2017-02-19 18:40:39 -05:00
|
|
|
(advice-add 'persp-save-state-to-file :around '+workspace*silence)
|
2017-02-11 00:52:25 -05:00
|
|
|
|
2017-02-19 18:40:39 -05:00
|
|
|
;; Add a hook to session loading
|
2017-02-11 00:52:25 -05:00
|
|
|
(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)
|
|
|
|
|
2017-02-08 17:56:27 -05:00
|
|
|
;; Restore popups on load
|
2017-02-11 00:52:25 -05:00
|
|
|
(defun +workspaces|restore-popups (windows)
|
|
|
|
(dolist (window windows)
|
2017-02-19 18:40:39 -05:00
|
|
|
(when-let (plist (window-parameter window 'popup))
|
2017-02-23 00:07:28 -05:00
|
|
|
(with-selected-window window
|
|
|
|
(unless doom-popup-mode
|
|
|
|
(doom-popup-mode +1))))))
|
2017-02-11 00:52:25 -05:00
|
|
|
(add-hook '+workspaces-load-session-hook '+workspaces|restore-popups))
|
2017-02-08 01:54:24 -05:00
|
|
|
|