惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
N
Netflix TechBlog - Medium
F
Fortinet All Blogs
T
Tailwind CSS Blog
Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
J
Java Code Geeks
Recent Announcements
Recent Announcements
The Cloudflare Blog
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
Vercel News
Vercel News
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Azure Blog
Microsoft Azure Blog
雷峰网
雷峰网
H
Help Net Security
博客园 - Franky
S
SegmentFault 最新的问题
T
The Blog of Author Tim Ferriss
博客园_首页
C
Check Point Blog
腾讯CDC
美团技术团队
Martin Fowler
Martin Fowler
The GitHub Blog
The GitHub Blog
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
U
Unit 42
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Engineering at Meta
Engineering at Meta
M
Microsoft Research Blog - Microsoft Research
阮一峰的网络日志
阮一峰的网络日志
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
B
Blog
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
李成银的技术随笔
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

暗无天日

读:Clojure 世界的 AI 代理调教术——四个改变行为的 Skill TIL: minibuffer 激活时也能操作其他窗口 - 暗无天日 读:Tramp改了配置怎么不生效 - 暗无天日 读:为 project.el 写一个自定义后端 - 暗无天日 读:AI 时代的敏捷开发 - 暗无天日 TIL: 给 dired 异步命令加 nohup,让外部程序活过 Emacs 退出 TIL: elisp-fontify-semantically——让 Emacs 看懂你的 Elisp 代码 TIL-etags扫描外部库头文件 - 暗无天日 读:The Many Faces of flet——Elisp 局部函数的三种写法 读:df 与 du——为什么两个磁盘用量命令数字对不上 - 暗无天日 TIL-可观测性工具的成本盲区 - 暗无天日 TIL: 把 Emacs Buffer 打印成图片 读:gamegrid.el——Emacs 内置游戏是怎么写出来的 - 暗无天日 TIL: MCP 服务器不到 20 行 Python 就能写出来 TIL-AI 工具普及后的组织观察 - 暗无天日 读:当 Agent 开始写数据库——六个防御模式 - 暗无天日 读:右键菜单——Elisp 开发的隐藏利器 - 暗无天日 读:Git 仓库里的隐藏配置文件 - 暗无天日 读:20条软件工程定律 - 暗无天日 读:编译高性能 Emacs - 暗无天日 读:为什么我在终端里待了十年——一个 Emacs 用户的 GUI 观察 读:Event Sourcing——让你的数据库记住每一次变更 - 暗无天日 读:数据管道中Schema变更的四种形状 - 暗无天日 读:SES——Emacs内置的简易电子表格 - 暗无天日 TIL: 用 parallel 加速 rsync 迁移海量小文件 TIL:给 AI 一个更小的世界——技术选型的上下文窗口约束 - 暗无天日 读:emacs chat 技巧拾遗——从 bandali 的配置里捡到的那些技巧 读:当 Agent 成为生产调用者——四个被打破的运维假设 - 暗无天日 TIL: describe-personal-keybindings 查看你的自定义按键 - 暗无天日 读:Linux 创建指定大小文件的三种方式——dd、fallocate 与 truncate - 暗无天日 读:Yazi——在终端里管理文件的新选择 - 暗无天日 读:软件测试的反馈视角——CLEAR 原则从测试到运维 - 暗无天日 MobileOrg Android:从 API 17 迁移到 API 34 的实战记录 TIL:微服务与复杂度守恒——从单体到分布式的代价转移 - 暗无天日 读:MCP 时代的安全威胁——幻觉权限与三道防线 - 暗无天日 读:超越对话——用 Skills 和 Agents 工程化上下文 TIL:用 :box 给 mode-line 加内边距 org-mobile-push 卡顿排查实战:从黑盒到字节码反编译 - 暗无天日 读:用 LLM 重构遗留代码——三个陷阱与一套方法 - 暗无天日 读:AI 辅助编程的三种错误用法 - 暗无天日 读:Before GitHub - 暗无天日 读:AI in Software Architecture - 暗无天日 读:把成本当作 SLI - 暗无天日 TIL: 用进程树展开定位被脚本包装的 JVM 进程 - 暗无天日 读:Linux 删文件的真相——用 /proc 恢复被进程持有的已删除文件 - 暗无天日 读:Choosing a Python Logging Library in 2026 Emacs buffer 导出:五种方案对比 - 暗无天日 TIL: flymake 错误跳转加入 Evil 跳转列表 TIL: 用 Org-mode 列表管理选择题题库 - 暗无天日 读:sysstat 诊断链——从 sar 到 pidstat 的排查路径 读:理论靠谱,生产翻车的六个集成模式 - 暗无天日 读:双写问题——@Transactional 给不了的跨系统一致性 - 暗无天日 读:PostgreSQL 随机测试数据生成——从快速造数到自动化填充 - 暗无天日 读:逆萨丕尔-沃夫假说与编程语言 - 暗无天日 读:理解 MCP 架构——LLM 直接调 API 与 MCP 协议的对比 读:Emacs 连接数据库时密码放哪里 - 暗无天日 TIL:watch 命令的几个遗漏技巧 - 暗无天日 TIL:Python 3.15 的 sentinel() 内置函数 读:7 Techniques That Supercharged My Claude-Assisted Development 读:AI 编码代理的四种工作流 - 暗无天日 读:Agent 的瓶颈不在模型,在基础设施 - 暗无天日 读:EvoForge——用群体进化优化 AI Agent - 暗无天日 TIL:Google Stitch 的 DESIGN.md,给 AI 读的设计系统说明书 Emacs 批量搜索替换:从场景到命令 - 暗无天日 TIL: image-mode 的 header-line 中显示图片尺寸 dotfile仓库大扫除:清理过时的配置 - 暗无天日 读:The Art of Logging——日志规范清单 - 暗无天日 从CSS选择器到自然语言:网页自动化的两种范式与取舍框架 - 暗无天日 TIL-用 curl + w3m + awk 从 HTML 表格提取数据 读:Shell脚本安全编码的五条铁律 - 暗无天日 读:Emacs newcomers-presets theme —— 30+ 项新手预设一览 读:Protesilaos 的 Emacs 合理默认配置 —— 兼与 newcomers-presets 对比 控制 Bash 历史记录的 6 个场景 读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 读:AI Agent 生产化——一份从原型到上线的速查清单 - 暗无天日 读:LLM 生产环境六种失败原型——基准测试无法预测的那些故障 - 暗无天日 读:Prompt Injection 五层纵深防御——从输入过滤到审计追踪 - 暗无天日 读:为什么所有 Prompt Injection 防御都会被攻破——以及架构上该怎么办 - 暗无天日 读:JVM 后端性能调优备忘——从一次生产事故中学到的优化要点 - 暗无天日 读:Java 容器化——从 Fat JAR 到高效 Docker 镜像 读:整洁代码的几个通用原则——从 Go 生态看起 - 暗无天日 读:规则引擎——从 if-else 到业务规则管理 - 暗无天日 AI写作的语言指纹——如何让文字不那么像机器 - 暗无天日 读:50 条 Claude Code 技巧——一个工程经理的六个月使用心得 读:AI 辅助开发为什么让 E2E 测试更有价值 - 暗无天日 读:在Emacs中使用Claude Code(Spacemacs适配版) - 暗无天日 Claude Code 背后的工程哲学——读 Agent Harness Engineering 读:Agent Harness Engineering——AI 智能体不只是模型,还有套件 - 暗无天日 browser-harness:让 AI 直接接管你的浏览器 - 暗无天日 读:Security-First CI/CD —— DevSecOps 自动化实践指南 TIL: 数字小键盘的小数点陷阱与行内算术求值 - 暗无天日 读:Immutability 不是万能药,它是一种权衡 - 暗无天日 Conducty:给 Claude Code 加上项目记忆和并行执行能力 - 暗无天日 读 — GitHub Trending 里的 Claude Code 技能包 读 — Prompt Caching 省钱指南 TIL: Emacs 中那些跟鼠标配合的冷门快捷键 - 暗无天日 读:Anvil——把 Emacs 变成 AI 的工具服务器 读:Emacs 代码折叠终极指南 - 暗无天日 读:Clojure 搭车客指南 - 暗无天日 git推送失败后恢复仓库损坏的完整记录 - 暗无天日
读:Amin Bandali 与 Protesilaos 谈 Emacs 内置功能的深度定制
2026-05-23 · via 暗无天日

