;;; welcome.el --- A dashboard that welcomes you! -*- lexical-binding: t; -*- ;; Copyright (C) 2023 Joseph Ferano ;; Author: Joseph Ferano ;; 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 . ;;; 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