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

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
Jina AI
Jina AI
Martin Fowler
Martin Fowler
W
WeLiveSecurity
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Privacy International News Feed
D
DataBreaches.Net
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Scott Helme
Scott Helme
U
Unit 42
Hacker News - Newest:
Hacker News - Newest: "LLM"
Google DeepMind News
Google DeepMind News
酷 壳 – CoolShell
酷 壳 – CoolShell
Vercel News
Vercel News
I
InfoQ
N
Netflix TechBlog - Medium
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
S
Securelist
S
Schneier on Security
T
Troy Hunt's Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cisco Blogs
H
Hacker News: Front Page
Spread Privacy
Spread Privacy
T
Tenable Blog
博客园 - Franky
Apple Machine Learning Research
Apple Machine Learning Research
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园_首页
量子位
AI
AI
L
LINUX DO - 最新话题
J
Java Code Geeks
小众软件
小众软件
爱范儿
爱范儿
月光博客
月光博客
H
Help Net Security
aimingoo的专栏
aimingoo的专栏

暗无天日

读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 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推送失败后恢复仓库损坏的完整记录 - 暗无天日 多智能体系统的两个有效模式——以及对 Claude Code 用户的启示 - 暗无天日 用 Org Babel 写 Literate 博文:扩展执行 + 定制导出 proced:Emacs 内置的进程查看器 - 暗无天日 从 proced 定制中学到的 Elisp 模式 读:让 Emacs proced 在 macOS 上显示 CPU 和内存 异步编程的函数着色税 - 暗无天日 链式调用的代价:JavaScript 和 Clojure 的共同教训 - 暗无天日 hyperfine:命令行基准测试工具 - 暗无天日 管道中的变量去哪了?——子 shell 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日 程序员愿意为 AI 写文档,却不愿为同事写 - 暗无天日 mktemp: Shell 脚本中临时文件的安全陷阱与最佳实践 - 暗无天日 WSL9x —— 在 Windows 9x 里跑 Linux 内核 6.19 用 ox.el 做你想做的事 —— org-export 高级编程指南 读:Hot-wiring the Lisp Machine —— 用纯 Elisp 构建零依赖的 Org 静态站点生成器 Elisp 性能优化的六个实战教训 - 暗无天日 fcitx5 下 Emacs 无法切换输入法的排查 - 暗无天日 ERT 测试交互命令的三种方式 - 暗无天日 SEM Assistant: 当 Elisp 守护进程遇上 LLM 用 dmsg 给 Elisp 加上结构化调试日志 用 org-habit 追踪非每日习惯 - 暗无天日 Clojure X-Men:当编程语言特性变成超能力 - 暗无天日 TIL: 用 diff-hl 在 fringe 中显示 git 变更 读:llm-test —— 用 LLM agent 驱动 Emacs 测试 TIL: AI 时代的橡皮鸭调试 - 暗无天日 fcitx 启动后键盘输入卡顿的排查 - 暗无天日 TIL: 早期网页的图片热区导航 - 暗无天日 读 Seeing the Whole System 用 Emacs 自动生成每周链接推荐 - 暗无天日 读:ASCII control characters in my terminal 读 What to learn - 暗无天日 Lisp 的括号之痛——一个愚人节玩笑揭开的老伤疤 - 暗无天日 一本书该"线性读"还是"并行读" - 暗无天日 读 How to Monetize a Blog:一篇伪装成变现指南的讽刺文 Python Mock 第三方依赖的四种策略 - 暗无天日 Emacs Lisp 热重载实用指南 - 暗无天日 Prot 的 Emacs 配置哲学 - 暗无天日 TIL: 从直播对谈中学到的三个 Emacs 技巧 - 暗无天日 TIL: 自动使用项目虚拟环境的 Python - 暗无天日 TIL: 让 Help buffer 自动获得焦点 一条命令让本地开发用上 HTTPS —— slim 工具介绍 用 fsck 检查和修复 Linux 文件系统 排查Linux进程"卡死"实战:从strace到gdb全流程 - 暗无天日 PostgreSQL 索引:从基础到你可能不知道的高级用法 - 暗无天日 用 .pdbrc 自定义 Python 调试器 ANSI 转义码的标准化现状 - 暗无天日 终端程序的潜规则 - 暗无天日 PARA Org-mode 测试配置 - 暗无天日 AI越强越辣鸡?控制论说这是必然的 - 暗无天日 AI 越强越需要你盯着——反馈循环实操指南 - 暗无天日 你的AI代理正在偷你的密钥——四种你没想到的泄露通道 - 暗无天日 LLM 在 DevOps 中的三种角色 - 暗无天日 写作风格的反建议 - 暗无天日 反驳本质复杂性——Dan Luu 论为什么《没有银弹》错了 - 暗无天日 文件充满了危险——Dan Luu 谈文件系统的可靠性陷阱 - 暗无天日 AI 时代的 PARA 方法:用 Org-mode 和 AI 打造个人知识管理系统 Linux 数据去重学习笔记 - 暗无天日 创建跨平台 ZIP 文件的隐藏陷阱:Extra Field - 暗无天日 X11 Forwarding 排障指南 - 暗无天日 IP欺骗端口扫描:当别人冒充你去扫描别人 - 暗无天日 Linux 输入栈全景解析:从硬件按键到屏幕响应 - 暗无天日 Unix 系统中那些被埋没的配置开关——以 FontConfig 为例 - 暗无天日 在Linux上限制儿童使用电脑 - 暗无天日 GIF不仅仅是一种图片格式——用GIF流做些奇怪的事 - 暗无天日 Leiningen 学习笔记:Clojure 项目构建与管理从入门到实战配置 - 暗无天日 Google SRE Book 读书笔记 - 暗无天日 yes 管道 head 发生了什么 - 暗无天日 为什么 nohup 在 crontab 中不起作用 Bash中的Indirection与Nameref - 暗无天日 Linux PAM 简介 - 暗无天日 从Linux ISO文件启动计算机 - 暗无天日 用 Bash 打造一个Screen Locker 用GitHub Actions自动构建EGO博客 - 暗无天日 blocking I/O 的作用 - 暗无天日 mobileog 手机端同步提示Error:2 No such file 的解决方法 回收 WSL2 VHDX 文件占用空间 使用 org-mode columnview 生成任务列表 - 暗无天日 Emacs 作为 MPD 客户端 - 暗无天日 移动文件路径却不破坏org file link的方法 - 暗无天日 如何合理的导出help link 成HTML - 暗无天日 笑话理解之Biology - 暗无天日
读:SES——Emacs内置的简易电子表格 - 暗无天日
2026-05-14 · via 暗无天日

