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-03-13 14:21:42 -04:00
|
|
|
;; file-based session persistence. I had used workgroups2 before this, but
|
2017-02-11 00:52:25 -05:00
|
|
|
;; abandoned it because of its instability and impact on performance.
|
|
|
|
;; `persp-mode' has proven faster and more reliable (and it's still maintained).
|
|
|
|
;;
|
2017-03-13 14:21:42 -04:00
|
|
|
;; By default, sessions are auto-saved, but not auto-loaded. Use :ss or
|
|
|
|
;; `+workspace/save-session' to save, and :sl or `+workspace/load-session' to
|
|
|
|
;; load the last autosaved session. You can give sessions a custom name so they
|
|
|
|
;; can be loaded much later.
|
2017-02-22 04:28:20 -05:00
|
|
|
;;
|
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-04-10 18:21:42 -04:00
|
|
|
(defvar +workspaces-main "main"
|
2017-04-11 08:31:00 -04:00
|
|
|
"The name of the primary and initial workspace, which cannot be deleted or
|
|
|
|
renamed.")
|
2017-04-10 18:21:42 -04:00
|
|
|
|
2017-02-04 03:21:04 -05:00
|
|
|
|
2017-04-11 08:31:00 -04:00
|
|
|
;;
|
|
|
|
;; Plugins
|
|
|
|
;;
|
|
|
|
|
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
|
2017-04-10 18:21:42 -04:00
|
|
|
persp-nil-name "nil"
|
2017-04-12 11:27:31 -04:00
|
|
|
persp-nil-hidden t
|
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
|
2017-04-10 18:21:42 -04:00
|
|
|
persp-remove-buffers-from-nil-persp-behaviour nil
|
2017-02-25 01:36:41 -05:00
|
|
|
;; Don't restore winconf on new frames
|
|
|
|
persp-init-frame-behaviour t
|
|
|
|
persp-init-new-frame-behaviour-override 'auto-temp
|
2017-02-22 04:28:20 -05:00
|
|
|
;; Don't auto-load on startup
|
2017-02-19 18:40:39 -05:00
|
|
|
persp-auto-resume-time -1
|
2017-03-13 14:21:42 -04:00
|
|
|
;; auto-save on kill
|
|
|
|
persp-auto-save-opt 1)
|
2017-02-04 03:21:04 -05:00
|
|
|
|
2017-04-22 01:49:15 -04:00
|
|
|
(defun +workspaces|init (&rest _)
|
|
|
|
(unless persp-mode
|
|
|
|
(persp-mode +1))
|
2017-04-10 18:21:42 -04:00
|
|
|
;; The default perspective persp-mode makes (defined by `persp-nil-name') is
|
2017-04-11 08:31:00 -04:00
|
|
|
;; special and doesn't actually represent a real persp object, so buffers
|
|
|
|
;; can't really be assigned to it, among other quirks. We create a *real*
|
|
|
|
;; main workspace to fill this role.
|
2017-04-10 18:21:42 -04:00
|
|
|
(persp-add-new +workspaces-main)
|
2017-04-11 08:31:00 -04:00
|
|
|
;; Switch to it if we aren't auto-loading the last session
|
2017-04-22 01:49:15 -04:00
|
|
|
(when (or (= persp-auto-resume-time -1)
|
|
|
|
(equal (safe-persp-name (get-current-persp)) persp-nil-name))
|
2017-04-10 18:21:42 -04:00
|
|
|
(persp-frame-switch +workspaces-main)))
|
2017-02-19 18:40:39 -05:00
|
|
|
|
2017-04-22 01:49:15 -04:00
|
|
|
(add-hook! 'after-init-hook
|
|
|
|
(if (display-graphic-p)
|
|
|
|
(+workspaces|init)
|
|
|
|
(add-hook 'after-make-frame-functions '+workspaces|init)))
|
|
|
|
|
2017-04-17 02:17:10 -04:00
|
|
|
(define-key persp-mode-map [remap delete-window] #'+workspace/close-window-or-workspace)
|
2017-02-09 04:22:08 -05:00
|
|
|
|
2017-02-25 01:36:41 -05:00
|
|
|
;; Per-frame perspectives
|
|
|
|
(setq persp-init-new-frame-behaviour-override nil
|
|
|
|
persp-interactive-init-frame-behaviour-override
|
|
|
|
(lambda (frame &optional new-frame-p)
|
|
|
|
(select-frame frame)
|
|
|
|
(+workspace/new)
|
|
|
|
(set-frame-parameter frame 'assoc-persp (+workspace-current-name))))
|
2017-04-11 08:31:00 -04:00
|
|
|
|
2017-02-25 01:36:41 -05:00
|
|
|
(defun +workspaces*delete-frame-and-persp (frame)
|
2017-04-11 08:31:00 -04:00
|
|
|
"Delete workspace associated with current frame IF it has no real buffers."
|
2017-02-25 01:36:41 -05:00
|
|
|
(when (and (string= (or (frame-parameter frame 'assoc-persp) "") (+workspace-current-name))
|
|
|
|
(not (delq (doom-fallback-buffer) (doom-real-buffers-list))))
|
|
|
|
(+workspace/delete persp-name)))
|
2017-04-17 02:17:10 -04:00
|
|
|
(add-hook 'delete-frame-functions #'+workspaces*delete-frame-and-persp)
|
2017-02-25 01:36:41 -05:00
|
|
|
|
2017-02-11 00:52:25 -05:00
|
|
|
(defun +workspaces*auto-add-buffer (buffer &rest _)
|
2017-04-11 08:31:00 -04:00
|
|
|
"Auto-associate buffers with perspectives upon opening them. Allows a
|
|
|
|
perspective-specific buffer list via `doom-buffer-list'."
|
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-04-17 02:17:10 -04: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
|
|
|
(defun doom|new-workspace-on-project-change ()
|
2017-04-11 08:31:00 -04:00
|
|
|
"Create a new workspace when switching project with projectile."
|
2017-03-13 16:56:45 -04:00
|
|
|
(+workspace-switch (projectile-project-name) t))
|
2017-04-17 02:17:10 -04:00
|
|
|
(add-hook 'projectile-before-switch-project-hook #'doom|new-workspace-on-project-change)
|
2017-02-08 01:54:24 -05:00
|
|
|
|
2017-02-11 00:52:25 -05:00
|
|
|
(defun +workspaces*reinit-popups (&rest _)
|
2017-04-11 08:31:00 -04:00
|
|
|
"Runs `+workspaces-load-session-hook'."
|
2017-02-11 00:52:25 -05:00
|
|
|
(run-hook-with-args '+workspaces-load-session-hook (window-list)))
|
2017-04-17 02:17:10 -04:00
|
|
|
(advice-add #'persp-load-state-from-file :after #'+workspaces*reinit-popups)
|
2017-02-11 00:52:25 -05:00
|
|
|
|
|
|
|
(defun +workspaces|restore-popups (windows)
|
2017-04-11 08:31:00 -04:00
|
|
|
"Restore popup windows when loading a perspective from file."
|
2017-02-11 00:52:25 -05:00
|
|
|
(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
|
2017-03-13 14:21:56 -04:00
|
|
|
(setq-local doom-popup-rules plist)
|
2017-02-23 00:07:28 -05:00
|
|
|
(doom-popup-mode +1))))))
|
2017-04-17 02:17:10 -04:00
|
|
|
(add-hook '+workspaces-load-session-hook #'+workspaces|restore-popups))
|
2017-02-08 01:54:24 -05:00
|
|
|
|