From 374ae3de24187512adddf01a56e5eb52c79db65f Mon Sep 17 00:00:00 2001 From: Blendoit Date: Sat, 1 Aug 2020 15:18:40 -0700 Subject: Include contents of elpa/ sources + theme update. --- elpa/dashboard-20200306.1344/banners/1.txt | 8 + elpa/dashboard-20200306.1344/banners/2.txt | 6 + elpa/dashboard-20200306.1344/banners/3.txt | 8 + elpa/dashboard-20200306.1344/banners/emacs.png | Bin 0 -> 43759 bytes elpa/dashboard-20200306.1344/banners/logo.png | Bin 0 -> 32305 bytes .../dashboard-20200306.1344/dashboard-autoloads.el | 41 ++ elpa/dashboard-20200306.1344/dashboard-pkg.el | 13 + elpa/dashboard-20200306.1344/dashboard-widgets.el | 729 +++++++++++++++++++++ elpa/dashboard-20200306.1344/dashboard.el | 258 ++++++++ 9 files changed, 1063 insertions(+) create mode 100644 elpa/dashboard-20200306.1344/banners/1.txt create mode 100644 elpa/dashboard-20200306.1344/banners/2.txt create mode 100644 elpa/dashboard-20200306.1344/banners/3.txt create mode 100644 elpa/dashboard-20200306.1344/banners/emacs.png create mode 100644 elpa/dashboard-20200306.1344/banners/logo.png create mode 100644 elpa/dashboard-20200306.1344/dashboard-autoloads.el create mode 100644 elpa/dashboard-20200306.1344/dashboard-pkg.el create mode 100644 elpa/dashboard-20200306.1344/dashboard-widgets.el create mode 100644 elpa/dashboard-20200306.1344/dashboard.el (limited to 'elpa/dashboard-20200306.1344') diff --git a/elpa/dashboard-20200306.1344/banners/1.txt b/elpa/dashboard-20200306.1344/banners/1.txt new file mode 100644 index 0000000..8bd71a7 --- /dev/null +++ b/elpa/dashboard-20200306.1344/banners/1.txt @@ -0,0 +1,8 @@ + +######## ## ## ### ###### ###### +## ### ### ## ## ## ## ## ## +## #### #### ## ## ## ## +###### ## ### ## ## ## ## ###### +## ## ## ######### ## ## +## ## ## ## ## ## ## ## ## +######## ## ## ## ## ###### ###### diff --git a/elpa/dashboard-20200306.1344/banners/2.txt b/elpa/dashboard-20200306.1344/banners/2.txt new file mode 100644 index 0000000..73b761b --- /dev/null +++ b/elpa/dashboard-20200306.1344/banners/2.txt @@ -0,0 +1,6 @@ + _______ .___ ___. ___ ______ _______. +| ____|| \/ | / \ / | / | +| |__ | \ / | / ^ \ | ,----' | (----` +| __| | |\/| | / /_\ \ | | \ \ +| |____ | | | | / _____ \ | `----.----) | +|_______||__| |__| /__/ \__\ \______|_______/ diff --git a/elpa/dashboard-20200306.1344/banners/3.txt b/elpa/dashboard-20200306.1344/banners/3.txt new file mode 100644 index 0000000..3abfd82 --- /dev/null +++ b/elpa/dashboard-20200306.1344/banners/3.txt @@ -0,0 +1,8 @@ + _______ _____ ______ ________ ________ ________ +|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\ +\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_ + \ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \ + \ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \ + \ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \ + \|_______|\|__| \|__|\|__|\|__|\|_______|\_________\ + \|_________| diff --git a/elpa/dashboard-20200306.1344/banners/emacs.png b/elpa/dashboard-20200306.1344/banners/emacs.png new file mode 100644 index 0000000..718b071 Binary files /dev/null and b/elpa/dashboard-20200306.1344/banners/emacs.png differ diff --git a/elpa/dashboard-20200306.1344/banners/logo.png b/elpa/dashboard-20200306.1344/banners/logo.png new file mode 100644 index 0000000..c9de00c Binary files /dev/null and b/elpa/dashboard-20200306.1344/banners/logo.png differ diff --git a/elpa/dashboard-20200306.1344/dashboard-autoloads.el b/elpa/dashboard-20200306.1344/dashboard-autoloads.el new file mode 100644 index 0000000..cc682f5 --- /dev/null +++ b/elpa/dashboard-20200306.1344/dashboard-autoloads.el @@ -0,0 +1,41 @@ +;;; dashboard-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dashboard" "dashboard.el" (0 0 0 0)) +;;; Generated autoloads from dashboard.el + +(autoload 'dashboard-setup-startup-hook "dashboard" "\ +Setup post initialization hooks. +If a command line argument is provided, +assume a filename and skip displaying Dashboard. + +\(fn)" nil nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dashboard" '("dashboard-"))) + +;;;*** + +;;;### (autoloads nil "dashboard-widgets" "dashboard-widgets.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from dashboard-widgets.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dashboard-widgets" '("dashboard-" "recentf-list"))) + +;;;*** + +;;;### (autoloads nil nil ("dashboard-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dashboard-autoloads.el ends here diff --git a/elpa/dashboard-20200306.1344/dashboard-pkg.el b/elpa/dashboard-20200306.1344/dashboard-pkg.el new file mode 100644 index 0000000..44d332a --- /dev/null +++ b/elpa/dashboard-20200306.1344/dashboard-pkg.el @@ -0,0 +1,13 @@ +(define-package "dashboard" "20200306.1344" "A startup screen extracted from Spacemacs" + '((emacs "25.3") + (page-break-lines "0.11")) + :commit "bf38867ae80902d58207974b4a2bba4249324599" :keywords + '("startup" "screen" "tools" "dashboard") + :authors + '(("Rakan Al-Hneiti")) + :maintainer + '("Rakan Al-Hneiti") + :url "https://github.com/emacs-dashboard/emacs-dashboard") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/elpa/dashboard-20200306.1344/dashboard-widgets.el b/elpa/dashboard-20200306.1344/dashboard-widgets.el new file mode 100644 index 0000000..a045ce7 --- /dev/null +++ b/elpa/dashboard-20200306.1344/dashboard-widgets.el @@ -0,0 +1,729 @@ +;;; dashboard-widgets.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2020 Rakan Al-Hneiti & Contributors +;; +;; Author: Rakan Al-Hneiti +;; URL: https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "25.3") (page-break-lines "0.11")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projectile projects, org-agenda and more. + +;;; Code: + +(require 'cl-lib) + +;; Compiler pacifier +(declare-function all-the-icons-icon-for-dir "ext:all-the-icons.el") +(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") +(declare-function bookmark-get-filename "ext:bookmark.el") +(declare-function bookmark-all-names "ext:bookmark.el") +(declare-function calendar-date-compare "ext:calendar.el") +(declare-function projectile-cleanup-known-projects "ext:projectile.el") +(declare-function projectile-load-known-projects "ext:projectile.el") +(declare-function projectile-mode "ext:projectile.el") +(declare-function projectile-relevant-known-projects "ext:projectile.el") +(declare-function org-agenda-format-item "ext:org-agenda.el") +(declare-function org-compile-prefix-format "ext:org-agenda.el") +(declare-function org-entry-is-done-p "ext:org.el") +(declare-function org-get-category "ext:org.el") +(declare-function org-get-deadline-time "ext:org.el") +(declare-function org-get-heading "ext:org.el") +(declare-function org-get-scheduled-time "ext:org.el") +(declare-function org-get-tags "ext:org.el") +(declare-function org-map-entries "ext:org.el") +(declare-function org-outline-level "ext:org.el") +(defvar all-the-icons-dir-icon-alist) +(defvar package-activated-list) + +(defcustom dashboard-page-separator "\n\f\n" + "Separator to use between the different pages." + :type 'string + :group 'dashboard) + +(defcustom dashboard-image-banner-max-height 0 + "Maximum height of banner image. + +This setting applies only if Emacs is compiled with Imagemagick +support. When value is non-zero the image banner will be resized +to the specified height, with aspect ratio preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-image-banner-max-width 0 + "Maximum width of banner image. + +This setting applies if Emacs is compiled with Imagemagick +support. When value is non-zero the image banner will be resized +to the specified width, with aspect ratio preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-set-heading-icons nil + "When non nil, heading sections will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-file-icons nil + "When non nil, file lists will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-navigator nil + "When non nil, a navigator will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-init-info t + "When non nil, init info will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-footer t + "When non nil, a footer will be displayed at the bottom." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-footer-messages + '("The one true editor, Emacs!" + "Who the hell uses VIM anyway? Go Evil!" + "Free as free speech, free as free Beer" + "Richard Stallman is proud of you" + "Happy coding!" + "Vi Vi Vi, the editor of the beast" + "Welcome to the church of Emacs" + "While any text editor can save your files,\ + only Emacs can save your soul" + "I showed you my source code, pls respond") + "A list of messages, one of which dashboard chooses to display." + :type 'list + :group 'dashboard) + +(defcustom dashboard-show-shortcuts t + "Whether to show shortcut keys for each section." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-org-agenda-categories nil + "Specify the Categories to consider when using agenda in dashboard. +Example: +'(\"Tasks\" \"Habits\")" + :type 'list + :group 'dashboard) + +(defconst dashboard-banners-directory + (concat (file-name-directory + (locate-library "dashboard")) + "/banners/")) + +(defconst dashboard-banner-official-png + (expand-file-name (concat dashboard-banners-directory "emacs.png")) + "Emacs banner image.") + +(defconst dashboard-banner-logo-png + (expand-file-name (concat dashboard-banners-directory "logo.png")) + "Emacs banner image.") + +(defconst dashboard-banner-length 75 + "Width of a banner.") + +(defcustom dashboard-banner-logo-title "Welcome to Emacs!" + "Specify the startup banner." + :type 'string + :group 'dashboard) + +(defcustom dashboard-navigator-buttons nil + "Specify the navigator buttons. +The format is: 'icon title help action face prefix suffix'. + +Example: +'((\"☆\" \"Star\" \"Show stars\" (lambda (&rest _) (show-stars)) 'warning \"[\" \"]\"))" + :type '(repeat (repeat (list string string string function symbol string string))) + :group 'dashboard) + +(defcustom dashboard-init-info + ;; Check if package.el was loaded and if package loading was enabled + (if (bound-and-true-p package-alist) + (format "%d packages loaded in %s" + (length package-activated-list) (emacs-init-time)) + (if (and (boundp 'straight--profile-cache) (hash-table-p straight--profile-cache)) + (format "%d packages loaded in %s" + (hash-table-size straight--profile-cache) (emacs-init-time)) + (format "Emacs started in %s" (emacs-init-time)))) + "Init info with packages loaded and init time." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-footer + (let ((list '("The one true editor, Emacs!" + "Who the hell uses VIM anyway? Go Evil!" + "Free as free speech, free as free Beer" + "Richard Stallman is proud of you" + "Happy coding!" + "Vi Vi Vi, the editor of the beast" + "Welcome to the church of Emacs" + "While any text editor can save your files,\ + only Emacs can save your soul" + "I showed you my source code, pls respond" + ))) + (nth (random (1- (1+ (length list)))) list)) + "A footer with some short message." + :type 'string + :group 'dashboard) + +(defcustom dashboard-footer-icon + (if (and (display-graphic-p) + (or (fboundp 'all-the-icons-fileicon) + (require 'all-the-icons nil 'noerror))) + (all-the-icons-fileicon "emacs" + :height 1.1 + :v-adjust -0.05 + :face 'font-lock-keyword-face) + (propertize ">" 'face 'dashboard-footer)) + "Footer's icon." + :type 'string + :group 'dashboard) + +(defcustom dashboard-startup-banner 'official + "Specify the startup banner. +Default value is `official', it displays +the Emacs logo. `logo' displays Emacs alternative logo. +An integer value is the index of text +banner. A string value must be a path to a .PNG file. +If the value is nil then no banner is displayed." + :type '(choice (const :tag "offical" official) + (const :tag "logo" logo) + (string :tag "a png path")) + :group 'dashboard) + +(defcustom dashboard-buffer-last-width nil + "Previous width of dashboard-buffer." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-item-generators '((recents . dashboard-insert-recents) + (bookmarks . dashboard-insert-bookmarks) + (projects . dashboard-insert-projects) + (agenda . dashboard-insert-agenda) + (registers . dashboard-insert-registers)) + "Association list of items to how to generate in the startup buffer. +Will be of the form `(list-type . list-function)'. +Possible values for list-type are: `recents', `bookmarks', `projects', +`agenda' ,`registers'." + :type '(repeat (alist :key-type symbol :value-type function)) + :group 'dashboard) + +(defcustom dashboard-items '((recents . 5) + (bookmarks . 5) + (agenda . 5)) + "Association list of items to show in the startup buffer. +Will be of the form `(list-type . list-size)'. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'." + :type '(repeat (alist :key-type symbol :value-type integer)) + :group 'dashboard) + +(defcustom dashboard-items-default-length 20 + "Length used for startup lists with otherwise unspecified bounds. +Set to nil for unbounded." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-heading-icons '((recents . "history") + (bookmarks . "bookmark") + (agenda . "calendar") + (projects . "rocket") + (registers . "database")) + "Association list for the icons of the heading sections. +Will be of the form `(list-type . icon-name-string)`. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defvar recentf-list nil) + +;; +;; Faces +;; +(defface dashboard-text-banner + '((t (:inherit font-lock-keyword-face))) + "Face used for text banners." + :group 'dashboard) + +(defface dashboard-banner-logo-title + '((t :inherit default)) + "Face used for the banner title." + :group 'dashboard) + +(defface dashboard-navigator + '((t (:inherit font-lock-keyword-face))) + "Face used for the navigator." + :group 'dashboard) + +(defface dashboard-heading + '((t (:inherit font-lock-keyword-face))) + "Face used for widget headings." + :group 'dashboard) + +(defface dashboard-footer + '((t (:inherit font-lock-doc-face))) + "Face used for widget headings." + :group 'dashboard) + +(define-obsolete-face-alias + 'dashboard-text-banner-face 'dashboard-text-banner "1.2.6") +(define-obsolete-face-alias + 'dashboard-banner-logo-title-face 'dashboard-banner-logo-title "1.2.6") +(define-obsolete-face-alias + 'dashboard-heading-face 'dashboard-heading "1.2.6") + +;; +;; Generic widget helpers +;; +(defun dashboard-subseq (seq start end) + "Return the subsequence of SEQ from START to END.. +Uses `cl-subseq`, but accounts for end points greater than the size of the +list. +Return entire list if `END' is omitted." + (let ((len (length seq))) + (cl-subseq seq start (and (number-or-marker-p end) + (min len end))))) + +(defmacro dashboard-insert-shortcut (shortcut-char + search-label + &optional no-next-line) + "Insert a shortcut SHORTCUT-CHAR for a given SEARCH-LABEL. +Optionally, provide NO-NEXT-LINE to move the cursor forward a line." + `(progn + (eval-when-compile (defvar dashboard-mode-map)) + (let ((sym (make-symbol (format "Jump to \"%s\"" ,search-label)))) + (fset sym (lambda () + (interactive) + (unless (search-forward ,search-label (point-max) t) + (search-backward ,search-label (point-min) t)) + ,@(unless no-next-line + '((forward-line 1))) + (back-to-indentation))) + (eval-after-load 'dashboard + (define-key dashboard-mode-map ,shortcut-char sym))))) + +(defun dashboard-append (msg &optional _messagebuf) + "Append MSG to dashboard buffer. +If MESSAGEBUF is not nil then MSG is also written in message buffer." + (with-current-buffer (get-buffer-create "*dashboard*") + (goto-char (point-max)) + (let ((buffer-read-only nil)) + (insert msg)))) + +(defun dashboard-modify-heading-icons (alist) + "Append ALIST items to `dashboard-heading-icons' to modify icons." + (dolist (icon alist) + (add-to-list 'dashboard-heading-icons icon))) + +(defun dashboard-insert-page-break () + "Insert a page break line in dashboard buffer." + (dashboard-append dashboard-page-separator)) + +(defun dashboard-insert-heading (heading &optional shortcut) + "Insert a widget HEADING in dashboard buffer, adding SHORTCUT if provided." + (when (and (display-graphic-p) + dashboard-set-heading-icons) + ;; Try loading `all-the-icons' + (unless (or (fboundp 'all-the-icons-octicon) + (require 'all-the-icons nil 'noerror)) + (error "Package `all-the-icons' isn't installed")) + + (insert (cond + ((string-equal heading "Recent Files:") + (all-the-icons-octicon (cdr (assoc 'recents dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Bookmarks:") + (all-the-icons-octicon (cdr (assoc 'bookmarks dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((or (string-equal heading "Agenda for today:") + (string-equal heading "Agenda for the coming week:")) + (all-the-icons-octicon (cdr (assoc 'agenda dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Registers:") + (all-the-icons-octicon (cdr (assoc 'registers dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Projects:") + (all-the-icons-octicon (cdr (assoc 'projects dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + (t " "))) + (insert " ")) + + (insert (propertize heading 'face 'dashboard-heading)) + (if shortcut (insert (format " (%s)" shortcut)))) + +(defun dashboard-center-line (string) + "Center a STRING accoring to it's size." + (insert (make-string (max 0 (floor (/ (- dashboard-banner-length + (+ (length string) 1)) 2))) ?\ ))) + +;; +;; BANNER +;; +(defun dashboard-insert-ascii-banner-centered (file) + "Insert banner from FILE." + (let ((ascii-banner + (with-temp-buffer + (insert-file-contents file) + (let ((banner-width 0)) + (while (not (eobp)) + (let ((line-length (- (line-end-position) (line-beginning-position)))) + (if (< banner-width line-length) + (setq banner-width line-length))) + (forward-line 1)) + (goto-char 0) + (let ((margin + (max 0 (floor (/ (- dashboard-banner-length banner-width) 2))))) + (while (not (eobp)) + (insert (make-string margin ?\ )) + (forward-line 1)))) + (buffer-string)))) + (put-text-property 0 (length ascii-banner) 'face 'dashboard-text-banner ascii-banner) + (insert ascii-banner))) + +(defun dashboard-insert-image-banner (banner) + "Display an image BANNER." + (when (file-exists-p banner) + (let* ((title dashboard-banner-logo-title) + (spec + (if (image-type-available-p 'imagemagick) + (apply 'create-image banner 'imagemagick nil + (append (when (> dashboard-image-banner-max-width 0) + (list :max-width dashboard-image-banner-max-width)) + (when (> dashboard-image-banner-max-height 0) + (list :max-height dashboard-image-banner-max-height)))) + (create-image banner))) + (size (image-size spec)) + (width (car size)) + (left-margin (max 0 (floor (- dashboard-banner-length width) 2)))) + (goto-char (point-min)) + (insert "\n") + (insert (make-string left-margin ?\ )) + (insert-image spec) + (insert "\n\n") + (when title + (dashboard-center-line title) + (insert (format "%s\n\n" (propertize title 'face 'dashboard-banner-logo-title))))))) + +;; +;; INIT INFO +;; +(defun dashboard-insert-init-info () + "Insert init info when `dashboard-set-init-info' is t." + (when dashboard-set-init-info + (dashboard-center-line dashboard-init-info) + (insert + (propertize dashboard-init-info 'face 'font-lock-comment-face)))) + +(defun dashboard-get-banner-path (index) + "Return the full path to banner with index INDEX." + (concat dashboard-banners-directory (format "%d.txt" index))) + +(defun dashboard-choose-banner () + "Return the full path of a banner based on the dotfile value." + (when dashboard-startup-banner + (cond ((eq 'official dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-official-png + (dashboard-get-banner-path 1))) + ((eq 'logo dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-logo-png + (dashboard-get-banner-path 1))) + ((integerp dashboard-startup-banner) + (dashboard-get-banner-path dashboard-startup-banner)) + ((and dashboard-startup-banner + (image-type-available-p (intern (file-name-extension + dashboard-startup-banner))) + (display-graphic-p)) + (if (file-exists-p dashboard-startup-banner) + dashboard-startup-banner + (message (format "could not find banner %s" + dashboard-startup-banner)) + (dashboard-get-banner-path 1))) + (t (dashboard-get-banner-path 1))))) + +(defun dashboard-insert-banner () + "Insert Banner at the top of the dashboard." + (goto-char (point-max)) + (let ((banner (dashboard-choose-banner)) + (buffer-read-only nil)) + (progn + (when banner + (if (image-type-available-p (intern (file-name-extension banner))) + (dashboard-insert-image-banner banner) + (dashboard-insert-ascii-banner-centered banner)) + (dashboard-insert-navigator) + (dashboard-insert-init-info))))) + +(defun dashboard-insert-navigator () + "Insert Navigator of the dashboard." + (when (and dashboard-set-navigator dashboard-navigator-buttons) + (dolist (line dashboard-navigator-buttons) + (dolist (btn line) + (let* ((icon (car btn)) + (title (cadr btn)) + (help (or (cadr (cdr btn)) "")) + (action (or (cadr (cddr btn)) #'ignore)) + (face (or (cadr (cddr (cdr btn))) 'dashboard-navigator)) + (prefix (or (cadr (cddr (cddr btn))) (propertize "[" 'face face))) + (suffix (or (cadr (cddr (cddr (cdr btn)))) (propertize "]" 'face face)))) + (widget-create 'item + :tag (concat + (when icon + (propertize icon 'face `(:inherit + ,(get-text-property 0 'face icon) + :inherit + ,face))) + (when (and icon title + (not (string-equal icon "")) + (not (string-equal title ""))) + (propertize " " 'face 'variable-pitch)) + (when title (propertize title 'face face))) + :help-echo help + :action action + :button-face `(:underline nil) + :mouse-face 'highlight + :button-prefix prefix + :button-suffix suffix + :format "%[%t%]") + (insert " "))) + (let* ((width (current-column))) + (beginning-of-line) + (dashboard-center-line (make-string width ?\s)) + (end-of-line)) + (insert "\n")) + (insert "\n"))) + +(defmacro dashboard-insert-section (section-name list list-size shortcut action &rest widget-params) + "Add a section with SECTION-NAME and LIST of LIST-SIZE items to the dashboard. +SHORTCUT is the keyboard shortcut used to access the section. +ACTION is theaction taken when the user activates the widget button. +WIDGET-PARAMS are passed to the \"widget-create\" function." + `(progn + (dashboard-insert-heading ,section-name + (if (and ,list dashboard-show-shortcuts) ,shortcut)) + (if ,list + (when (dashboard-insert-section-list + ,section-name + (dashboard-subseq ,list 0 ,list-size) + ,action + ,@widget-params) + (dashboard-insert-shortcut ,shortcut ,section-name)) + (insert "\n --- No items ---")))) + +;; +;; Section list +;; +(defmacro dashboard-insert-section-list (section-name list action &rest rest) + "Insert into SECTION-NAME a LIST of items, expanding ACTION and passing REST to widget creation." + `(when (car ,list) + (mapc + (lambda (el) + (let ((tag ,@rest)) + (insert "\n ") + + (when (and (display-graphic-p) + dashboard-set-file-icons + (or (fboundp 'all-the-icons-icon-for-dir) + (require 'all-the-icons nil 'noerror))) + (let* ((path (car (last (split-string ,@rest " - ")))) + (icon (if (and (not (file-remote-p path)) + (file-directory-p path)) + (all-the-icons-icon-for-dir path nil "") + (cond + ((string-equal ,section-name "Agenda for today:") + (all-the-icons-octicon "primitive-dot" :height 1.0 :v-adjust 0.01)) + ((file-remote-p path) + (all-the-icons-octicon "radio-tower" :height 1.0 :v-adjust 0.01)) + (t (all-the-icons-icon-for-file (file-name-nondirectory path) + :v-adjust -0.05)))))) + (setq tag (concat icon " " ,@rest)))) + + (widget-create 'item + :tag tag + :action ,action + :button-face `(:underline nil) + :mouse-face 'highlight + :button-prefix "" + :button-suffix "" + :format "%[%t%]"))) + ,list))) + +;; Footer +(defun dashboard-random-footer () + "Return a random footer from `dashboard-footer-messages'." + (nth (random (length dashboard-footer-messages)) dashboard-footer-messages)) + +(defun dashboard-insert-footer () + "Insert footer of dashboard." + (let ((footer (and dashboard-set-footer (dashboard-random-footer)))) + (when footer + (insert "\n") + (dashboard-center-line footer) + (insert dashboard-footer-icon) + (insert " ") + (insert (propertize footer 'face 'dashboard-footer)) + (insert "\n")))) + +;; +;; Recentf +;; +(defun dashboard-insert-recents (list-size) + "Add the list of LIST-SIZE items from recently edited files." + (recentf-mode) + (dashboard-insert-section + "Recent Files:" + recentf-list + list-size + "r" + `(lambda (&rest ignore) (find-file-existing ,el)) + (abbreviate-file-name el))) + +;; +;; Bookmarks +;; +(defun dashboard-insert-bookmarks (list-size) + "Add the list of LIST-SIZE items of bookmarks." + (require 'bookmark) + (dashboard-insert-section + "Bookmarks:" + (dashboard-subseq (bookmark-all-names) + 0 list-size) + list-size + "m" + `(lambda (&rest ignore) (bookmark-jump ,el)) + (let ((file (bookmark-get-filename el))) + (if file + (format "%s - %s" el (abbreviate-file-name file)) + el)))) + +;; +;; Projectile +;; +(defun dashboard-insert-projects (list-size) + "Add the list of LIST-SIZE items of projects." + (require 'projectile) + (let ((inhibit-message t) (message-log-max nil)) + (projectile-cleanup-known-projects)) + (projectile-load-known-projects) + (dashboard-insert-section + "Projects:" + (dashboard-subseq (projectile-relevant-known-projects) + 0 list-size) + list-size + "p" + `(lambda (&rest ignore) (projectile-switch-project-by-name ,el)) + (abbreviate-file-name el))) + +;; +;; Org Agenda +;; +(defun dashboard-timestamp-to-gregorian-date (timestamp) + "Convert TIMESTAMP to a gregorian date. + +The result can be used with functions like +`calendar-date-compare'." + (let ((decoded-timestamp (decode-time timestamp))) + (list (nth 4 decoded-timestamp) + (nth 3 decoded-timestamp) + (nth 5 decoded-timestamp)))) + +(defun dashboard-date-due-p (timestamp &optional due-date) + "Check if TIMESTAMP is today or in the past. + +If DUE-DATE is nil, compare TIMESTAMP to today; otherwise, +compare to the date in DUE-DATE. + +The time part of both TIMESTAMP and DUE-DATE is ignored, only the +date part is considered." + (unless due-date + (setq due-date (current-time))) + (setq due-date (time-add due-date 86400)) + (let* ((gregorian-date (dashboard-timestamp-to-gregorian-date timestamp)) + (gregorian-due-date (dashboard-timestamp-to-gregorian-date due-date))) + (calendar-date-compare (list gregorian-date) + (list gregorian-due-date)))) + +(defun dashboard-get-agenda () + "Get agenda items for today or for a week from now." + (org-compile-prefix-format 'agenda) + (let ((due-date nil)) + (if (and (boundp 'show-week-agenda-p) show-week-agenda-p) + (setq due-date (time-add (current-time) (* 86400 7))) + (setq due-date nil) + ) + (let* ((filtered-entries nil)) + (org-map-entries + (lambda () + (let* ((schedule-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (item (org-agenda-format-item + (format-time-string "%Y-%m-%d" schedule-time) + (org-get-heading t t) + (org-outline-level) + (org-get-category) + (org-get-tags) + t)) + (loc (point)) + (file (buffer-file-name))) + (if (or (equal dashboard-org-agenda-categories nil) + (member (org-get-category) dashboard-org-agenda-categories)) + (when (and (not (org-entry-is-done-p)) + (or (and schedule-time (dashboard-date-due-p schedule-time due-date)) + (and deadline-time (dashboard-date-due-p deadline-time due-date)))) + (setq filtered-entries + (append filtered-entries + (list (list item schedule-time deadline-time loc file)))))))) + nil + 'agenda) + filtered-entries))) + +(defun dashboard-insert-agenda (list-size) + "Add the list of LIST-SIZE items of agenda." + (require 'org-agenda) + (require 'calendar) + (let ((agenda (dashboard-get-agenda))) + (dashboard-insert-section + (or (and (boundp 'show-week-agenda-p) show-week-agenda-p "Agenda for the coming week:") + "Agenda for today:") + agenda + list-size + "a" + `(lambda (&rest ignore) + (let ((buffer (find-file-other-window (nth 4 ',el)))) + (with-current-buffer buffer + (goto-char (nth 3 ',el))) + (switch-to-buffer buffer))) + (format "%s" (nth 0 el))))) + +;; +;; Registers +;; +(defun dashboard-insert-registers (list-size) + "Add the list of LIST-SIZE items of registers." + (require 'register) + (dashboard-insert-section + "Registers:" + register-alist + list-size + "e" + (lambda (&rest _ignore) (jump-to-register (car el))) + (format "%c - %s" (car el) (register-describe-oneline (car el))))) + +(provide 'dashboard-widgets) +;;; dashboard-widgets.el ends here diff --git a/elpa/dashboard-20200306.1344/dashboard.el b/elpa/dashboard-20200306.1344/dashboard.el new file mode 100644 index 0000000..56b6418 --- /dev/null +++ b/elpa/dashboard-20200306.1344/dashboard.el @@ -0,0 +1,258 @@ +;;; dashboard.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2020 Rakan Al-Hneiti & Contributors +;; +;; Author: Rakan Al-Hneiti +;; URL: https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "25.3") (page-break-lines "0.11")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projectile projects, org-agenda and more. + +;;; Code: + +(require 'seq) +(require 'page-break-lines) +(require 'recentf) + +(require 'dashboard-widgets) + +;; Custom splash screen +(defvar dashboard-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-p") 'dashboard-previous-line) + (define-key map (kbd "C-n") 'dashboard-next-line) + (define-key map (kbd "") 'dashboard-previous-line) + (define-key map (kbd "") 'dashboard-next-line) + (define-key map (kbd "k") 'dashboard-previous-line) + (define-key map (kbd "j") 'dashboard-next-line) + (define-key map [tab] 'widget-forward) + (define-key map (kbd "C-i") 'widget-forward) + (define-key map [backtab] 'widget-backward) + (define-key map (kbd "RET") 'dashboard-return) + (define-key map [down-mouse-1] 'widget-button-click) + (define-key map (kbd "g") #'dashboard-refresh-buffer) + (define-key map (kbd "}") #'dashboard-next-section) + (define-key map (kbd "{") #'dashboard-previous-section) + map) + "Keymap for dashboard mode.") + +(define-derived-mode dashboard-mode special-mode "Dashboard" + "Dashboard major mode for startup screen. +\\ +" + :group 'dashboard + :syntax-table nil + :abbrev-table nil + (buffer-disable-undo) + (whitespace-mode -1) + (linum-mode -1) + (when (>= emacs-major-version 26) + (display-line-numbers-mode -1)) + (page-break-lines-mode 1) + (setq inhibit-startup-screen t) + (setq buffer-read-only t + truncate-lines t)) + +(defgroup dashboard nil + "Extensible startup screen." + :group 'applications) + +(defcustom dashboard-center-content nil + "Whether to center content within the window." + :type 'boolean + :group 'dashboard) + +(defconst dashboard-buffer-name "*dashboard*" + "Dashboard's buffer name.") + +(defvar dashboard--section-starts nil + "List of section starting positions.") + +(defun dashboard-previous-section () + "Navigate back to previous section." + (interactive) + (let ((current-section-start nil) + (current-position (point)) + (previous-section-start nil)) + (dolist (elt dashboard--section-starts) + (when (and current-section-start + (not previous-section-start)) + (setq previous-section-start elt)) + (when (and (not current-section-start) + (< elt current-position)) + (setq current-section-start elt))) + (goto-char (if (eq current-position current-section-start) + previous-section-start + current-section-start)))) + +(defun dashboard-next-section () + "Navigate forward to next section." + (interactive) + (let ((current-position (point)) + (next-section-start nil) + (section-starts (reverse dashboard--section-starts))) + (dolist (elt section-starts) + (when (and (not next-section-start) + (> elt current-position)) + (setq next-section-start elt))) + (when next-section-start + (goto-char next-section-start)))) + +(defun dashboard-previous-line (arg) + "Move point up and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + (interactive "^p") + (dashboard-next-line (- arg))) + +(defun dashboard-next-line (arg) + "Move point down and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + ;; code heavily inspired by `dired-next-line' + (interactive "^p") + (let ((line-move-visual nil) + (goal-column nil)) + (line-move arg t)) + ;; We never want to move point into an invisible line. Dashboard doesn’t + ;; use invisible text currently but when it does we’re ready! + (while (and (invisible-p (point)) + (not (if (and arg (< arg 0)) (bobp) (eobp)))) + (forward-char (if (and arg (< arg 0)) -1 1))) + (beginning-of-line-text)) + +(defun dashboard-return () + "Hit return key in dashboard buffer." + (interactive) + (let ((start-ln (line-number-at-pos)) + (fd-cnt 0) + (diff-line nil) + (entry-pt nil)) + (save-excursion + (while (and (not diff-line) + (not (= (point) (point-min))) + (not (get-char-property (point) 'button)) + (not (= (point) (point-max)))) + (forward-char 1) + (setq fd-cnt (1+ fd-cnt)) + (unless (= start-ln (line-number-at-pos)) + (setq diff-line t))) + (unless (= (point) (point-max)) + (setq entry-pt (point)))) + (when (= fd-cnt 1) + (setq entry-pt (1- (point)))) + (if entry-pt + (widget-button-press entry-pt) + (call-interactively #'widget-button-press)))) + +(defun dashboard-maximum-section-length () + "For the just-inserted section, calculate the length of the longest line." + (let ((max-line-length 0)) + (save-excursion + (dashboard-previous-section) + (while (not (eobp)) + (setq max-line-length + (max max-line-length + (- (line-end-position) (line-beginning-position)))) + (forward-line))) + max-line-length)) + +(defun dashboard-insert-startupify-lists () + "Insert the list of widgets into the buffer." + (interactive) + (let ((buffer-exists (buffer-live-p (get-buffer dashboard-buffer-name))) + (recentf-is-on (recentf-enabled-p)) + (origial-recentf-list recentf-list) + (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0)) + (max-line-length 0)) + ;; disable recentf mode, + ;; so we don't flood the recent files list with org mode files + ;; do this by making a copy of the part of the list we'll use + ;; let dashboard widgets change that + ;; then restore the orginal list afterwards + ;; (this avoids many saves/loads that would result from + ;; disabling/enabling recentf-mode) + (if recentf-is-on + (setq recentf-list (seq-take recentf-list dashboard-num-recents))) + (when (or (not (eq dashboard-buffer-last-width (window-width))) + (not buffer-exists)) + (setq dashboard-banner-length (window-width) + dashboard-buffer-last-width dashboard-banner-length) + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (let ((buffer-read-only nil)) + (erase-buffer) + (dashboard-insert-banner) + (dashboard-insert-page-break) + (setq dashboard--section-starts nil) + (mapc (lambda (els) + (let* ((el (or (car-safe els) els)) + (list-size + (or (cdr-safe els) + dashboard-items-default-length)) + (item-generator + (cdr-safe (assoc el dashboard-item-generators)))) + (add-to-list 'dashboard--section-starts (point)) + (funcall item-generator list-size) + (setq max-line-length + (max max-line-length (dashboard-maximum-section-length))) + (dashboard-insert-page-break))) + dashboard-items) + (when dashboard-center-content + (when dashboard--section-starts + (goto-char (car (last dashboard--section-starts)))) + (let ((margin (floor (/ (max (- (window-width) max-line-length) 0) 2)))) + (while (not (eobp)) + (and (not (eq ? (char-after))) + (insert (make-string margin ?\ ))) + (forward-line 1)))) + (dashboard-insert-footer)) + (dashboard-mode) + (goto-char (point-min)))) + (if recentf-is-on + (setq recentf-list origial-recentf-list)))) + +(add-hook 'window-setup-hook + (lambda () + (add-hook 'window-size-change-functions 'dashboard-resize-on-hook) + (dashboard-resize-on-hook))) + +(defun dashboard-refresh-buffer () + "Refresh buffer." + (interactive) + (kill-buffer dashboard-buffer-name) + (dashboard-insert-startupify-lists) + (switch-to-buffer dashboard-buffer-name)) + +(defun dashboard-resize-on-hook (&optional _) + "Re-render dashboard on window size change." + (let ((space-win (get-buffer-window dashboard-buffer-name)) + (frame-win (frame-selected-window))) + (when (and space-win + (not (window-minibuffer-p frame-win))) + (with-selected-window space-win + (dashboard-insert-startupify-lists))))) + +;;;###autoload +(defun dashboard-setup-startup-hook () + "Setup post initialization hooks. +If a command line argument is provided, +assume a filename and skip displaying Dashboard." + (when (< (length command-line-args) 2 ) + (add-hook 'after-init-hook (lambda () + ;; Display useful lists of items + (dashboard-insert-startupify-lists))) + (add-hook 'emacs-startup-hook '(lambda () + (switch-to-buffer "*dashboard*") + (goto-char (point-min)) + (redisplay))))) + +(provide 'dashboard) +;;; dashboard.el ends here -- cgit v1.2.3