在用 Emacs 做表格这件事上,大多数人的第一反应是 Org Table——在 org 文件里画表格、按 C-c = 算公式。但有时候你只是想打开一个文件,像 Excel 那样往格子里填数、写公式、看结果,不需要 org 文件那一整套标题、TODO、tags 的体系。这时候 SES(Simple Emacs Spreadsheet) 就派上用场了。

SES 是 Emacs 自带的 major mode,文件名以 .ses 结尾就会自动进入。它的定位如其名:简单,不支持图表,但足够覆盖你日常需要的电子表格操作。

场景一:记账

先从最经典的电子表格"hello world"开始:记账。新建一个 finances.ses 文件。

Emacs 会打开一个空白的电子表格,里面只有一个 A1 单元格。我们先搭好表头。

填表头

把光标移到 A1 单元格内部,按 " (双引号),minibuffer 会出现提示让你输入文本。输入 Income 回车。现在需要第二列,按 TAB 在右边创建一个新单元格 B1,在里面同样按 " 输入 Expenses

Income                   Expenses

填数据

SES 新建后只有 A1 这一个单元格,要填数据得先创建新行。把光标移到表格下方的空白区域,按 C-o 在当前行上方插入一行。连续按三次,创建 3 个空行。

现在在 A2、A3、A4 里输入数字——直接打数字键就会弹提示。在 B 列输入负数的支出。

Income                   Expenses
10.5                     -3
45.32                    -9.87
1                        -0.5

用公式算余额

