新人报到,多多关照✨
我在2025年的夏天学习 Common Lisp (SBCL) 时用过一点点 Emacs,当时的配置文件里面只有短短几行,简单地启用了 SLY,从 M-x sly 进入 REPL 学习,过了一遍 CL 基本语法;
现在忽然觉得 IDE 特别重,想起了 Emacs,认真再过了一遍自带的 Tutorial,又借助各种 chatbot 进一步学习(真比查手册爽吧),init.el 逐渐堆到了 200 多行;
最近两天,我借助AI助手,搓了一个可以自动关闭*dashboard*的逻辑,贴在这里可供大家讨论:
;; Dashboard 配置
;; 定义一个局部变量,用于记录 Dashboard 缓冲区之前是否在当前窗口可见
(defvar-local sztk-dashboard--was-visible nil)
(use-package dashboard
:init
;; 使用 project.el 作为项目列表的后端
(setq dashboard-projects-backend 'project-el)
:config
;; 基础 UI 配置
(setq dashboard-startup-banner 'official ; 使用官方 Logo
dashboard-center-content t ; 内容居中显示
dashboard-show-shortcuts t ; 显示快捷键
dashboard-items '((projects . 3) ; 显示 3 个最近项目
(recents . 3)) ; 显示 3 个最近文件
dashboard-footer-messages '("Esc - Meta - Alt - Ctrl - Shift"))
;; 启用启动钩子
(dashboard-setup-startup-hook)
;; 自动清理 Dashboard buffer
;; 当离开 Dashboard 去看其他内容时,自动关掉这个 buffer
(defun sztk-auto-kill-dashboard (&rest _)
(let ((buf (get-buffer "*dashboard*")))
(if (not buf)
;; 如果 buffer 已经不存在了,移除钩子
(remove-hook 'buffer-list-update-hook #'sztk-auto-kill-dashboard)
(with-current-buffer buf
(let ((is-visible (get-buffer-window buf 'visible)))
(cond
;; 1. 如果当前正看着 Dashboard,标记为“已可见”
(is-visible
(setq-local sztk-dashboard--was-visible t))
;; 2. 如果之前可见但现在不可见了
((and sztk-dashboard--was-visible (not is-visible))
;; 移除监听钩子
(remove-hook 'buffer-list-update-hook
#'sztk-auto-kill-dashboard)
;; 延迟一瞬间清理 buffer
(run-with-idle-timer
0 nil
(lambda (b)
(when (buffer-live-p b) (kill-buffer b)))
buf))))))))
;; 注册清理钩子,针对 Daemon 模式进行 Dashboard 刷新
(defun sztk-dashboard--do-register-cleanup-hook ()
(when (and (fboundp 'daemonp) (daemonp))
;; 如果是 Daemon 模式,在创建第一个 Frame 后刷新 Dashboard
(remove-hook 'server-after-make-frame-hook
#'sztk-dashboard--do-register-cleanup-hook)
(when-let ((buf (get-buffer "*dashboard*")))
(switch-to-buffer buf)
(with-current-buffer buf
(dashboard-refresh-buffer))))
;; 添加 buffer 更新钩子,开启自动清理逻辑
(add-hook 'buffer-list-update-hook #'sztk-auto-kill-dashboard))
;; 注册清理钩子的入口函数
(defun sztk-dashboard-register-cleanup-hook ()
(if (and (fboundp 'daemonp) (daemonp))
;; 如果是 Daemon 模式,等待 Client 连接后再执行
(add-hook 'server-after-make-frame-hook
#'sztk-dashboard--do-register-cleanup-hook)
;; 普通模式直接执行
(sztk-dashboard--do-register-cleanup-hook)))
;; 当 Dashboard 初始化完成后,启动上述清理注册流程
(add-hook 'dashboard-after-initialize-hook
#'sztk-dashboard-register-cleanup-hook))
待我把 eglot, python-ts-mode, ruff, pyright 和 envrc 等等的关系弄明白,写些实际的代码,Emacs 学得应该还会更快吧?