最近看了 Amin BandaliProtesilaos(下称 Prot)的一场 Emacs 教练会议录像。两人聊了很多话题:窗口管理、搜索、日程管理。看起来互不相关,但底层都指向同一件事:Emacs 的内置功能本身就有很深的定制空间,只是这些接口藏在文档里,很少有人翻到。

下面从会议中提炼三个案例,每个都配上实际可用的代码。

案例一: display-buffer-alist — 掌控窗口布局

Prot 在会议中说:=display-buffer-alist= 是让 Emacs 有归属感的"唯一最重要的变量"。这个变量控制 Emacs 在什么条件下、把新 buffer 显示在什么位置。

默认行为的问题。 Emacs 默认的窗口管理比较粗暴:按 C-h f 查函数文档,help buffer 直接抢占你当前窗口;运行 =M-x compile=,编译输出也抢占当前窗口。如果你同时开着代码和 shell,查个文档回来窗口布局就乱了。

配置示例:让 help buffer 侧边弹出,不抢占当前窗口。

(add-to-list 'display-buffer-alist
             '("\\*Help\\*"
               (display-buffer-reuse-window display-buffer-pop-to-window)
               (window-width . 0.4)
               (side . right)
               (slot . 0)
               (window-parameters . ((no-delete-other-windows . t)))))

当 buffer 名匹配 \*Help\* 时,Emacs 会优先复用已有的 help 窗口(=display-buffer-reuse-window=);如果没有已有窗口,就在右侧弹出宽度为 40% 的新窗口(=display-buffer-pop-to-window= + side . right + =window-width . 0.4=)。