在 A5 写求和公式。按 ( (左括号),输入:

(apply #'ses+ (ses-range A2 A4))

SES 会帮你自动把单元格坐标(如 A2)转成真实的值。同理在 B5 求和支出。然后在 C5 用公式 (ses+ A5 B5) 算出最终余额。

Income                   Expenses
10.5                     -3
45.32                    -9.87
1                        -0.5
56.82                    -13.37                   43.45

ses+ 是 SES 内置的安全加法函数。有两个好处:(1) 自动跳过空单元格;(2) 空范围返回 0 而不是报错。这一点很重要,后面插入新行的时候你会看到。

插入新行,公式自动调整

假设后来又翻到几张旧账单,要在中间加几行支出。把光标移到数据区最后一行,按 C-o 插入新行,填入新账目。

每次插入,已经算好的总计会立刻自动更新。按回车选中一个公式单元格, ses-range 的范围已经自动扩大到新的数据范围了。这是 SES 跟 Org Table 相比最明显的便利:不用手动调公式范围。

场景二:服务器集群资源巡检

运维工作中经常要盯一批服务器的资源占用:CPU、内存、磁盘余量。这些数据来自监控系统,但如果你想把最近一次巡检的快照拉出来做个快速聚合分析,SES 很顺手。

新建 server-inventory.ses ,先填表头和数据(方法跟场景一一样:"= 输文本,数字键输数值)。"Environment" 比较长,填完后光标移到 B 列任意单元格,按 w 输入一个合适的宽度值(比如 12),列宽就能完整显示了:

Hostname     Environment   OS       CPU%   Memory%   Disk%
web-01       production    ubuntu   23     45        62
web-02       production    ubuntu   35     52        78
db-01        production    centos   12     78        34
web-stg-01   staging       ubuntu   8      30        25
db-stg-01    staging       centos   5      25        18

一个实用小技巧:SES 没有直接的"复制上方单元格"快捷键。相邻行内容一样时(比如 B2、B3、B4 都是 "production"),用公式 "(=B2)"= 来引用上一个格的值可以省点事,但会建立依赖关系。数据量不大的话,直接敲字反而最快。

数据多了以后,手动回答这类问题就很容易出错:每个环境的平均 CPU 是多少?Ubuntu 和 CentOS 机器的资源占用有没有差异?磁盘超过 80% 的有几台?

条件筛选:ses-select

ses-select 是 SES 内置的筛选函数:传入一个测试范围、一个比对值和结果范围,返回所有比对通过的结果。

想知道所有生产环境机器的平均 CPU:

(ses-average
 (ses-select (ses-range B2 B6)
             "production"
             (ses-range D2 D6)))

ses-select 做的事情:逐行比较 B 列(Environment)的值是否等于 "production" ,命中就把对应行 D 列(CPU%)加入结果列表, ses-average 求平均。代入示例数据,生产环境平均 CPU 是 23.33%。

同理,按 OS 筛选也不在话下,把比对列换到 C 列就行。比如想知道 Ubuntu 机器的平均内存:

(ses-average
 (ses-select (ses-range C2 C6)
             "ubuntu"
             (ses-range E2 E6)))

会得到 42.33%。

按环境、按 OS、按任意你填了分类标签的列,一样的套路。

处理空值:! 标志

不是每台机器都能准时回传数据。假设 db-stg-01 的网络刚好断了,Disk% 单元格是空白的。如果你直接用 Emacs 自带的 max 函数去算某个环境的最高磁盘占用:

(apply #'max
 (ses-select (ses-range B2 B6 !)
             "production"
             (ses-range F2 F6 !)))

ses-range 末尾的 ! 标志告诉 SES:跳过空单元格,不把它们送进 max 。没有这个标志,普通 Elisp 函数遇到空值就直接报错退出了。

运行结果:生产环境磁盘占用最高的是 78%( web-02 )。

min 也是同样的用法,把 #'max 换成 #'min 就行。

统计数量

length 统计某类机器有多少台:

(length
 (ses-select (ses-range B2 B6 !)
             "staging"
             (ses-range D2 D6 !)))

示例数据中 staging 环境有 2 台机器。

**非等值筛选:ses-select 做不到的

ses-select 只支持等值比较。如果想统计"磁盘占用超过 80% 的机器有多少台",就超出它的能力了。但你可以在 SES 公式里直接用 Elisp 的标准过滤函数,比如 seq-filter

(length
 (seq-filter (lambda (x) (> x 80))
             (ses-range F2 F6 !)))

ses-range 返回的是普通的 Elisp 列表, seq-filter 对它做一个 lambda 过滤:大于 80 的保留,其他的丢出去。 ! 先排掉空单元格,避免 lambda 拿到 nil 报错。

示例数据中所有磁盘都低于 80%,所以返回 0。同理, cl-remove-ifseq-find 这些函数都可以在 SES 公式里直接用,过滤器可以写任意复杂的条件。关键就是记住: ses-range 吐出来的是标准列表,之后你想怎么处理都行。

通过函数组合就可以直接在电子表格里就能把集群概览跑出来。数据变了公式自动重算,下次巡检拷新数据进来,所有聚合结果实时更新。

SES vs Org Table

讲了 SES 能干什么之后,自然会问:什么时候用 SES,什么时候用 Org Table?

工具 最适合的场景 公式能力 劣势
SES 打开就填、需要交互式电子表格 Elisp 公式、自动重算、单元格引用自动跟踪 .ses 文件,不嵌入文档
Org Table 表格只是文档的一部分,要导出或写报告 TBLFM 公式 + Calc 语法,手动重算 插入行列后引用不自动调整

简单说:你要写文档顺便放个表格 → Org Table。你要像管服务器清单那样频繁增改数据、调公式 → SES。

SES 的局限也不小。内置的空值安全函数不够多——目前只有 ses+ses-average ,其他聚合都得靠 ! 标志配合普通 Elisp 函数。它也不支持图表、条件格式、数据验证这些重型电子表格的功能。但你本来也不会在 Emacs 里做这些事,所以它找准的位置就是:数据量不大、不想离开 Emacs、想要公式自动重算的轻量级场景。

导出与实用技巧

SES 的导出很简单:选中区域,按普通 Emacs 操作复制( M-w ),每列用 tab 分隔。粘贴到别的 buffer 里就是纯文本。把 tab 替换成逗号就是 CSV。

导出为 Org 表格也容易:直接复制粘贴后,用 C-c | 在 org buffer 里做区域转换就行。

速查:SES 常用按键

按键 作用
M-o 在当前列左边插入一列
M-k 删除当前列
C-o 在当前行上方插入一行
C-k 删除当前行
" 输入文本
数字键 输入数值
( 输入 Elisp 表达式
TAB 右边创建新单元格并移动光标
RET 查看/编辑当前单元格的表达式
C-d 清空当前单元格
C-c C-c 手动强制重算当前单元格
C-/ 撤销(支持行列和单元格操作的撤销)
w 设置当前列宽度
h 显示 SES 所有按键绑定
p 设置当前单元格的打印格式(如 %.2f 保留两位小数)
M-w 复制选中区域(tab 分隔)