diff options
| -rw-r--r-- | modules/dashboard-config.el | 13 | ||||
| -rw-r--r-- | tests/test-dashboard-config.el | 60 |
2 files changed, 67 insertions, 6 deletions
diff --git a/modules/dashboard-config.el b/modules/dashboard-config.el index 93477b48..cb97a076 100644 --- a/modules/dashboard-config.el +++ b/modules/dashboard-config.el @@ -60,7 +60,10 @@ Adjust this if the title doesn't appear centered under the banner image.") ;; convenience function to redisplay dashboard and kill all other windows (defun cj/dashboard-only () - "Switch to *dashboard* buffer, kill other buffers and windows, go to top." + "Switch to *dashboard* buffer, kill other buffers and windows, go to top. +Reset `window-start' alongside point so a previously-scrolled view +doesn't leak into this display when the buffer is taller than the +window." (interactive) (if (get-buffer "*dashboard*") (progn @@ -68,7 +71,8 @@ Adjust this if the title doesn't appear centered under the banner image.") (cj/kill-all-other-buffers-and-windows)) (when (fboundp 'dashboard-open) (dashboard-open))) - (goto-char (point-min))) + (goto-char (point-min)) + (set-window-start (selected-window) (point-min))) ;; --------------------------------- Dashboard --------------------------------- ;; a useful startup screen for Emacs @@ -93,13 +97,10 @@ Adjust this if the title doesn't appear centered under the banner image.") '(dashboard-insert-banner dashboard-insert-banner-title dashboard-insert-newline - dashboard-insert-newline dashboard-insert-navigator ;; dashboard-insert-init-info ; Disabled: package count and startup time dashboard-insert-newline - dashboard-insert-newline - dashboard-insert-items - dashboard-insert-newline)) + dashboard-insert-items)) :config ;; == general diff --git a/tests/test-dashboard-config.el b/tests/test-dashboard-config.el new file mode 100644 index 00000000..2dbcd4f4 --- /dev/null +++ b/tests/test-dashboard-config.el @@ -0,0 +1,60 @@ +;;; test-dashboard-config.el --- Tests for dashboard-config -*- lexical-binding: t; -*- + +;;; Commentary: +;; Exercises `cj/dashboard-only', the F1-bound entry point that displays the +;; *dashboard* buffer and resets the view to the top. The fix this test +;; locks in: window-start is forced to point-min, not left wherever a prior +;; view had scrolled to. Without that, a dashboard buffer taller than the +;; window opens with content above the visible area. + +;;; Code: + +(require 'ert) +(require 'cl-lib) + +(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory)) +(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory)) +(setq load-prefer-newer t) + +;; Stub package-level deps that dashboard-config pulls transitively. +(declare-function cj/kill-all-other-buffers-and-windows "undead-buffers") +(unless (fboundp 'cj/kill-all-other-buffers-and-windows) + (defun cj/kill-all-other-buffers-and-windows () nil)) +(unless (fboundp 'cj/make-buffer-undead) + (defun cj/make-buffer-undead (_name) nil)) + +(require 'dashboard-config) + +(ert-deftest test-dashboard-only-resets-window-start-to-point-min () + "Normal: `cj/dashboard-only' forces `window-start' to `point-min'. + +The dashboard buffer can be taller than the selected window's height +(banner + 3 navigator rows + sections). A prior call that left the +window scrolled into the buffer's middle must not leak into the next +display -- point should land at the top AND the window's view should +start at the top. Without `set-window-start', batch redisplay leaves +`window-start' wherever it was set." + (let ((dash (get-buffer-create "*dashboard*"))) + (unwind-protect + (progn + (with-current-buffer dash + (let ((inhibit-read-only t)) + (erase-buffer) + (insert (make-string 5000 ?x)) + (insert "\n"))) + (save-window-excursion + (switch-to-buffer dash) + (let ((win (selected-window))) + ;; Simulate a prior view that scrolled into the middle. + (set-window-start win 1000) + (should (= (window-start win) 1000)) + (cl-letf (((symbol-function 'cj/kill-all-other-buffers-and-windows) + #'ignore)) + (cj/dashboard-only)) + (should (= (window-start win) (point-min))) + (should (= (point) (point-min)))))) + (when (buffer-live-p dash) + (kill-buffer dash))))) + +(provide 'test-dashboard-config) +;;; test-dashboard-config.el ends here |
