blob: c6a6ab5f21554469fc1da4fa53ca26cd12213f82 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
;;; dashboard.el --- My daashboard -*- lexical-binding: t; -*-
;;;###autoload
(defvar dashboard-buffer-name "durand"
"The name of the buffer for the dashboard.")
;;;###autoload
(defvar dashboard-cat-text
(list
" "
" /\\ "
" / \\ "
" / =\\= "
" / - \\=----- "
" / |.| / "
" \\\\ - - / "
" \\\\ |.| | "
" / \\\\ - / "
" / \\\\ / "
" ||==========| ========\\=| "
" ||==========| -- | "
" | || /==== | "
" == | / \\ \\ "
" | | \\ \\ "
" ==== ==== ")
"A clumsy text representation of a cute cat.")
;;;###autoload
(defun dashboard (&optional force)
"Create the dashboard buffer.
If FORCE is non-nil, re-gerenate the dashboard buffer."
(interactive)
(let ((dashboard-exists-p (get-buffer dashboard-buffer-name))
(dashboard (get-buffer-create dashboard-buffer-name))
(inhibit-read-only t))
(cond
((and (not force) dashboard-exists-p)
(switch-to-buffer dashboard))
(t
(with-current-buffer dashboard
(setq buffer-undo-list t)
(erase-buffer)
(cond
((display-graphic-p)
(let ((image (create-image (expand-file-name "cat.png" user-emacs-directory))))
(insert
(make-string 3 10)
(center-string-in-width
(propertize " " 'display image 'rear-nonsticky '(display))
(round (- (window-body-width)
(* (car (image-size image)) 1)))))))
((mapc (function
(lambda (str)
(insert
(center-string-in-width str (- (window-body-width) 13))
"\n")))
dashboard-cat-text)))
(newline 5)
(insert (center-string-in-width "Dashboard" (window-body-width)))
(read-only-mode 1)
(set 'mode-line-format '("%e" (:eval (modeline-format-dashboard))))
(set 'default-directory user-emacs-directory)
(view-mode 1)
(dashboard-mode))))
dashboard))
(set 'initial-buffer-choice #'dashboard)
;;; Dedicated major mode
(define-derived-mode dashboard-mode nil "Dashboard"
"Major mode for the dashboard buffer.
The main purpose is to provide a dedicated keymap to access
common functionalities more conveniently.")
(define-key dashboard-mode-map (vector ?l) #'blist)
(define-key dashboard-mode-map (vector ?b) #'bookmark-jump)
(define-key dashboard-mode-map (vector ?t) #'modeline-toggle)
(define-key dashboard-mode-map (vector ?o) #'durand-open-object)
(define-key dashboard-mode-map (vector ?g) #'gnus)
(define-key dashboard-mode-map (vector ?a) #'dashboard-org-agenda)
(define-key dashboard-mode-map (vector ?c) #'dashboard-org-capture)
(define-key dashboard-mode-map (vector ?l) #'dashboard-org-store-link)
;; load Org if not loaded already
(defmacro dashboard-preload (symbol file-to-load)
"Define a dispatch function for the symbol."
(list
'defun (intern (format "dashboard-%s" (symbol-name symbol)))
(list (intern "&rest") 'args)
(format
"A dispatch function for `%s'.
This function loads \"%s\" if `%s' is not already loaded, and
calls `%s' otherwise."
(symbol-name symbol)
file-to-load
(symbol-name symbol)
(symbol-name symbol))
(list 'interactive (list #'list 'current-prefix-arg t))
(list
'cond
(list (list 'not (list #'functionp `(quote ,symbol)))
(list #'load-config file-to-load))
(list (list #'funcall `(quote ,symbol) 'args)))))
(dashboard-preload org-agenda "org-conf.el")
(dashboard-preload org-capture "org-conf.el")
(dashboard-preload org-store-link "org-conf.el")
;;; Modify killing buffers
;;;###autoload
(defun dont-kill-dashboard-fn ()
"Don't kill the dashboard buffer."
(cond
((eq (current-buffer) (get-buffer dashboard-buffer-name))
;; The function message returns the message, so applying not will
;; produce nil as needed.
(not (message "Please don't kill the dashboard buffer")))
(t)))
(add-hook 'kill-buffer-query-functions 'dont-kill-dashboard-fn)
(provide 'dashboard)
;;; dashboard.el ends here.
|