134 lines
4.6 KiB
EmacsLisp

;;; welcome.el --- A dashboard that welcomes you! -*- lexical-binding: t; -*-
;; Copyright (C) 2023 Joseph Ferano
;; Author: Joseph Ferano <joseph@ferano.io>
;; Keywords: init, welcome, dashboard, startup
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
;; Something something minimalism and dasboards
;;; Code:
;; (require 'dashboard)
;; (defun dashboard-center-text (start end)
;; "Center the text between START and END."
;; (save-excursion
;; (goto-char start)
;; (let ((width 0))
;; (while (< (point) end)
;; (let* ((line-str (buffer-substring (line-beginning-position) (line-end-position)))
;; (line-length (dashboard-str-len line-str)))
;; (setq width (max width line-length)))
;; (forward-line 1))
;; (let ((prefix (propertize " " 'display `(space . (:align-to (- center ,(/ width 2)))))))
;; (add-text-properties start end `(line-prefix ,prefix indent-prefix ,prefix))))))
;; (defun dashboard-insert-center (&rest strings)
;; "Insert STRINGS in the center of the buffer."
;; (let ((start (point)))
;; (apply #'insert strings)
;; (dashboard-center-text start (point))))
(defvar welcome-load-project-map (make-sparse-keymap)
"High precedence keymap.")
(defun welcome--open-project ()
"Open the directory at point in dired."
(interactive)
(let ((path (file-truename (substring-no-properties
(thing-at-point 'filename)))))
(project-switch-project path)))
;; (evil-define-key 'normal 'joe/welcome-load-project-map (kbd "RET") #'joe/welcome-open-project)
;;
;; Look into (text-property-search-forward)
;; (text-property-search-backward)
;;
(defun welcome--load-bookmarks ()
(with-temp-buffer
(if (file-exists-p bookmark-file)
(progn
(insert-file-contents bookmark-file)
(goto-char (point-min))
(let ((bmarks (read (current-buffer))))
(mapcar (lambda (bm) (cons (car bm) (cdr (nth 1 bm)))) bmarks)))
(list '("No Bookmarks")))))
(defun welcome--load-projects ()
(with-temp-buffer
(insert-file-contents project-list-file)
(goto-char (point-min))
(let ((contents (apply #'append (read (current-buffer)))))
(if contents
(seq-subseq contents 0 (min (length contents) 4))
"No Projects"))))
(defun welcome--recent-files ()
(with-temp-buffer
(insert-file-contents recentf-save-file)
(goto-char (point-min))
(let ((contents (apply #'append (read (current-buffer)))))
(if contents
(seq-subseq contents 0 (min (length contents) 8))
"No Recent Files"))))
(defun welcome--recent-files ()
(if recentf-list
(seq-subseq recentf-list 0 (min (length recentf-list) 8))
"No Recent Files"))
(defun welcome--render-dash ()
"Show Welcome buffer"
(with-current-buffer (get-buffer-create "*Welcome*")
(buffer-size)
(erase-buffer)
(goto-char (point-min))
(insert-image (create-image "/home/joe/.config/emacs/Emacs@256.png"))
(insert "\n\n\n")
(insert "Welcome to Emacs!\n\n")
;; (dashboard-insert-center "testing this thing out\n\n")
(let* ((time-str (emacs-init-time))
(time (string-to-number (car (split-string time-str)))))
(insert (format "It took %.3f seconds to start up\n\n" time)))
(insert "Happy hacking!\n\n")
(insert "Projects:\n")
(dolist (proj (welcome--load-projects))
(insert (format "\t%s\n" proj)))
(insert "\nRecent Files:\n")
(dolist (file (welcome--recent-files))
(insert (format "\t%s\n" file)))
(insert "\nBookmarks:\n")
(dolist (bmark (welcome--load-bookmarks))
(insert (format "\t%s - %s\n" (car bmark) (cdr bmark))))
;; (insert (propertize (format "\t%s\n" proj) :keymap joe/welcome-load-project-map)))
(setq cursor-type nil)
(switch-to-buffer (current-buffer))
(goto-char 86)
(display-line-numbers-mode 0)
(olivetti-mode)
(read-only-mode +1)
(current-buffer)))
(setq initial-buffer-choice #'welcome--render-dash)
(provide 'welcome)
;;; welcome.el ends here