diff --git a/core/core-packages.el b/core/core-packages.el index 8f4df74c7..95ad87a96 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -623,7 +623,7 @@ loads MODULE SUBMODULE's packages.el file." ;; (defun doom//reload () - "Reload your Doom config." + "Reload your Doom config. Experimental!" (interactive) (load (concat doom-emacs-dir "init.el") nil nil 'nosuffix) (doom//reload-load-path)) diff --git a/core/core-ui.el b/core/core-ui.el index 779a5c674..c6703e885 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -250,6 +250,10 @@ DEFAULT is non-nil, set the default mode-line for all buffers." :hook (lisp-mode . rainbow-delimiters-mode) :config (setq rainbow-delimiters-max-face-count 3)) +(def-package! restart-emacs + :commands restart-emacs + :config (setq restart-emacs--args (list "--restore"))) + ;; For a distractions-free-like UI, that dynamically resizes margins and can ;; center a buffer. (def-package! visual-fill-column diff --git a/core/packages.el b/core/packages.el index 21a696855..904616767 100644 --- a/core/packages.el +++ b/core/packages.el @@ -16,6 +16,7 @@ (package! nlinum-relative)) (package! rainbow-delimiters) (package! visual-fill-column) +(package! restart-emacs) ;; core-editor.el (package! ace-link) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 31fe8f3b0..b014d5588 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -425,6 +425,12 @@ the next." (t (+workspace-error "Can't delete last workspace" t))))))) +;;;###autoload +(defun +workspace/restart-emacs-then-restore () + "Restarts Emacs, then restores the session." + (interactive) + (restart-emacs (list "--restore"))) + ;; ;; Tabs display in minibuffer diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 3feb9c6d5..fd8df7a29 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -26,6 +26,10 @@ new project directory.") "The basename of the file to store single workspace perspectives. Will be stored in `persp-save-dir'.") +(defun +workspaces-restore-last-session (&rest _) + (add-hook 'emacs-startup-hook #'+workspace/load-session 'append)) +(map-put command-switch-alist '"--restore" #'+workspaces-restore-last-session) + ;; ;; Plugins @@ -105,7 +109,13 @@ Uses `+workspaces-main' to determine the name of the main workspace." (advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) (add-hook 'persp-mode-hook #'+workspaces|init-persp-mode) + (defun +workspaces|leave-nil-perspective (&rest _) + (when (string= (+workspace-current-name) persp-nil-name) + (persp-frame-switch +workspaces-main))) + (add-hook 'persp-after-load-state-functions #'+workspaces|leave-nil-perspective) + ;; Modify `delete-window' to close the workspace if used on the last window + (define-key persp-mode-map [remap restart-emacs] #'+workspace/restart-emacs-then-restore) (define-key persp-mode-map [remap delete-window] #'+workspace/close-window-or-workspace) (define-key persp-mode-map [remap evil-delete-window] #'+workspace/close-window-or-workspace) ;; only auto-save when real buffers are present