尝试自己写了一个 dashboard ~ 大家帮忙修正完善

目前只是主要框架,结合了 all-the-icons 的使用
虽然目前运行起来还看不出什么问题,但自己总感觉,居中对齐那一块写得有问题。如果大家发现有更好的写法或发现哪里需要修正,请帮忙修改指正。





;; -*- lexical-binding: t; -*-

(defun blove/make-dashboard-link (label link)
  "Return the file with full path."
  (interactive)
  (insert-button label
				 'action (lambda (_) (find-file link))
				 'follow-link t
				 'face 'blove/dashboard-link
				 )
  (insert "\n")
  )

(defun blove/dashboard ()
  "Main dashboard."
  (interactive)
  (setq file-nums 6)
  (setq blove/dashboard-logo (expand-file-name "lisp/blove-pic/ox.png" user-emacs-directory))
  (let ((buf (get-buffer-create "*Blove Dashboard*")))
	(with-current-buffer buf
	  (erase-buffer)
	  ;;; === insert logo begin ===
	  (insert "\n\n\n\n")
	  (let* ((image-file blove/dashboard-logo)
			 (img (create-image image-file)))
		(insert (propertize " " 'display `(space :align-to (+ center (-0.5 . ,img)))))
		(insert-image img)
		(insert "\n\n")
	  ;;; === insert logo end ===
		(if (< (- (length recentf-list) 2) file-nums)
			(setq endnum (- (length recentf-list) 2))
		  (setq endnum file-nums)
		  )
		(mapcar ;; === loop start
		 (lambda (item) ;; --- mani function start
		   (setq label
				 (concat (all-the-icons-icon-for-file (concat "ext:" item)) " "
						 (file-name-base item)
						 " " " "
						 "(."
						 (file-name-extension item)
						 ")"
						 )
				 )
		   (insert (propertize " " 'display `(space :align-to (+ center (-0.6 . ,img)))))
		   (blove/make-dashboard-link label item)
		   ) ;;; --- main function end
		 ;;; loop in iterms
		 (cl-loop for i from 0 to endnum
				  collect (nth i recentf-list) into rflst
				  finally return rflst
				  )
		 ) ;;; === end
		)
	  )
	(switch-to-buffer buf)
	(if (boundp 'evil-mode)
		(evil-normal-state)
	  )
	)
  )
(blove/dashboard)

2 个赞

这么显示icon不得累死?用all-the-icons-icon-for-file就行了

1 个赞

好的,感谢指点! :pray:
立刻修改试了一下!直接使用了 all-the-icons-icon-for-file
改成

(all-the-icons-icon-for-file (concat "ext:" item))

这样更进一步简化了代码。
感谢! :pray: :pray: :pray:

修改后简化代码–01
改用 all-the-icons-icon-for-file

为什么不直接用 emacs-dashboard呢?没看出有什么新的或者不一样的功能啊

一直都是在使用dashboard。一直也都感觉它挺好的。 自己写✍🏻dashboard的目的有三个: ①对dashboard很感兴趣。想尝试自己实现一下简化版的dashboard。:grin: ②想写一个精简适合自己、够用的dashboard。 ③通过尝试练写各类型的实现,更多得了解elisp。

3 个赞

这个挺好,开始界面本来使用到的功能就很少,自己写个简单版的dashboard 替换 emacs-dashboard,还是很不错。

1 个赞

:raised_hands: :handshake: :raised_hands: :raised_hands: :handshake: :raised_hands:

我提两点需求:

recent files 要显示完整目录

emacs启动时间显示也挺有用的

图片

1 个赞

你加载的包够少的啊 :joy:

我使用emacs几年了,在平时工作中 实际用到的 功能 就那么多,刚开始用emacs的时候,一心就想要做一个功能丰富,像一个百宝箱一样,看见别人有个比较好的功能,立马就加到自己的配置中。

用了几年之后才发现 很多功能都是闲置的,反正都是私人定制的配置,适合自己就好了。

所以我现在比较精简自己的配置,而且不光精简自己的配置,还包括一些插件。

比如 之前一直用你写的doom-modeline,你的插件是为了 兼容 其他插件,所以写了很多功能,但有些功能我几乎没怎么用,所以我直接自己做一个,并借鉴doom-modeline 优秀的地方。

现在我的mode-line是这样的:

跟你的doom-modeline很像,又保留自己需要的功能,还简单,这就是我使用emacs最舒服的方式

6 个赞

:ok_hand:t2:全路径那个容易。插件加载数量和启动时间,我需要整理一下。

一直在用你写的 doom-modeline,感觉很好用,
向你表示致敬!

适合自己的就是最好的。其实,emacs插件的精妙之处就在于有很多option,按自己的需求配置好就行,没必要都重新造轮子。当然,emacs文化允许也鼓励多元化。

1 个赞

客气,大家觉得好用就行 :grin:

1 个赞

自己写功能用 和 写插件给大家用,完全不同。
考虑的角度完全不同、涉及的范围不同,
需要承载的知识深度更是没有可比性。
所以,我真的觉得,能够写插件给大家用的你们,是最棒的! :+1:

3 个赞

显示全路径、显示插件数和启动时间已经加入
以自己目前的能力,只能先写成这样。
引用并修改了 dashboard-widgets.el 中的函数

1 个赞

修改后的代码在此

;; -*- lexical-binding: t; -*-

;;; === Defconst
(defconst blove/dashboard-logo (expand-file-name "lisp/blove-pic/ox.png" user-emacs-directory)
  "Blove-ashboard's logo.")
(defconst blove/dashboard-buf-name "*BloveDashboard*"
  "Dashboard's buffer name.")
(defconst file-nums 6
  "Recentf nums.")
(defconst endnum (if (< (- (length recentf-list) 2) file-nums)
  (- (length recentf-list) 2)
  file-nums)
  "c-loop end-num")
(defconst blove/full-path t
  "Full path name or base-name. :t | nil ")
(defconst blove/center-offset (if blove/full-path -1.5 -0.6)
  "Offset. : full-path -1.5, base-name -0.6")

;;; === Main Function
;;; ~ show packages % init-time
(defun blove/pack-time ()
  (let ((package-count 0) (time (emacs-init-time)))
    (when (bound-and-true-p package-alist)
      (setq package-count (length package-activated-list)))
    (when (boundp 'straight--profile-cache)
      (setq package-count (+ (hash-table-count straight--profile-cache) package-count)))
    (if (zerop package-count)
        (format "Emacs started in %s" time)
      (format "%d packages loaded in %s" package-count time))
	)
  )
;;; ~ insert all-the-icons-icon-for-file
(defun blove/insert-icons (item)
  "Return the all-the-icons-icon-for-file by item."
  (interactive)
  (insert (all-the-icons-icon-for-file (concat "ext:" item)
									   :height 1.1
									   :v-adjust -0.05
									   :face 'font-lock-keyword-face
									   ))
  )
;;; ~ make file link
(defun blove/make-dashboard-link (label link)
  "Return the file with full path."
  (interactive)
  (insert-button label
				 'action (lambda (_) (find-file link))
				 'follow-link t
				 'face 'blove/dashboard-link
				 )
  (insert "\n")
  )
;;; ~ main function
(defun blove/dashboard ()
  "Main dashboard."
  (interactive)
  (let ((buf (get-buffer-create blove/dashboard-buf-name)))
	(with-current-buffer buf
	  (erase-buffer)
	  ;;; === insert logo ===
	  (insert "\n\n\n\n")
	  (let* ((image-file blove/dashboard-logo)
			 (img (create-image image-file)))
		(insert (propertize " " 'display `(space :align-to (+ center (-0.5 . ,img)))))
		(insert-image img)
		(insert "\n\n")
	  ;;; === insert packages and emacs-init-time ===
		(insert (propertize " " 'display `(space :align-to (+ center (-0.9 . ,img)))))
		(insert (propertize (blove/pack-time) 'face '((:foreground "#ff0000" :weight bold))))
		(insert "\n\n")
		(mapcar ;; === loop start
		 (lambda (item) ;; --- mani function start
		   ;;; ~~~ insert all-the-icons
		   (insert (propertize " " 'display `(space :align-to (+ center (blove/center-offset . ,img)))))
		   (blove/insert-icons item)
		   ;;; ~~~ insert all-the-icons end
		   (setq label
				 (concat " "
						 (if blove/full-path item (file-name-base item))
						 " " " "
						 "(."
						 (file-name-extension item)
						 ")"
						 )
				 )
		   (blove/make-dashboard-link label item)
		   ) ;;; --- main function end
		 ;;; loop in iterms
		 (cl-loop for i from 0 to endnum
				  collect (nth i recentf-list) into rflst
				  finally return rflst
				  )
		 ) ;;; === end
		)
	  )
	(switch-to-buffer buf)
	(if (boundp 'evil-mode)
		(evil-normal-state)
	  )
	)
  )

(blove/dashboard)

欢迎提出更好的建议、或者帮忙修正! :nerd_face:

因为是写给个人用的,所以没有弄什么参数设置的功能

(defconst blove/full-path t
  "Full path name or base-name. :t | nil
需要显示全路径,就设置为 t。
我个人是喜欢只显示文件名,不显示路径的,所以我会设置为 nil
")

(defconst blove/center-offset (if blove/full-path -1.5 -0.6) 
  "Offset. : full-path -1.5, base-name -0.6
这里的 
-1.5 是对应全路径显示留白,
-0.6 是对应只显示文件名留白,都可以自行修改")

现在好像还依赖 dashboard 吧?

Symbol’s value as variable is void: recentf-list 我这边还会报错。

启动时间好像也算的不对