From 5ce5740b210d457b61ec7f0e8012aa31b178242b Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Sun, 16 Aug 2020 14:14:04 +0100 Subject: [PATCH] feat(workspaces): add siren-desktop module for managing emacs sessions --- .gitignore | 1 + modules/workspaces/siren-desktop.el | 112 ++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 modules/workspaces/siren-desktop.el diff --git a/.gitignore b/.gitignore index e219345..bdcc5c1 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ straight/* ac-comphist.dat auto-save-list/* cache/* +desktops/* el-get/* elpa/* forge-database.sqlite diff --git a/modules/workspaces/siren-desktop.el b/modules/workspaces/siren-desktop.el new file mode 100644 index 0000000..4a1c1b8 --- /dev/null +++ b/modules/workspaces/siren-desktop.el @@ -0,0 +1,112 @@ +;;; siren-desktop.el --- jimeh's Emacs Siren: desktop configuration. + +;;; Commentary: + +;; Basic configuration for desktop. + +;;; Code: + +(require 'siren-workspace-map) + +(use-package desktop + :straight (:type built-in) + + :hook + (emacs-startup . siren-desktop-setup) + (desktop-after-read . siren-desktop-after-read-hook) + + :custom + (desktop-auto-save-timeout 10) + (desktop-path (list siren-dir)) + (desktop-restore-forces-onscreen nil) + (desktop-save 'ask-if-new) + + :init + (defun siren-desktop-setup () + (if (not (daemonp)) + (desktop-save-mode 1))) + + ;; Enable restoring window configurations when running in terminal + ;; - from: https://emacs.stackexchange.com/a/45829[<8;233;28m] + (defun siren-desktop-after-read-hook () + (frameset-restore + desktop-saved-frameset + :reuse-frames (eq desktop-restore-reuses-frames t) + :cleanup-frames (not (eq desktop-restore-reuses-frames 'keep)) + :force-display desktop-restore-in-current-display + :force-onscreen desktop-restore-forces-onscreen))) + +(use-package desktop+ + :hook + (emacs-startup . siren-desktop+-setup) + + :custom + (desktop+-base-dir (expand-file-name "desktops" siren-dir)) + + :bind + (:map siren-workspace-map + ("C-z c" . desktop+-create) + ("C-z C-c" . desktop+-create) + ("C-z n" . siren-desktop+-create-new) + ("C-z C-n" . siren-desktop+-create-new) + ("C-z s" . desktop+-load-or-create) + ("C-z C-s" . desktop+-load-or-create) + ("C-z l" . desktop+-load) + ("C-z C-l" . desktop+-load)) + + :init + (defun siren-desktop+-setup () + (unless (file-exists-p desktop+-base-dir) + (make-directory desktop+-base-dir)) + + (if (not (daemonp)) + (desktop+-load-or-create "default"))) + + (defun siren-desktop+-current-desktop () + (when (boundp 'desktop-dirname) + (let ((dir (directory-file-name desktop-dirname)) + (base-dir (expand-file-name desktop+-base-dir))) + (when (string-prefix-p base-dir dir) + (file-name-nondirectory dir))))) + + (defun siren-desktop+-list () + "Return a list of available desktops" + (remove "." (remove ".." (directory-files desktop+-base-dir)))) + + (defun siren-desktop+-list-interactive () + (let ((current (siren-desktop+-current-desktop)) + (desktops (siren-desktop+-list))) + (if current + (append (list current) + (delete current desktops)) + desktops))) + + (defun desktop+-load-or-create (name) + "Load or create a desktop session by name." + (interactive + (list + (completing-read "Desktop name: " (siren-desktop+-list-interactive)))) + (if (member name (siren-desktop+-list)) + (if (not (string= name (siren-desktop+-current-desktop))) + (desktop+-load name)) + (desktop+-create name))) + + (defun siren-desktop+-create-new (name) + "Create a new empty session, identified by a name. +The session is created in a subdirectory of `desktop+-base-dir'. +It can afterwards be reloaded using `desktop+-load'. + +As a special case, if NAME is left blank, the session is +automatically named after the current working directory." + (interactive "MDesktop name: ") + (desktop-kill) + (desktop-clear) + (setq desktop-dirname (desktop+--dirname name)) + (make-directory desktop-dirname 'parents) + (desktop-save desktop-dirname) + (desktop+--set-frame-title) + (desktop-save-mode 1)) + ) + +(provide 'siren-desktop) +;;; siren-desktop.el ends here