Make session persistence module agnostic

They've been removed from feature/workspaces and moved into
core/autoload/sessions, which falls back to desktop.el if persp-mode
isn't present. This also offers a substantial speed up to
restart+restoring and restoring sessions in general.

Also fixes #1210, where the newly spawned frame after doom/restart
wasn't focused.

Introduces the following commands:

- doom/restart
- doom/restart-and-restore
- doom/quickload-session
- doom/quicksave-session
- doom/load-session
- doom/save-session
- +workspace/restore-last-session (alias for doom/quickload-session)

And removes

- +workspace/load-session
- +workspace/save-session
- +workspace/load-last-session (renamed to +workspace/restore-last-session)
- +workspace/restart-emacs-then-restore (replaced by doom/restart-and-restore)
- :ss (ex command)
- :sl (ex command)
This commit is contained in:
Henrik Lissner 2019-03-02 01:04:41 -05:00
parent 735ec58b36
commit 8a90f29c91
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
10 changed files with 181 additions and 143 deletions

121
core/autoload/sessions.el Normal file
View file

@ -0,0 +1,121 @@
;;; core/autoload/sessions.el -*- lexical-binding: t; -*-
;;
;;; Helpers
;;;###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)
(desktop-save desktop-dirname t)))
((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)
(cond ((require 'persp-mode nil t)
(unless persp-mode (persp-mode +1))
(persp-load-state-from-file file))
((and (require 'frameset nil t)
(require 'restart-emacs nil t))
(restart-emacs--restore-frames-using-desktop file))
((error "No session backend to load session with")))
(select-frame-set-input-focus (selected-frame)))
;;;###autoload
(defun doom-session-file ()
"TODO"
(cond ((require 'persp-mode nil t)
(expand-file-name persp-auto-save-fname persp-save-dir))
((require 'desktop nil t)
(desktop-full-file-name))
((error "No session backend available"))))
;;
;;; Command line switch
;;;###autoload
(defun doom-restore-session-handler (&rest _)
"TODO"
(doom-load-session))
;;;###autoload
(add-to-list 'command-switch-alist (cons "--restore" #'doom-restore-session-handler))
;;
;;; Commands
;;;###autoload
(defun doom/quickload-session ()
"TODO"
(interactive)
(message "Restoring session...")
(doom-load-session)
(message "Session restored. Welcome back."))
;;;###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)
nil t
(file-name-nondirectory session-file))
(user-error "No session selected. Aborting")))))
(unless file
(error "No session file selected"))
(message "Loading '%s' session" file)
(doom-load-session file))
;;;###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)
nil nil
(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
(defalias 'doom/restart #'restart-emacs)
;;;###autoload
(defun doom/restart-and-restore (&optional debug)
"TODO"
(interactive "P")
(doom/quicksave-session)
(let (confirm-kill-emacs)
(restart-emacs
(delq nil (list (if debug "--debug-init") "--restore")))))

View file

@ -37,9 +37,8 @@ it exists."
(print! (bold (green "\nFinished!"))) (print! (bold (green "\nFinished!")))
(message "If you have a running Emacs Session, you will need to restart it or") (message "If you have a running Emacs Session, you will need to restart it or")
(message "reload Doom for changes to take effect:\n") (message "reload Doom for changes to take effect:\n")
(when (fboundp '+workspace/restart-emacs-then-restore) (message " M-x doom/restart-and-restore")
(message " M-x +workspace/restart-emacs-then-restore")) (message " M-x doom/restart")
(message " M-x restart-emacs")
(message " M-x doom/reload")) (message " M-x doom/reload"))
(defun doom--do-load (&rest files) (defun doom--do-load (&rest files)

View file

@ -253,6 +253,9 @@ and `doom-exit-window-hook'."
async-byte-compile-log-file (concat doom-etc-dir "async-bytecomp.log") async-byte-compile-log-file (concat doom-etc-dir "async-bytecomp.log")
auto-save-list-file-name (concat doom-cache-dir "autosave") auto-save-list-file-name (concat doom-cache-dir "autosave")
backup-directory-alist (list (cons "." (concat doom-cache-dir "backup/"))) backup-directory-alist (list (cons "." (concat doom-cache-dir "backup/")))
desktop-dirname (concat doom-etc-dir "desktop")
desktop-base-file-name "autosave"
desktop-base-lock-name "autosave-lock"
pcache-directory (concat doom-cache-dir "pcache/") pcache-directory (concat doom-cache-dir "pcache/")
request-storage-directory (concat doom-cache-dir "request") request-storage-directory (concat doom-cache-dir "request")
server-auth-dir (concat doom-cache-dir "server/") server-auth-dir (concat doom-cache-dir "server/")

View file

@ -91,9 +91,9 @@
:desc "Quit Emacs" "q" #'kill-emacs :desc "Quit Emacs" "q" #'kill-emacs
:desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal :desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal
(:when (featurep! :feature workspaces) (:when (featurep! :feature workspaces)
:desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit :desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit)
:desc "Restart & restore Emacs" "r" #'+workspace/restart-emacs-then-restore) :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore
:desc "Restart Emacs" "R" #'restart-emacs) :desc "Restart Emacs" "R" #'doom/restart)
;; Snippets ;; Snippets
"&" nil ; yasnippet creates this prefix, we use a different one "&" nil ; yasnippet creates this prefix, we use a different one
(:prefix ("s" . "snippets") (:prefix ("s" . "snippets")
@ -123,15 +123,15 @@
:desc "Previous hunk" "[" #'git-gutter:previous-hunk) :desc "Previous hunk" "[" #'git-gutter:previous-hunk)
;; Worspace and window management bindings ;; Worspace and window management bindings
(:prefix ("w". "workspaces") (:prefix ("w". "workspaces")
:desc "Autosave session" "a" #'+workspace/save-session :desc "Autosave session" "a" #'doom/quicksave-session
:desc "Display workspaces" "d" #'+workspace/display :desc "Display workspaces" "d" #'+workspace/display
:desc "Rename workspace" "r" #'+workspace/rename :desc "Rename workspace" "r" #'+workspace/rename
:desc "Create workspace" "c" #'+workspace/new :desc "Create workspace" "c" #'+workspace/new
:desc "Delete workspace" "k" #'+workspace/delete :desc "Delete workspace" "k" #'+workspace/delete
:desc "Save session" "s" (λ! (let ((current-prefix-arg '(4))) (call-interactively #'+workspace/save-session))) :desc "Save session" "s" #'doom/save-session
:desc "Save workspace" "S" #'+workspace/save :desc "Save workspace" "S" #'+workspace/save
:desc "Load session" "l" #'+workspace/load-session :desc "Load session" "l" #'doom/load-session
:desc "Load last autosaved session" "L" #'+workspace/load-last-session :desc "Load last autosaved session" "L" #'doom/quickload-session
:desc "Kill other buffers" "o" #'doom/kill-other-buffers :desc "Kill other buffers" "o" #'doom/kill-other-buffers
:desc "Undo window config" "u" #'winner-undo :desc "Undo window config" "u" #'winner-undo
:desc "Redo window config" "U" #'winner-redo :desc "Redo window config" "U" #'winner-redo

View file

@ -544,14 +544,12 @@
:desc "Display tab bar" "TAB" #'+workspace/display :desc "Display tab bar" "TAB" #'+workspace/display
:desc "New workspace" "n" #'+workspace/new :desc "New workspace" "n" #'+workspace/new
:desc "Load workspace from file" "l" #'+workspace/load :desc "Load workspace from file" "l" #'+workspace/load
:desc "Load a past session" "L" #'+workspace/load-session
:desc "Save workspace to file" "s" #'+workspace/save :desc "Save workspace to file" "s" #'+workspace/save
:desc "Autosave current session" "S" #'+workspace/save-session
:desc "Switch workspace" "." #'+workspace/switch-to :desc "Switch workspace" "." #'+workspace/switch-to
:desc "Delete session" "x" #'+workspace/kill-session :desc "Delete session" "x" #'+workspace/kill-session
:desc "Delete this workspace" "d" #'+workspace/delete :desc "Delete this workspace" "d" #'+workspace/delete
:desc "Rename workspace" "r" #'+workspace/rename :desc "Rename workspace" "r" #'+workspace/rename
:desc "Restore last session" "R" #'+workspace/load-last-session :desc "Restore last session" "R" #'+workspace/restore-last-session
:desc "Next workspace" "]" #'+workspace/switch-right :desc "Next workspace" "]" #'+workspace/switch-right
:desc "Previous workspace" "[" #'+workspace/switch-left :desc "Previous workspace" "[" #'+workspace/switch-left
:desc "Switch to 1st workspace" "1" (λ! (+workspace/switch-to 0)) :desc "Switch to 1st workspace" "1" (λ! (+workspace/switch-to 0))
@ -757,12 +755,15 @@
:desc "List project tasks" "t" #'+default/project-tasks :desc "List project tasks" "t" #'+default/project-tasks
:desc "Invalidate cache" "x" #'projectile-invalidate-cache) :desc "Invalidate cache" "x" #'projectile-invalidate-cache)
(:prefix ("q" . "quit/restart") (:prefix ("q" . "session")
:desc "Quit Emacs" "q" #'evil-quit-all :desc "Quit Emacs" "q" #'evil-quit-all
:desc "Save and quit Emacs" "Q" #'evil-save-and-quit :desc "Save and quit Emacs" "Q" #'evil-save-and-quit
:desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit :desc "Quick save current session" "s" #'doom/quicksave-session
:desc "Restart & restore Emacs" "r" #'+workspace/restart-emacs-then-restore :desc "Restore last session" "l" #'doom/quickload-session
:desc "Restart Emacs" "R" #'restart-emacs) :desc "Save session to file" "S" #'doom/save-session
:desc "Restore session from file" "L" #'doom/load-session
:desc "Restart & restore Emacs" "r" #'doom/restart-and-restore
:desc "Restart Emacs" "R" #'doom/restart)
(:when (featurep! :tools upload) (:when (featurep! :tools upload)
(:prefix ("r" . "remote") (:prefix ("r" . "remote")

View file

@ -61,9 +61,9 @@ in [[../../private/default/+evil-commands.el][private/default/+evil-commands.el]
| ~+workspace/new~ | =SPC TAB n= | Create a new, blank workspace | | ~+workspace/new~ | =SPC TAB n= | Create a new, blank workspace |
| ~+workspace/display~ | =SPC TAB TAB= | Display open workspaces in the mode-line | | ~+workspace/display~ | =SPC TAB TAB= | Display open workspaces in the mode-line |
| ~+workspace/load~ | =SPC TAB l= | Load a saved workspace into the current session | | ~+workspace/load~ | =SPC TAB l= | Load a saved workspace into the current session |
| ~+workspace/load-session~ | =SPC TAB L= / =:sl[oad]= | Replace current session with a saved one | | ~doom/quicksave-load~ | =SPC TAB L= / =:sl[oad]= | Replace current session with a saved one |
| ~+workspace/save~ | =SPC TAB s= | Save the current workspace to a file | | ~+workspace/save~ | =SPC TAB s= | Save the current workspace to a file |
| ~+workspace/save-session~ | =SPC TAB S= / =:ss[ave]= | Save current session | | ~doom/quicksave-save~ | =SPC TAB S= / =:ss[ave]= | Save current session |
| ~+workspace/switch-to~ | =SPC TAB .= | Switch to an open workspace | | ~+workspace/switch-to~ | =SPC TAB .= | Switch to an open workspace |
| ~+workspace/switch-left~ | =SPC TAB [= / =[ w= / =gT= | Switch to previous workspace | | ~+workspace/switch-left~ | =SPC TAB [= / =[ w= / =gT= | Switch to previous workspace |
| ~+workspace/switch-right~ | =SPC TAB [= / =] w= / =gt= | Switch to next workspace | | ~+workspace/switch-right~ | =SPC TAB [= / =] w= / =gt= | Switch to next workspace |

View file

@ -1,20 +1,6 @@
;;; feature/workspaces/autoload/evil.el -*- lexical-binding: t; -*- ;;; feature/workspaces/autoload/evil.el -*- lexical-binding: t; -*-
;;;###if (featurep! :feature evil) ;;;###if (featurep! :feature evil)
;;;###autoload (autoload '+workspace:save-session "feature/workspaces/autoload/evil" nil t)
(evil-define-command +workspace:save-session (&optional bang name)
"Ex wrapper around `+workspace/save-session'. If BANG, then autosave
(pointless if autosaving/loading is off). If NAME is nil, default to 'last'."
(interactive "<!><a>")
(+workspace/save-session (if bang persp-auto-save-fname name)))
;;;###autoload (autoload '+workspace:load-session "feature/workspaces/autoload/evil" nil t)
(evil-define-command +workspace:load-session (&optional bang name)
"Ex wrapper around `+workspace/load-session'. If BANG, then load last autosave
(pointless if autosaving/loading is off). If NAME is nil, defaults to 'last'."
(interactive "<!><a>")
(+workspace/load-session (if bang persp-auto-save-fname name)))
;;;###autoload (autoload '+workspace:save "feature/workspaces/autoload/evil" nil t) ;;;###autoload (autoload '+workspace:save "feature/workspaces/autoload/evil" nil t)
(evil-define-command +workspace:save (&optional name) (evil-define-command +workspace:save (&optional name)
"Ex wrapper around `+workspace/save-session'." "Ex wrapper around `+workspace/save-session'."

View file

@ -112,14 +112,6 @@ Returns t if successful, nil otherwise."
*persp-hash* (list name)) *persp-hash* (list name))
(+workspace-exists-p name)) (+workspace-exists-p name))
;;;###autoload
(defun +workspace-load-session (&optional name)
"Replace current session with the entire session named NAME. If NAME is nil,
use `persp-auto-save-fname'."
(mapc #'+workspace-delete (+workspace-list-names))
(persp-load-state-from-file
(expand-file-name (or name persp-auto-save-fname) persp-save-dir)))
;;;###autoload ;;;###autoload
(defun +workspace-save (name) (defun +workspace-save (name)
"Saves a single workspace (NAME) from the current session. Can be loaded again "Saves a single workspace (NAME) from the current session. Can be loaded again
@ -134,18 +126,6 @@ Returns t on success, nil otherwise."
(and (member name (persp-list-persp-names-in-file fname)) (and (member name (persp-list-persp-names-in-file fname))
t))) t)))
;;;###autoload
(defun +workspace-save-session (&optional name)
"Save a whole session as NAME. If NAME is nil, use `persp-auto-save-fname'.
Return t on success, nil otherwise."
(let ((fname (expand-file-name (or name persp-auto-save-fname)
persp-save-dir)))
;; disable auto-saving on kill-emacs if autosaving (i.e. name is nil)
(when (or (not name)
(string= name persp-auto-save-fname))
(setq persp-auto-save-opt 0))
(and (persp-save-state-to-file fname) t)))
;;;###autoload ;;;###autoload
(defun +workspace-new (name) (defun +workspace-new (name)
"Create a new workspace named NAME. If one already exists, return nil. "Create a new workspace named NAME. If one already exists, return nil.
@ -206,6 +186,9 @@ throws an error."
;; ;;
;; Commands ;; Commands
;;;###autoload
(defalias '+workspace/restore-last-session #'doom/quickload-session)
;;;###autoload ;;;###autoload
(defun +workspace/load (name) (defun +workspace/load (name)
"Load a workspace and switch to it. If called with C-u, try to reload the "Load a workspace and switch to it. If called with C-u, try to reload the
@ -236,46 +219,6 @@ workspace."
(+workspace-message (format "'%s' workspace saved" name) 'success) (+workspace-message (format "'%s' workspace saved" name) 'success)
(+workspace-error (format "Couldn't save workspace %s" name)))) (+workspace-error (format "Couldn't save workspace %s" name))))
;;;###autoload
(defun +workspace/load-session (&optional name)
"Load a session and switch to it. If called with C-u, try to load the last
session."
(interactive
(list
(unless current-prefix-arg
(completing-read
"Session to load: "
(directory-files persp-save-dir nil "^[^_.]")
nil t))))
(condition-case ex
(let ((name (or name persp-auto-save-fname)))
(+workspace-load-session name)
(+workspace-message (format "'%s' workspace loaded" name) 'success))
'(error (+workspace-error (cadr ex) t))))
;;;###autoload
(defun +workspace/load-last-session ()
"Restore last session and switch to it."
(interactive)
(+workspace/load-session))
;;;###autoload
(defun +workspace/save-session (&optional name)
"Save the current session. If called with C-u, prompt you for the name to save
the session as."
(interactive
(list
(when current-prefix-arg
(completing-read
"Save session as: "
(directory-files persp-save-dir nil "^[^_.]")))))
(condition-case-unless-debug ex
(let ((name (or name persp-auto-save-fname)))
(if (+workspace-save-session name)
(+workspace-message (format "Saved session as '%s'" name) 'success)
(error "Couldn't save session as '%s'" name)))
('error (+workspace-error ex t))))
;;;###autoload ;;;###autoload
(defun +workspace/rename (new-name) (defun +workspace/rename (new-name)
"Rename the current workspace." "Rename the current workspace."
@ -437,12 +380,6 @@ the next."
(t (+workspace-error "Can't delete last workspace" t))))))) (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 ;; Tabs display in minibuffer

View file

@ -5,11 +5,6 @@
;; it because it was unstable and slow; `persp-mode' is neither (and still ;; it because it was unstable and slow; `persp-mode' is neither (and still
;; maintained). ;; maintained).
;; ;;
;; By default, sessions are autosaved, but not autoloaded. 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 later.
;;
;; NOTE persp-mode requires `workgroups' for file persistence in Emacs 24.4. ;; NOTE persp-mode requires `workgroups' for file persistence in Emacs 24.4.
(defvar +workspaces-main "main" (defvar +workspaces-main "main"
@ -20,11 +15,6 @@
`counsel-projectile-switch-project'. This function must take one argument: the `counsel-projectile-switch-project'. This function must take one argument: the
new project directory.") new project directory.")
;; FIXME actually use this for wconf bookmark system
(defvar +workspaces-data-file "_workspaces"
"The basename of the file to store single workspace perspectives. Will be
stored in `persp-save-dir'.")
(defvar +workspaces-on-switch-project-behavior 'non-empty (defvar +workspaces-on-switch-project-behavior 'non-empty
"Controls the behavior of workspaces when switching to a new project. "Controls the behavior of workspaces when switching to a new project.
@ -35,11 +25,10 @@ t Always create a new workspace for the project
associated with it. associated with it.
nil Never create a new workspace on project switch.") nil Never create a new workspace on project switch.")
;; If emacs is passed --restore, restore the last session on startup. This is ;; FIXME actually use this for wconf bookmark system
;; used by the `+workspace/restart-emacs-then-restore' command. (defvar +workspaces-data-file "_workspaces"
(defun +workspaces-restore-last-session (&rest _) "The basename of the file to store single workspace perspectives. Will be
(add-hook 'emacs-startup-hook #'+workspace/load-session :append)) stored in `persp-save-dir'.")
(add-to-list 'command-switch-alist (cons "--restore" #'+workspaces-restore-last-session))
;; ;;
@ -64,29 +53,29 @@ workspace. Also ensures that the *Warnings* buffer will be visible in main.
Uses `+workspaces-main' to determine the name of the main workspace." Uses `+workspaces-main' to determine the name of the main workspace."
(unless persp-mode (unless persp-mode
(persp-mode +1)) (persp-mode +1)
(unless noninteractive (unless noninteractive
(let (persp-before-switch-functions persp-activated-functions) (let (persp-before-switch-functions persp-activated-functions)
(with-selected-frame frame (with-selected-frame frame
;; The default perspective persp-mode creates (`persp-nil-name') is ;; The default perspective persp-mode creates (`persp-nil-name') is
;; special and doesn't represent a real persp object, so buffers can't ;; special and doesn't represent a real persp object, so buffers can't
;; really be assigned to it, among other quirks. We create a *real* ;; really be assigned to it, among other quirks. We create a *real*
;; main workspace to fill this role. ;; main workspace to fill this role.
(unless (persp-get-by-name +workspaces-main) (unless (persp-get-by-name +workspaces-main)
(persp-add-new +workspaces-main)) (persp-add-new +workspaces-main))
;; Switch to it if we aren't auto-loading the last session ;; Switch to it if we aren't auto-loading the last session
(when (and (string= (safe-persp-name (get-current-persp)) persp-nil-name) (when (and (string= (safe-persp-name (get-current-persp)) persp-nil-name)
(= persp-auto-resume-time -1)) (= persp-auto-resume-time -1))
(persp-frame-switch +workspaces-main frame) (persp-frame-switch +workspaces-main frame)
;; We want to know where we are in every new daemon frame ;; We want to know where we are in every new daemon frame
(when (daemonp) (when (daemonp)
(run-at-time 0.1 nil #'+workspace/display)) (run-at-time 0.1 nil #'+workspace/display))
;; Fix #319: the warnings buffer gets swallowed by creating ;; Fix #319: the warnings buffer gets swallowed by creating
;; `+workspaces-main', so we display it manually, if it exists. ;; `+workspaces-main', so we display it manually, if it exists.
(when-let* ((warnings (get-buffer "*Warnings*"))) (when-let* ((warnings (get-buffer "*Warnings*")))
(save-excursion (save-excursion
(display-buffer-in-side-window (display-buffer-in-side-window
warnings '((window-height . shrink-window-if-larger-than-buffer)))))))))) warnings '((window-height . shrink-window-if-larger-than-buffer)))))))))))
(add-hook 'doom-post-init-hook #'+workspaces|init t) (add-hook 'doom-post-init-hook #'+workspaces|init t)
:config :config

View file

@ -44,11 +44,12 @@ Possible values:
(defvar +doom-dashboard-menu-sections (defvar +doom-dashboard-menu-sections
'(("Reload last session" '(("Reload last session"
:icon (all-the-icons-octicon "history" :face 'font-lock-keyword-face) :icon (all-the-icons-octicon "history" :face 'font-lock-keyword-face)
:when (and (bound-and-true-p persp-mode) :when (cond ((require 'persp-mode nil t)
(file-exists-p (expand-file-name persp-auto-save-fname (file-exists-p (expand-file-name persp-auto-save-fname persp-save-dir)))
persp-save-dir))) ((require 'desktop nil t)
(file-exists-p (desktop-full-file-name))))
:face (:inherit (font-lock-keyword-face bold)) :face (:inherit (font-lock-keyword-face bold))
:action +workspace/load-last-session) :action doom/quickload-session)
("Open org-agenda" ("Open org-agenda"
:icon (all-the-icons-octicon "calendar" :face 'font-lock-keyword-face) :icon (all-the-icons-octicon "calendar" :face 'font-lock-keyword-face)
:when (fboundp 'org-agenda) :when (fboundp 'org-agenda)
@ -107,8 +108,9 @@ PLIST can have the following properties:
initial-buffer-choice initial-buffer-choice
(when (or (daemonp) (when (or (daemonp)
(not (cl-loop for arg in (cdr command-line-args) (not (cl-loop for arg in (cdr command-line-args)
if (and (string-match-p "^[^-]" arg) if (or (equal arg "--restore")
(file-exists-p arg)) (and (string-match-p "^[^-]" arg)
(file-exists-p arg)))
return t))) return t)))
#'+doom-dashboard-initial-buffer)) #'+doom-dashboard-initial-buffer))