2017-06-08 11:47:56 +02:00
|
|
|
;;; feature/workspaces/config.el -*- lexical-binding: t; -*-
|
2017-02-04 03:21:04 -05:00
|
|
|
|
2017-02-08 01:54:24 -05:00
|
|
|
;; `persp-mode' gives me workspaces, a workspace-restricted `buffer-list', and
|
2017-06-14 21:03:20 +02:00
|
|
|
;; file-based session persistence. I used workgroups2 before this, but abandoned
|
|
|
|
;; it because it was unstable and slow; `persp-mode' is neither (and still
|
|
|
|
;; maintained).
|
2017-02-11 00:52:25 -05:00
|
|
|
;;
|
2017-06-14 21:03:20 +02:00
|
|
|
;; By default, sessions are autosaved, but not autoloaded. Use :ss or
|
2017-03-13 14:21:42 -04:00
|
|
|
;; `+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
|
2017-06-14 21:03:20 +02:00
|
|
|
;; can be loaded later.
|
2017-02-22 04:28:20 -05:00
|
|
|
;;
|
2017-09-02 16:39:51 +02:00
|
|
|
;; NOTE persp-mode requires `workgroups' for file persistence in Emacs 24.4.
|
2017-02-11 00:52:25 -05:00
|
|
|
|
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-06-08 11:47:56 +02:00
|
|
|
(def-package! persp-mode
|
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-11-04 22:34:55 +01:00
|
|
|
persp-save-dir (concat doom-etc-dir "workspaces/")
|
2017-02-08 01:54:24 -05:00
|
|
|
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
|
2017-06-14 21:07:23 +02:00
|
|
|
persp-auto-save-opt (if noninteractive 0 1))
|
2017-02-04 03:21:04 -05:00
|
|
|
|
2017-06-28 15:16:30 +02:00
|
|
|
;; Bootstrap
|
2017-08-06 16:30:53 +02:00
|
|
|
(add-hook 'doom-post-init-hook #'+workspaces|init)
|
2017-06-12 00:20:30 +02:00
|
|
|
(add-hook 'after-make-frame-functions #'+workspaces|init)
|
|
|
|
|
2017-06-28 15:16:30 +02:00
|
|
|
(define-key persp-mode-map [remap delete-window] #'+workspace/close-window-or-workspace)
|
|
|
|
|
2017-08-06 18:38:19 +02:00
|
|
|
;; per-frame and per-project workspaces
|
2017-06-28 15:16:30 +02:00
|
|
|
(setq persp-init-new-frame-behaviour-override nil
|
2017-08-06 18:38:19 +02:00
|
|
|
persp-interactive-init-frame-behaviour-override #'+workspace-on-new-frame
|
|
|
|
projectile-switch-project-action #'projectile-find-file)
|
2017-06-28 15:16:30 +02:00
|
|
|
(add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace-maybe)
|
2017-08-06 18:38:19 +02:00
|
|
|
(advice-add #'projectile-switch-project-by-name :around #'+workspaces*switch-project-by-name)
|
2017-06-28 15:16:30 +02:00
|
|
|
|
|
|
|
;; only auto-save when real buffers are present
|
|
|
|
(advice-add #'persp-asave-on-exit :around #'+workspaces*autosave-real-buffers)
|
|
|
|
|
2017-07-08 13:47:36 +02:00
|
|
|
(defun +workspaces|on-persp-mode ()
|
|
|
|
;; Remap `buffer-list' to current workspace's buffers in `doom-buffer-list'
|
|
|
|
(if persp-mode
|
|
|
|
(advice-add #'doom-buffer-list :override #'+workspace-buffer-list)
|
|
|
|
(advice-remove #'doom-buffer-list #'+workspace-buffer-list)))
|
|
|
|
(add-hook 'persp-mode-hook #'+workspaces|on-persp-mode)
|
|
|
|
|
2017-06-13 17:53:08 +02:00
|
|
|
;; Defer delayed warnings even further, so they appear after persp-mode is
|
2017-06-28 15:16:30 +02:00
|
|
|
;; started and the main workspace is ready to display them. Otherwise, warning
|
|
|
|
;; buffers will be hidden on startup.
|
2017-06-13 17:53:08 +02:00
|
|
|
(remove-hook 'delayed-warnings-hook #'display-delayed-warnings)
|
2017-06-12 00:20:30 +02:00
|
|
|
(defun +workspaces|init (&optional frame)
|
2017-06-14 21:07:57 +02:00
|
|
|
(unless persp-mode
|
2017-07-08 13:47:36 +02:00
|
|
|
(persp-mode +1))
|
2017-06-12 00:20:30 +02:00
|
|
|
(let ((frame (or frame (selected-frame))))
|
2017-06-14 21:07:57 +02:00
|
|
|
(unless noninteractive
|
|
|
|
;; The default perspective persp-mode makes (defined by
|
|
|
|
;; `persp-nil-name') is 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.
|
|
|
|
(unless (persp-with-name-exists-p +workspaces-main)
|
|
|
|
(persp-add-new +workspaces-main))
|
|
|
|
;; Switch to it if we aren't auto-loading the last session
|
2017-06-27 23:24:51 +02:00
|
|
|
(when (and (equal (safe-persp-name (get-current-persp)) persp-nil-name)
|
|
|
|
(= persp-auto-resume-time -1))
|
2017-06-14 21:07:57 +02:00
|
|
|
(persp-frame-switch +workspaces-main frame)))
|
2017-06-13 17:53:08 +02:00
|
|
|
(add-hook 'delayed-warnings-hook #'display-delayed-warnings t)))
|
2017-04-22 01:49:15 -04:00
|
|
|
|
2017-02-11 00:52:25 -05:00
|
|
|
(defun +workspaces*auto-add-buffer (buffer &rest _)
|
2017-06-28 15:16:30 +02:00
|
|
|
"Auto-associate buffers with perspectives upon opening them.
|
|
|
|
|
|
|
|
Allows a perspective-specific buffer list via `+workspaces-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)
|
2017-06-28 15:16:30 +02:00
|
|
|
(advice-add #'display-buffer :after #'+workspaces*auto-add-buffer))
|
2017-02-08 01:54:24 -05:00
|
|
|
|