配置示例:让编译输出显示在底部,不抢占焦点。

(add-to-list 'display-buffer-alist
             '("\\*compilation\\*"
               (display-buffer-reuse-window display-buffer-at-bottom)
               (window-height . 0.25)
               (body-function . (lambda (window) (select-window window nil)))))

display-buffer-at-bottom 把 buffer 放在底部,高度占屏幕 25%。=body-function= 让光标跳到编译窗口,方便直接查看输出。

display-buffer-alist 本质上是一个匹配规则列表:每条规则由 buffer 名的正则表达式和一组 action 函数组成。针对不同类型的 buffer 可以设置不同的显示策略,不需要为每种情况单独写 Elisp 函数。Emacs 内置了十几种 action 函数(=display-buffer-same-window=、=display-buffer-pop-up-frame= 等),日常的窗口布局需求基本都能覆盖。

案例二:isearch — 被低估的内置搜索

会议中 Prot 展示了几个 isearch 的定制技巧。isearch 是 Emacs 内置的增量搜索(按 C-s 触发),比起 consult-line 或者 swiper 名气小一些,但配好了完全够用。

空格当通配符。

默认情况下,isearch 里输入空格就是匹配空格。但如果你把空格配置为匹配"任意字符",搜索 hello world 就能匹配 hello, something world=、=helloxyzworld 等包含中间内容的行:

(setq search-whitespace-regexp ".*?")
(setq isearch-lax-whitespace t)
(setq isearch-regexp-lax-whitespace nil)

这三行配置的含义:

  • search-whitespace-regexp 设置空格匹配的正则表达式, ".*?" 是非贪婪匹配任意字符
  • isearch-lax-whitespace 设为 t ,让普通搜索(非正则模式)中空格被替换为通配符
  • isearch-regexp-lax-whitespace 设为 nil ,正则模式下不替换空格,保留正则的精确控制

显示匹配计数。

isearch 默认不显示"第几个匹配/共几个匹配"。开启 isearch-lazy-count 后,minibuffer 里会显示类似"5/12"的计数:

(setq isearch-lazy-count t)
(setq lazy-count-prefix-format "(%s/%s) ")
(setq lazy-count-suffix-format nil)

什么时候用 isearch,什么时候用 consult-line?

Prot 提到 isearch 在录制键盘宏时特别有用,因为搜索过程是增量的、可回退的。consult-line(配合 vertico 和 orderless)的优势在于候选列表可视化、支持多关键词排序匹配。简单总结:

  • 需要逐个跳转、特别是录制键盘宏时,isearch 更合适
  • 需要一眼看到所有匹配行、用多关键词过滤时,consult-line 更方便
  • 不想装额外包的情况下,配置后的 isearch 已经够用

案例三:Diary vs Org Agenda — 轻量与重量之间

会议中两人讨论了一个选择题:用 Emacs 内置的 Diary 还是 Org Agenda 来管理日程。

Diary 是什么? Diary 是 Emacs 内置的日程管理工具,不依赖任何外部包。它的数据就是一个纯文本文件 =~/diary=,格式简单:

May 23, 2026  团队周会
Monday        每周一的固定检查
%%(diary-float t 1 3)  每月第三个周二的性能报告

Diary 文件可以配合 Emacs 日历(=M-x calendar=)使用,在日历上标记日程。也可以直接用 M-x diary 查看今天的日程。

Org Agenda 的定位。 Org Agenda 是 Org-mode 的一部分,功能比 Diary 丰富得多:TODO 状态流转、优先级、时间戳、重复任务、多文件聚合视图。代价是必须用 Org 文件管理任务,文件结构有要求(至少需要 TODO 关键词和时间戳)。

各自的适用场景。

  Diary Org Agenda
启动成本 零配置,打开就写 需要结构化的 Org 文件
数据格式 纯文本,一行一条 Org 标题 + 属性 + 时间戳
功能范围 日程标记 + 日历显示 TODO 管理 + 日程 + 时间追踪 + 报表
适合人群 只需要简单日程提醒 需要 GTD 或项目管理级的工作流

Prot 在会议中的观点是:Diary 和 Org Agenda 可以并用。用 Diary 记录简单的时间点事件(节假日、固定会议),用 Org Agenda 管理需要追踪进度的任务。两者都能在 Emacs 日历中显示。

小结

这场会议还讨论了其他话题:Amin 展示了他为个人网站开发的自定义 Org HTML 导出后端(继承自内置的 =ox-html=),已有静态站方案的同学可以参考他的思路。

回到核心主题:Emacs 的可扩展性不光体现在"你可以写 Elisp"。很多内置功能本身就暴露了配置接口,从窗口管理(=display-buffer-alist=)到搜索(isearch 变量)到日程(Diary 格式),不装额外包也能深度定制。这些接口一直都在文档里,这场教练会议只是把它们翻了出来。