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
|
|
|
|
;; file-based session persistence. The switch from workgroups2 was motivated by
|
|
|
|
;; performance. Workgroups2 wasn't entirely stable either.
|
2017-02-04 03:21:04 -05:00
|
|
|
|
2017-02-09 04:22:08 -05:00
|
|
|
(@use-package persp-mode :demand t
|
2017-02-04 03:21:04 -05:00
|
|
|
:init
|
2017-02-08 01:54:24 -05:00
|
|
|
(setq persp-autokill-buffer-on-remove 'kill-weak
|
|
|
|
persp-nil-name "main"
|
|
|
|
persp-auto-save-fname "_autosave"
|
|
|
|
persp-save-dir (concat doom-cache-dir "workspaces/")
|
|
|
|
persp-set-last-persp-for-new-frames nil
|
|
|
|
persp-auto-resume-time (if (display-graphic-p) 0.01 -1)
|
|
|
|
persp-switch-to-added-buffer nil)
|
2017-02-04 03:21:04 -05:00
|
|
|
|
|
|
|
:config
|
2017-02-09 04:22:08 -05:00
|
|
|
(@add-hook emacs-startup (persp-mode 1))
|
|
|
|
|
2017-02-08 01:54:24 -05:00
|
|
|
;; Ensure unreal/popup buffers aren't saved
|
2017-02-08 17:56:27 -05:00
|
|
|
(push (lambda (buf) (doom-popup-p (get-buffer-window buf)))
|
|
|
|
persp-filter-save-buffers-functions)
|
|
|
|
(push (lambda (buf) (not (doom-real-buffer-p buf)))
|
|
|
|
persp-common-buffer-filter-functions)
|
2017-02-08 01:54:24 -05:00
|
|
|
|
|
|
|
;; Auto-add buffers when opening them. Allows a perspective-specific buffer list.
|
|
|
|
(defun doom*persp-auto-add-buffer (buffer &rest _)
|
|
|
|
(when (and persp-mode (not persp-temporarily-display-buffer))
|
|
|
|
(persp-add-buffer buffer (get-current-persp) nil)))
|
|
|
|
(advice-add 'switch-to-buffer :after 'doom*persp-auto-add-buffer)
|
|
|
|
(advice-add 'display-buffer :after 'doom*persp-auto-add-buffer)
|
|
|
|
|
|
|
|
;; TODO Integration with projectile
|
|
|
|
;; ;; Create a new workspace on project switch
|
|
|
|
;; (defun doom|new-workspace-on-project-change ()
|
|
|
|
;; (+workspace-new (f-filename (doom-project-root))))
|
|
|
|
;; (add-hook 'projectile-before-switch-project-hook 'doom|new-workspace-on-project-change)
|
|
|
|
|
|
|
|
;; TODO Test per-frame perspectives
|
|
|
|
|
2017-02-08 17:56:27 -05:00
|
|
|
;; Restore popups on load
|
|
|
|
(defun +workspaces*reinit-popups ()
|
|
|
|
(dolist (window (window-list))
|
|
|
|
(let ((plist (window-parameter window 'popup)))
|
|
|
|
(when plist (doom-popup--init window plist)))))
|
|
|
|
(advice-add 'persp-load-state-from-file :after '+workspaces*reinit-popups))
|
2017-02-08 01:54:24 -05:00
|
|
|
|
2017-02-09 04:22:08 -05:00
|
|
|
(@after ivy
|
2017-02-08 01:54:24 -05:00
|
|
|
(defun +workspaces|ivy-ignore-non-persp-buffers (b)
|
|
|
|
(when persp-mode
|
|
|
|
(let ((persp (get-current-persp)))
|
|
|
|
(and persp (not (persp-contain-buffer-p b persp))))))
|
|
|
|
(pushnew '+workspaces|ivy-ignore-non-persp-buffers ivy-ignore-buffers)
|
|
|
|
|
|
|
|
(setq ivy-sort-functions-alist
|
|
|
|
(append ivy-sort-functions-alist
|
|
|
|
'((persp-kill-buffer . nil)
|
|
|
|
(persp-remove-buffer . nil)
|
|
|
|
(persp-add-buffer . nil)
|
|
|
|
(persp-switch . nil)
|
|
|
|
(persp-window-switch . nil)
|
|
|
|
(persp-frame-switch . nil)
|
|
|
|
(+workspace/switch-to . nil)
|
|
|
|
(+workspace/delete . nil)))))
|
2017-02-04 03:21:04 -05:00
|
|
|
|
|
|
|
|