2022-07-30 21:49:00 +02:00
|
|
|
;;; lisp/lib/sessions.el -*- lexical-binding: t; -*-
|
2019-03-02 01:04:41 -05:00
|
|
|
|
2019-07-21 23:31:42 +02:00
|
|
|
(defvar desktop-base-file-name)
|
|
|
|
(defvar desktop-dirname)
|
|
|
|
(defvar desktop-restore-eager)
|
|
|
|
(defvar desktop-file-modtime)
|
|
|
|
|
|
|
|
|
2019-03-02 01:04:41 -05:00
|
|
|
;;
|
|
|
|
;;; Helpers
|
|
|
|
|
2019-04-26 17:42:44 -04:00
|
|
|
;;;###autoload
|
|
|
|
(defun doom-session-file (&optional name)
|
|
|
|
"TODO"
|
|
|
|
(cond ((require 'persp-mode nil t)
|
|
|
|
(expand-file-name (or name persp-auto-save-fname) persp-save-dir))
|
|
|
|
((require 'desktop nil t)
|
|
|
|
(if name
|
|
|
|
(expand-file-name name (file-name-directory (desktop-full-file-name)))
|
|
|
|
(desktop-full-file-name)))
|
|
|
|
((error "No session backend available"))))
|
|
|
|
|
2019-03-02 01:04:41 -05:00
|
|
|
;;;###autoload
|
|
|
|
(defun doom-save-session (&optional file)
|
|
|
|
"TODO"
|
|
|
|
(setq file (expand-file-name (or file (doom-session-file))))
|
|
|
|
(cond ((require 'persp-mode nil t)
|
|
|
|
(unless persp-mode (persp-mode +1))
|
|
|
|
(setq persp-auto-save-opt 0)
|
|
|
|
(persp-save-state-to-file file))
|
|
|
|
((and (require 'frameset nil t)
|
|
|
|
(require 'restart-emacs nil t))
|
|
|
|
(let ((frameset-filter-alist (append '((client . restart-emacs--record-tty-file))
|
|
|
|
frameset-filter-alist))
|
|
|
|
(desktop-base-file-name (file-name-nondirectory file))
|
|
|
|
(desktop-dirname (file-name-directory file))
|
|
|
|
(desktop-restore-eager t)
|
|
|
|
desktop-file-modtime)
|
|
|
|
(make-directory desktop-dirname t)
|
2019-04-26 17:42:44 -04:00
|
|
|
;; Prevents confirmation prompts
|
|
|
|
(let ((desktop-file-modtime (nth 5 (file-attributes (desktop-full-file-name)))))
|
|
|
|
(desktop-save desktop-dirname t))))
|
2019-03-02 01:04:41 -05:00
|
|
|
((error "No session backend to save session with"))))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom-load-session (&optional file)
|
|
|
|
"TODO"
|
|
|
|
(setq file (expand-file-name (or file (doom-session-file))))
|
|
|
|
(message "Attempting to load %s" file)
|
2019-12-28 15:46:29 -05:00
|
|
|
(cond ((not (file-readable-p file))
|
|
|
|
(message "No session file at %S to read from" file))
|
|
|
|
((require 'persp-mode nil t)
|
2019-04-26 17:42:44 -04:00
|
|
|
(unless persp-mode
|
|
|
|
(persp-mode +1))
|
2019-12-22 19:59:22 -05:00
|
|
|
(let ((allowed (persp-list-persp-names-in-file file)))
|
|
|
|
(cl-loop for name being the hash-keys of *persp-hash*
|
|
|
|
unless (member name allowed)
|
|
|
|
do (persp-kill name))
|
|
|
|
(persp-load-state-from-file file)))
|
2019-03-02 01:04:41 -05:00
|
|
|
((and (require 'frameset nil t)
|
|
|
|
(require 'restart-emacs nil t))
|
|
|
|
(restart-emacs--restore-frames-using-desktop file))
|
2019-03-04 20:44:35 -05:00
|
|
|
((error "No session backend to load session with"))))
|
2019-03-02 01:04:41 -05:00
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
;;; Commands
|
|
|
|
|
|
|
|
;;;###autoload
|
2023-08-17 11:52:30 +01:00
|
|
|
(defun doom/quickload-session (force)
|
|
|
|
"Load the last session saved.
|
|
|
|
If the FORCE \\[universal-argument] is provided
|
|
|
|
then no confirmation is asked."
|
|
|
|
(interactive "P")
|
|
|
|
(if (or force
|
|
|
|
(yes-or-no-p "This will wipe your current session, do you want to continue? "))
|
|
|
|
(progn (message "Restoring session...")
|
|
|
|
(doom-load-session)
|
|
|
|
(message "Session restored. Welcome back."))
|
|
|
|
(message "Session not restored.")))
|
2019-03-02 01:04:41 -05:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom/quicksave-session ()
|
|
|
|
"TODO"
|
|
|
|
(interactive)
|
|
|
|
(message "Saving session")
|
|
|
|
(doom-save-session)
|
|
|
|
(message "Saving session...DONE"))
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom/load-session (file)
|
|
|
|
"TODO"
|
|
|
|
(interactive
|
|
|
|
(let ((session-file (doom-session-file)))
|
|
|
|
(list (or (read-file-name "Session to restore: "
|
|
|
|
(file-name-directory session-file)
|
2019-09-12 13:28:42 -04:00
|
|
|
(file-name-nondirectory session-file)
|
|
|
|
t)
|
2019-03-02 01:04:41 -05:00
|
|
|
(user-error "No session selected. Aborting")))))
|
|
|
|
(unless file
|
|
|
|
(error "No session file selected"))
|
|
|
|
(message "Loading '%s' session" file)
|
2019-10-27 14:10:44 +01:00
|
|
|
(doom-load-session file)
|
|
|
|
(message "Session restored. Welcome back."))
|
2019-03-02 01:04:41 -05:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom/save-session (file)
|
|
|
|
"TODO"
|
|
|
|
(interactive
|
|
|
|
(let ((session-file (doom-session-file)))
|
|
|
|
(list (or (read-file-name "Save session to: "
|
|
|
|
(file-name-directory session-file)
|
|
|
|
(file-name-nondirectory session-file))
|
|
|
|
(user-error "No session selected. Aborting")))))
|
|
|
|
(unless file
|
|
|
|
(error "No session file selected"))
|
|
|
|
(message "Saving '%s' session" file)
|
|
|
|
(doom-save-session file))
|
|
|
|
|
|
|
|
;;;###autoload
|
2022-06-22 01:05:38 +02:00
|
|
|
(defun doom/restart ()
|
|
|
|
"Restart Emacs (and the daemon, if active).
|
|
|
|
|
|
|
|
Unlike `doom/restart-and-restore', does not restart the current session."
|
|
|
|
(interactive)
|
|
|
|
(require 'restart-emacs)
|
|
|
|
(restart-emacs))
|
2019-03-02 01:04:41 -05:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun doom/restart-and-restore (&optional debug)
|
2022-04-30 19:46:18 +02:00
|
|
|
"Restart Emacs (and the daemon, if active).
|
|
|
|
|
|
|
|
If DEBUG (the prefix arg) is given, start the new instance with the --debug
|
|
|
|
switch."
|
2019-03-02 01:04:41 -05:00
|
|
|
(interactive "P")
|
2022-06-22 01:05:38 +02:00
|
|
|
(require 'restart-emacs)
|
2019-03-02 01:04:41 -05:00
|
|
|
(doom/quicksave-session)
|
2020-05-03 19:49:18 -04:00
|
|
|
(save-some-buffers nil t)
|
|
|
|
(letf! ((#'save-buffers-kill-emacs #'kill-emacs)
|
2022-05-05 22:43:44 +02:00
|
|
|
(confirm-kill-emacs)
|
|
|
|
(tmpfile (make-temp-file "post-load")))
|
|
|
|
;; HACK `restart-emacs' does not properly escape arguments on Windows (in
|
|
|
|
;; `restart-emacs--daemon-on-windows' and
|
|
|
|
;; `restart-emacs--start-gui-on-windows'), so don't give it complex
|
|
|
|
;; arguments at all. Should be fixed upstream, but restart-emacs seems to
|
|
|
|
;; be unmaintained.
|
|
|
|
(with-temp-file tmpfile
|
2022-06-21 23:33:07 +02:00
|
|
|
(print `(progn
|
|
|
|
(when (boundp 'doom-version)
|
|
|
|
(add-hook 'window-setup-hook #'doom-load-session 100))
|
|
|
|
(delete-file ,tmpfile))
|
2022-05-05 22:43:44 +02:00
|
|
|
(current-buffer)))
|
2020-05-03 19:49:18 -04:00
|
|
|
(restart-emacs
|
2022-05-05 22:43:44 +02:00
|
|
|
(append (if debug (list "--debug-init"))
|
|
|
|
(when (boundp 'chemacs-current-emacs-profile)
|
|
|
|
(list "--with-profile" chemacs-current-emacs-profile))
|
|
|
|
(list "-l" tmpfile)))))
|