mirror of
https://github.com/jimeh/.emacs.d.git
synced 2026-02-19 13:46:41 +00:00
149 lines
5.6 KiB
EmacsLisp
149 lines
5.6 KiB
EmacsLisp
;;; 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
|
|
(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)
|
|
(desktop-restore-frames t)
|
|
|
|
:config
|
|
(add-to-list 'desktop-clear-preserve-buffers "\\*straight-process\\*")
|
|
(add-to-list 'desktop-clear-preserve-buffers "\\*explain-pause-top\\*")
|
|
(add-to-list 'desktop-clear-preserve-buffers "\\*Async-native-compile-log\\*")
|
|
(add-to-list 'desktop-clear-preserve-buffers "\\*Native-compile-Log\\*")
|
|
|
|
(push '(alpha . :never) frameset-filter-alist)
|
|
(push '(background-color . :never) frameset-filter-alist)
|
|
(push '(background-mode . :never) frameset-filter-alist)
|
|
(push '(border-width . :never) frameset-filter-alist)
|
|
(push '(bottom-divider-width . :never) frameset-filter-alist)
|
|
(push '(cursor-color . :never) frameset-filter-alist)
|
|
(push '(cursor-type . :never) frameset-filter-alist)
|
|
(push '(display-type . :never) frameset-filter-alist)
|
|
(push '(environment . :never) frameset-filter-alist)
|
|
(push '(font . :never) frameset-filter-alist)
|
|
(push '(fontsize . :never) frameset-filter-alist)
|
|
(push '(foreground-color . :never) frameset-filter-alist)
|
|
(push '(fullscreen . :never) frameset-filter-alist)
|
|
(push '(fullscreen-restore . :never) frameset-filter-alist)
|
|
(push '(horizontal-scroll-bars . :never) frameset-filter-alist)
|
|
(push '(internal-border-width . :never) frameset-filter-alist)
|
|
(push '(left-fringe . :never) frameset-filter-alist)
|
|
(push '(line-spacing . :never) frameset-filter-alist)
|
|
(push '(menu-bar-lines . :never) frameset-filter-alist)
|
|
(push '(ns-appearance . :never) frameset-filter-alist)
|
|
(push '(ns-transparent-titlebar . :never) frameset-filter-alist)
|
|
(push '(powerline-cache . :never) frameset-filter-alist)
|
|
(push '(right-divider-width . :never) frameset-filter-alist)
|
|
(push '(right-fringe . :never) frameset-filter-alist)
|
|
(push '(scroll-bar-height . :never) frameset-filter-alist)
|
|
(push '(scroll-bar-width . :never) frameset-filter-alist)
|
|
(push '(tab-bar-lines . :never) frameset-filter-alist)
|
|
(push '(tool-bar-lines . :never) frameset-filter-alist)
|
|
(push '(tool-bar-position . :never) frameset-filter-alist)
|
|
(push '(vertical-scroll-bars . :never) frameset-filter-alist)
|
|
(push '(zoom-window-buffers . :never) frameset-filter-alist)
|
|
(push '(zoom-window-enabled . :never) frameset-filter-alist)
|
|
|
|
:init
|
|
;; Enable restoring window configurations when running in terminal
|
|
;; - from: https://emacs.stackexchange.com/a/45829
|
|
(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+
|
|
: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))
|
|
|
|
:config
|
|
(unless (file-exists-p desktop+-base-dir)
|
|
(make-directory desktop+-base-dir))
|
|
|
|
:init
|
|
(defvar desktop+-base-dir (expand-file-name "desktops" siren-dir)
|
|
"Base directory for desktop files.")
|
|
|
|
(defun siren-desktop+-current-desktop ()
|
|
(when (and (boundp 'desktop-dirname) 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 nil (mapcar 'siren-desktop+--list-filter-item
|
|
(directory-files desktop+-base-dir t))))
|
|
|
|
(defun siren-desktop+--list-filter-item (path)
|
|
(let ((basename (file-name-nondirectory path))
|
|
(is-dir (car (file-attributes path))))
|
|
(if (and is-dir (not (member basename '("." ".."))))
|
|
(file-name-nondirectory path))))
|
|
|
|
(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
|