From e7d0e9f9ecd11655591075e82882a9b22cfaaa36 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Oct 2016 12:48:12 +0200 Subject: [PATCH] Refactor DOOM scratch buffer --- core/core-defuns.el | 13 ---- core/core-scratch.el | 127 ++++++++++++++++++-------------- core/core.el | 3 + core/defuns/defuns-buffers.el | 38 +++++----- core/defuns/defuns-workgroup.el | 2 +- 5 files changed, 95 insertions(+), 88 deletions(-) diff --git a/core/core-defuns.el b/core/core-defuns.el index fd6a1e298..fa11985fa 100644 --- a/core/core-defuns.el +++ b/core/core-defuns.el @@ -279,19 +279,6 @@ Examples: (define-key evil-motion-state-map (kbd "SPC") ',next-func) (define-key evil-motion-state-map (kbd "S-SPC") ',prev-func))) -;; -(defun doom|update-scratch-buffer (&optional dir inhibit-doom) - "Make sure scratch buffer is always 'in a project', and looks good." - (let ((dir (or dir (doom/project-root)))) - (with-current-buffer doom-buffer - ;; Reset scratch buffer if it wasn't visible - (when (and (get-buffer-window-list doom-buffer nil t) - (not doom-buffer-edited) - (not inhibit-doom)) - (doom-mode-init t)) - (setq default-directory dir) - (setq mode-line-format (doom-modeline 'scratch))))) - ;; ;; Global Defuns diff --git a/core/core-scratch.el b/core/core-scratch.el index 28b090b03..ce753f33f 100644 --- a/core/core-scratch.el +++ b/core/core-scratch.el @@ -13,88 +13,105 @@ (defvar doom-buffer-edited nil "If non-nil, the scratch buffer has been edited.") -(define-derived-mode doom-mode fundamental-mode "DOOM" +(define-derived-mode doom-mode fundamental-mode + (concat "DOOM v" doom-version) "Major mode for special DOOM buffers.") ;; Don't kill the scratch buffer (add-hook! 'kill-buffer-query-functions (not (eq doom-buffer (current-buffer)))) -(add-hook 'emacs-startup-hook 'doom-mode-init) +(add-hook 'emacs-startup-hook 'doom--reload-scratch-buffer) +;; Don't rename these buffers. That could cause problems. (after! uniquify (setq uniquify-ignore-buffers-re (regexp-quote doom-buffer-name))) -(defun doom-mode-erase-on-insert () +(defun doom*scratch-split-hack (&rest _) + "Removes the window margins before attempting a vertical-split on the scratch +buffer. Without this, it would refuse to split, saying 'too small to split'." + (when (eq (current-buffer) doom-buffer) + (set-window-margins nil 0 0))) +(advice-add 'split-window :before 'doom*scratch-split-hack) + +(defun doom|mode-erase-on-insert () + "Erase the buffer and prepare it to be used like a normal buffer." (erase-buffer) (setq doom-buffer-edited t) - (remove-hook 'evil-insert-state-entry-hook 'doom-mode-erase-on-insert t)) + (set-window-margins (get-buffer-window doom-buffer) 0 0) + (remove-hook 'evil-insert-state-entry-hook 'doom|mode-erase-on-insert t)) -(defun doom|update-scratch-buffer-hook (&rest _) - (doom|update-scratch-buffer)) +(defun doom-reload-scratch-buffer (&optional dir) + "Update the DOOM scratch buffer (or create it, if it doesn't exist)." + (when (and (get-buffer-window-list doom-buffer nil t) + (or (not doom-buffer-edited) dir) + (not (minibuffer-window-active-p (minibuffer-window)))) + (doom--reload-scratch-buffer dir))) -(defun doom-mode-init (&optional auto-detect-frame) +(defun doom--reload-scratch-buffer (&optional dir) + ;; Rename the old scratch buffer, if it exists. (let ((old-scratch (get-buffer "*scratch*"))) (when old-scratch (with-current-buffer old-scratch (rename-buffer doom-buffer-name) (setq doom-buffer old-scratch)))) + ;; Ensure the doom buffer is alive! (unless (buffer-live-p doom-buffer) (setq doom-buffer nil)) (unless doom-buffer (setq doom-buffer (get-buffer-create doom-buffer-name))) + ;; Fill it with the splash screen content (with-current-buffer doom-buffer (doom-mode) - (add-hook 'evil-insert-state-entry-hook 'doom-mode-erase-on-insert nil t) - (add-hook 'after-change-major-mode-hook 'doom-mode-erase-on-insert nil t) - (erase-buffer) + (add-hook 'evil-insert-state-entry-hook 'doom|mode-erase-on-insert nil t) + (add-hook 'after-change-major-mode-hook 'doom|mode-erase-on-insert nil t) (setq doom-buffer-edited nil) - (insert - (let* ((auto-detect-frame (or auto-detect-frame (not window-system))) - (width (max 3 (- (if auto-detect-frame - (window-width) - (cdr (assq 'width default-frame-alist))) 3))) - (height (if auto-detect-frame - (window-height) - (cdr (assq 'height default-frame-alist)))) - (lead (make-string (truncate (max 0 (/ (- width 78) 2))) ? ))) - (concat - (propertize - (concat - (make-string (max 5 (- (truncate (/ height 2)) 12)) ?\n) - lead "================= =============== =============== ======== ========\n" - lead "\\\\ . . . . . . .\\\\ //. . . . . . .\\\\ //. . . . . . .\\\\ \\\\. . .\\\\// . . //\n" - lead "||. . ._____. . .|| ||. . ._____. . .|| ||. . ._____. . .|| || . . .\\/ . . .||\n" - lead "|| . .|| ||. . || || . .|| ||. . || || . .|| ||. . || ||. . . . . . . ||\n" - lead "||. . || || . .|| ||. . || || . .|| ||. . || || . .|| || . | . . . . .||\n" - lead "|| . .|| ||. _-|| ||-_ .|| ||. . || || . .|| ||. _-|| ||-_.|\\ . . . . ||\n" - lead "||. . || ||-' || || `-|| || . .|| ||. . || ||-' || || `|\\_ . .|. .||\n" - lead "|| . _|| || || || || ||_ . || || . _|| || || || |\\ `-_/| . ||\n" - lead "||_-' || .|/ || || \\|. || `-_|| ||_-' || .|/ || || | \\ / |-_.||\n" - lead "|| ||_-' || || `-_|| || || ||_-' || || | \\ / | `||\n" - lead "|| `' || || `' || || `' || || | \\ / | ||\n" - lead "|| .===' `===. .==='.`===. .===' /==. | \\/ | ||\n" - lead "|| .==' \\_|-_ `===. .===' _|_ `===. .===' _-|/ `== \\/ | ||\n" - lead "|| .==' _-' `-_ `=' _-' `-_ `=' _-' `-_ /| \\/ | ||\n" - lead "|| .==' _-' '-__\\._-' '-_./__-' `' |. /| | ||\n" - lead "||.==' _-' `' | /==.||\n" - lead "==' _-' E M A C S \\/ `==\n" - lead "\\ _-' `-_ /\n" - lead " `'' ``'") - 'face 'font-lock-comment-face) - "\n\n" - (propertize - (s-trim-right - (s-center (max 0 (1- width)) "Press `,m` to open recent files, or `,E` to access emacs.d")) - 'face 'font-lock-keyword-face) - (concat - "\n\n" - (s-trim-right (s-center (max 0 (- width 2)) (format "Loaded in %s" (emacs-init-time)))))))) - (back-to-indentation) - (doom|update-scratch-buffer nil t) - + (let ((width 78) height) + (mapc (lambda (window) + (set-window-margins window 0 0) + (let ((pad (max 0 (- (truncate (/ (window-width window) 2)) (truncate (/ width 2)))))) + (set-window-margins window pad pad) + (setq height (max 0 + (min (or height 9999) + (- (truncate (/ (window-height window) 2)) 13)))))) + (get-buffer-window-list doom-buffer nil t)) + (erase-buffer) + (insert (propertize + (concat + (make-string (if height (max 0 height) 0) ?\n) + "================= =============== =============== ======== ========\n" + "\\\\ . . . . . . .\\\\ //. . . . . . .\\\\ //. . . . . . .\\\\ \\\\. . .\\\\// . . //\n" + "||. . ._____. . .|| ||. . ._____. . .|| ||. . ._____. . .|| || . . .\\/ . . .||\n" + "|| . .|| ||. . || || . .|| ||. . || || . .|| ||. . || ||. . . . . . . ||\n" + "||. . || || . .|| ||. . || || . .|| ||. . || || . .|| || . | . . . . .||\n" + "|| . .|| ||. _-|| ||-_ .|| ||. . || || . .|| ||. _-|| ||-_.|\\ . . . . ||\n" + "||. . || ||-' || || `-|| || . .|| ||. . || ||-' || || `|\\_ . .|. .||\n" + "|| . _|| || || || || ||_ . || || . _|| || || || |\\ `-_/| . ||\n" + "||_-' || .|/ || || \\|. || `-_|| ||_-' || .|/ || || | \\ / |-_.||\n" + "|| ||_-' || || `-_|| || || ||_-' || || | \\ / | `||\n" + "|| `' || || `' || || `' || || | \\ / | ||\n" + "|| .===' `===. .==='.`===. .===' /==. | \\/ | ||\n" + "|| .==' \\_|-_ `===. .===' _|_ `===. .===' _-|/ `== \\/ | ||\n" + "|| .==' _-' `-_ `=' _-' `-_ `=' _-' `-_ /| \\/ | ||\n" + "|| .==' _-' '-__\\._-' '-_./__-' `' |. /| | ||\n" + "||.==' _-' `' | /==.||\n" + "==' _-' E M A C S \\/ `==\n" + "\\ _-' `-_ /\n" + " `'' ``'") + 'face 'font-lock-comment-face) + "\n\n" + (propertize + (s-center 78 "Press `,m` to open recent files, or `,E` to access emacs.d") + 'face 'font-lock-keyword-face) + "\n\n" + (s-center 78 (format "Loaded in %s" (emacs-init-time)))) + (back-to-indentation)) + ;; + (when dir (setq default-directory dir)) + ;; + (setq mode-line-format (doom-modeline 'scratch)) ;; Readjust the scratch buffer if it is visible, when the window config changes. - (add-hook 'window-configuration-change-hook 'doom|update-scratch-buffer-hook))) + (add-hook 'window-configuration-change-hook 'doom-reload-scratch-buffer))) (provide 'core-scratch) ;;; core-scratch.el ends here diff --git a/core/core.el b/core/core.el index 31d8450b4..69ad3bc8e 100644 --- a/core/core.el +++ b/core/core.el @@ -21,6 +21,9 @@ ;; Global Constants ;; +(defconst doom-version "1.2.9" + "Current version of DOOM emacs") + (defconst doom-emacs-dir (expand-file-name user-emacs-directory) "The path to this emacs.d directory") diff --git a/core/defuns/defuns-buffers.el b/core/defuns/defuns-buffers.el index ebd9bffab..724646ec4 100644 --- a/core/defuns/defuns-buffers.el +++ b/core/defuns/defuns-buffers.el @@ -1,5 +1,6 @@ ;;; defuns-buffers.el +(defvar doom-buffer) (defvar-local doom--narrowed-origin nil) ;;;###autoload (autoload 'doom:narrow "defuns-buffers" nil t) @@ -121,24 +122,23 @@ NOTE: only buries scratch buffer. See `doom/real-buffer-p' for what 'real' means." (interactive (list t)) - (cond ((eq (current-buffer) doom-buffer) - (doom-mode-init t)) - (t - (let* ((old-project (doom/project-root)) - (buffer (current-buffer)) - (only-buffer-window-p (= (length (get-buffer-window-list buffer nil t)) 1))) - (when (and only-buffer-window-p buffer-file-name (buffer-modified-p)) - (if (yes-or-no-p "Buffer is unsaved, save it?") - (save-buffer) - (set-buffer-modified-p nil))) - (when arg - (doom/previous-real-buffer) - (when (eq buffer (current-buffer)) - (switch-to-buffer doom-buffer t t) - (when (featurep 'core-scratch) - (doom|update-scratch-buffer old-project))) - (when only-buffer-window-p - (kill-buffer buffer)))))) + (let* ((scratch-p (eq (current-buffer) doom-buffer)) + (old-project (doom/project-root)) + (buffer (current-buffer)) + (only-buffer-window-p (= (length (get-buffer-window-list buffer nil t)) 1))) + (unless scratch-p + (when (and only-buffer-window-p buffer-file-name (buffer-modified-p)) + (if (yes-or-no-p "Buffer is unsaved, save it?") + (save-buffer) + (set-buffer-modified-p nil))) + (when arg + (doom/previous-real-buffer) + (when (eq buffer (current-buffer)) + (switch-to-buffer doom-buffer t t)) + (when only-buffer-window-p + (kill-buffer buffer)))) + (when (eq (current-buffer) doom-buffer) + (doom-reload-scratch-buffer old-project))) t) ;;;###autoload @@ -210,7 +210,7 @@ nothing left, create a scratch buffer." (cl-incf i)) (current-buffer)))) (when (eq destbuf doom-buffer) - (doom|update-scratch-buffer) + (doom-reload-scratch-buffer) (message "Nowhere to go")) (switch-to-buffer destbuf))) diff --git a/core/defuns/defuns-workgroup.el b/core/defuns/defuns-workgroup.el index 541de585b..82b5736a3 100644 --- a/core/defuns/defuns-workgroup.el +++ b/core/defuns/defuns-workgroup.el @@ -10,7 +10,7 @@ (defun doom/wg-projectile-switch-project () (let ((project-root (doom/project-root))) (doom:workgroup-new nil (file-name-nondirectory (directory-file-name project-root)) t) - (doom|update-scratch-buffer project-root) + (doom-reload-scratch-buffer project-root) (when (featurep 'neotree) (neotree-projectile-action))))