输入法换回 Rime 了,这次是为了 vim 模式。我真的太喜欢折腾这些东西了。coding 没 co 多少,工具是一套一套的。
Tag: 编程
Dkphhh's MurmurCreated@ Sun Mar 29 2026 19:16:20 GMT+0800 (China Standard Time)
Dkphhh's MurmurCreated@ Sun Mar 22 2026 17:34:28 GMT+0800 (China Standard Time)
在 vim 这种模态编辑器里输入中文体验太差了:
- 中文不依赖空格区分,所有依赖空格分割字符的定位操作都很难用。
- 输入指令需要切到英文输入法,否则不能识别。
在计算机世界里,能直接用键盘打出来的拉丁字母语言是一等公民,非拉丁语语言是二等公民,阿拉伯语、希伯来语这种 RTL 语言就是三等公民。
我应该庆幸现代中文没有保留竖排习惯。要是中文保持竖排,中国的互联网产业得倒退 20 年。
Dkphhh's MurmurCreated@ Sun Mar 22 2026 15:06:42 GMT+0800 (China Standard Time)
Python 都能有 ty 这样的 lsp 了,uv 已经 make python great again and again 了,Evan You 能不能搞快点!
Dkphhh's MurmurCreated@ Mon Jan 26 2026 13:05:42 GMT+0800 (China Standard Time)
Without writing, you are reduced to a finite automaton. With writing you have the extraordinary power of a Turing machine.
—— Manuel Blum, a Turing Award winner
这句话延展一下,就是:不创造,你就是有限状态机。只有创造,才能让你拥有图灵机的神力。
第三个网站 Read PDF Aloud 上线了
第三个网站 Read PDF Aloud 上线了。

12 月 14 日开工,1 月 1 日凌晨上线第一版,到今天把已知的 bug 和不完善的地方全部修改完,一共花了大半个月的时间,是我工期最长的一个站。
Read PDF Aloud 核心的功能和交互相比之前的网站都要复杂,所以踩了不少坑,都是经验不足导致的。
程序设计上,这次核心的交互逻辑是用面向对象的方式完成。
svelte 的状态管理方式天然适配面向对象范式,官网文档上也专门就 runes 在 class 内的使用做了介绍。这次真正使用面向对象,我也感受到了面向对象的优势,心智负担低,越写越顺手。
但这一切建立在对象设计合理的基础上。如果一开始规划有问题,后面少不了返工。我这次就经历了推到重来的过程。
第二个坑是 CloudFlare Workers。这次的涉及到 PDF 的文字提取和 TTS Api 的调用,所以需要一些简单的后端功能。我最初为 PDF 解析和 TTS Api 调用编写了相应的后端接口,都非常简单。
但是,在我第一次部署到 Worker 后,我就遇到了后端报错。一开始我还以为是我部署方式不对,后来我又怀疑是不是我用的库不适配 Worker 环境。
看完 Worker 的后台日志以后,我才发现,错误原因是 Error 1102: Worker exceeded resource limits。
简单来说,就是 Worker 对单次请求消耗的 cpu 时间有限制。免费版是 10ms,付费版是 30s。一些计算量比较大的任务,难免会占用更多 cpu 时间。当时我心都凉了,一度考虑要不要租个服务器。我还上网查了一下,发现踩到这个坑的,不止我一个。
后来理智说服了我,在没有赚钱的情况下,不能乱花钱。那就只能让用户体谅一下我的难处了,把 PDF 解析放在了用户的浏览器里。
剩下的坑就是一些交互设计上的问题了。
我一直觉得写 ui 最浪费时间,因为很容易陷入细节调试的地狱,我就看这个设计不顺眼,但是又不知道怎么改好,想太久,时间就白白浪费了。
之前做的网站交互都比较简单,这个问题不明显。这次的交互方式更复杂,尤其是阅读器的界面,我边想边写边改,来来回回拉扯了两天。昨天上线,发现交互有问题,又改了一天。现在这版算是没有大毛病了。
编程好难啊。
Dkphhh's MurmurCreated@ Sun Dec 21 2025 13:38:06 GMT+0800 (China Standard Time)
Ai 让我编程的乐趣消失了,至少消失了一部分。
编程的乐趣和打游戏一样,是绞尽脑汁、反复尝试,直到找到解法的那一刻完成压力的释放。
Ai 现在就和游戏里的「金手指」一样。在绝大多数情况下,脑汁不会被「绞尽」,把思路告诉 Ai,它能直接平推过去,大差不差。没有压力,就不存在压力释放时的多巴胺分泌,整个体验变得索然无味。
Chrome 浏览器插件「保存到飞书」
更新于:2026 年 5 月 30 日
保存到飞书是一款 Chrome 浏览器插件,可以将当前网页内容一键保存到飞书云文档中,完全免费开源,你可以在 GitHub 上找到它的源码。
它可以:
- 像大部分剪藏插件一样,将网页内容完整的保存到飞书文档中。因为插件读取的是浏览器渲染完成的内容,所以即使是付费墙后的内容,也能被完整保存下来(只要你能穿过付费墙)。
- 在完成前述操作的同时,将网页文章的 MetaData,也就是标题、作者、发布时间等信息,保存到飞书电子表格或多维表格中。
- 现在还能
它不能:
- 部分网站的图片无法保存到飞书文档中。
- 部分网站的内容发布时间无法自动读取,需要手动补充。
- 保存网页内容时,不能在根目录新建飞书文档,只能在某个文件夹下创建文档。因为目前的授权方式是使用应用身份权限,换句话说,文档实际上是保存在应用的空间里,而不是用户个人空间里。如果保存到根目录,就相当于保存在了应用的根目录,用户就找不到保存的文档了。
如果你想使用这款插件,可以点击下面的链接,前往 Chrome 插件商店下载:
如果你觉得好用,请 👇 🥹 👇

如何使用?
创建飞书应用并设置凭证
- 点击前述链接,前往 Chrome 插件商店,安装「保存到飞书」插件。
- 点击插件设置按钮,进入设置页面,把里面需要你填的信息都填上。不知道怎么填?没关系,接着往下看。

- 上述信息是飞书开放平台的自建应用凭证信息,你需要先在飞书开放平台创建一个应用,才能获取这些信息。具体步骤如下:
- 访问飞书开放平台:https://open.feishu.cn/app
- 点击「创建企业自建应用」按钮。

- 填写应用的基本信息,点击「创建」按钮。

- 创建成功后,会进入「添加应用能力」的页面,暂时不管这个,点左侧导航栏的「凭证与基础信息」,这里的「App ID」和「App Secret」,就是设置页面中需要填写的内容,一一对应填上就好了。

- 点击「版本管理与发布」按钮,把需要填的东西都填上,点击最下面的「保存」按钮。然后一路点确定,到成功发布为止。

- 回到插件的设置页面,填写最后一项基础链接。基础链接就是你飞书文档首页的链接,比如
https://ai.feishu.cn/,或者https://xxxxxx.feishu.cn/。你可以直接把飞书文档首页的链接复制过来,保存的时候插件会自动删除多余的部分。
- 先点击「保存并测试」按钮,设置好凭证后,再点击「开通权限」按钮后,会自动打开一个网页,勾选列出的所有权限,点击「确认开通权限」即可。

创建和修改配置。
- 给应用相应文件夹、电子表格或多维表格的访问权限。关于这个操作,飞书官方文档有更详尽的说明。
- 给应用文件夹编辑权限:
- 在应用管理界面,点击左侧导航栏的「添加应用能力」,点击「机器人」选项卡下的「添加」按钮。

- 点击上方提示的「创建版本」按钮,把必须填的信息都填完,点击最下方的保存按钮,然后一路点确定,到成功发布为止。

- 进入飞书的聊天界面,创建一个新的群组,将应用添加为群机器人。

- 回到文件夹页面,点击「分享」按钮,将刚刚创建好的群聊添加为协作者,给予「编辑」权限即可。

- 在应用管理界面,点击左侧导航栏的「添加应用能力」,点击「机器人」选项卡下的「添加」按钮。
- 给应用电子表格或多维表格的编辑权限:
- 打开对应的电子表格或多维表格,如下图所示,点击「添加文档应用」,给应用「可编辑」权限。

- 如果多维表格开启了高级权限,你需为应用添加多维表格的「可管理」权限,否则仍无法操作多维表格。
- 打开对应的电子表格或多维表格,如下图所示,点击「添加文档应用」,给应用「可编辑」权限。
- 给应用文件夹编辑权限:
- 回到插件设置页面,点击「配置列表」,在这里可以创建或修改配置。

- 新建配置页面,每个选项都有详尽说明,按照说明填写即可,只要将权限问题解决,就能规避大部分错误。如果还有问题,可以给我发邮件。
你可能还想知道
Q: 插件是否会保存用户数据?
A:不会。插件所有的操作都是在用户本地浏览器中完成的,你的数据只会保存在浏览器里,卸载掉插件就会全部清空。插件不会将任何用户数据上传到第三方服务器,因为我没钱租服务器。
Q:为什么要手动填写这么多凭证信息,还要手动开通权限?
A:飞书有自动获取凭证和授权的方式,但是根据我对飞书开发文档相关章节段落的理解,我可能需要租一台服务器,再买个域名。我不想花钱,所以只能让用户手动填写这些信息。如果你有更好的做法,可以给我发邮件。
Q:个人版飞书可以使用吗?
A:可以。
Q:为什么我保存的内容中没有图片?
A:前面说了,部分网站的图片无法保存到飞书文档中。我不清楚是什么原因,但我猜应该是网站本身的限制。如果你有办法解决这个问题,可以给我发邮件。
Q: 有这么多已知缺陷为什么不改?
A:我不知道怎么改。你会你就教教我 🙇
Q:插件是否支持其他浏览器?
A:目前只支持 Chrome 浏览器 (以及所有基于 Chromium 的浏览器)。暂时没有计划支持其他浏览器。
Q:未来的更新计划?
A: who knows? 🤷
隐私政策 / Privacy Policy
简介 / Introduction
“保存到飞书”(以下简称“本扩展”)是一款旨在帮助用户将网页内容保存到飞书(Lark)文档或表格的浏览器扩展程序。我们非常重视您的隐私,并致力于保护您的个人数据。本隐私政策旨在说明我们收集哪些信息、如何使用这些信息以及如何保护这些信息。
"Save to Feishu" (hereinafter referred to as "the Extension") is a browser extension developed to help users save web content to Feishu (Lark) documents or tables. We value your privacy and are committed to protecting your personal data. This Privacy Policy explains what information we collect, how we use it, and how we protect it.
数据收集与使用 / Data Collection and Usage
网页内容 / Web Page Content
我们收集什么: 当您点击扩展图标或触发保存操作时,本扩展会访问当前活动标签页的标题、URL、HTML 内容以及元数据(如作者、发布时间)。
我们如何使用: 这些信息仅在您的浏览器本地进行处理,用于提取文章正文,随后直接发送至飞书(Lark)API,以便保存到您指定的文档或表格中。
存储: 我们不会在我们的服务器上存储您的浏览记录或网页内容。数据仅经过短暂处理后即发送至飞书。
What we collect: When you click the extension icon or trigger a save action, the Extension accesses the title, URL, HTML content, and metadata (such as author, publish date) of the currently active tab.
How we use it: This information is processed locally in your browser to extract the main article content and is then sent directly to the Feishu (Lark) API to be saved into the document or table you specified.
Storage: We do not store your browsing history or web content on our servers. The data is transiently processed and sent to Feishu.
认证信息 / Authentication Information
我们收集什么: 为了与飞书进行交互,您需要提供飞书应用的 App ID 和 App Secret。
我们如何使用: 这些凭证仅用于从飞书认证服务器获取访问令牌(Access Token),从而允许本扩展向您的飞书账号写入数据。
存储: 这些凭证和生成的访问令牌均使用
chrome.storage.local存储在您的浏览器本地。除飞书官方 API 接口外,它们绝不会被发送至任何第三方服务器。What we collect: To interact with Feishu, you are required to provide Feishu App ID and App Secret.
How we use it: These credentials are used solely to obtain access tokens from Feishu's authentication servers, allowing the Extension to write data to your Feishu account.
Storage: These credentials and the generated access tokens are stored locally in your browser using
chrome.storage.local. They are never sent to any third-party servers other than Feishu's official API endpoints.
用户配置 / User Configurations
我们收集什么: 我们会存储您的偏好设置,例如您创建的“保存目标”(飞书文档或多维表格配置)列表。
存储: 这些数据均存储在您的浏览器本地。
What we collect: We store your preferences, such as the list of "Save Targets" (Feishu Docs or Bitables configurations) you created.
Storage: This data is stored locally in your browser.
第三方服务 / Third-Party Services
本扩展直接与 飞书(Lark)开放平台 进行交互。使用本扩展即表示您同意飞书关于其平台数据存储的隐私政策。我们不会将您的数据发送给任何其他第三方分析或追踪服务。
The Extension interacts directly with Feishu (Lark) Open Platform. By using this Extension, you are also subject to Feishu's Privacy Policy regarding the data stored on their platform. We do not send your data to any other third-party analytics or tracking services.
数据安全 / Data Security
所有敏感数据(如令牌和凭证)均存储在您的本地设备上。与飞书 API 的通信全程采用 HTTPS 加密传输。
All sensitive data (such as tokens and credentials) is stored locally on your device. Communication with Feishu API is encrypted via HTTPS.
政策变更 / Changes to This Policy
我们可能会不时更新本隐私政策。任何更改都将在此页面上发布。
We may update this Privacy Policy from time to time. Any changes will be posted on this page.
联系我们 / Contact Us
如果您对本隐私政策有任何疑问,请通过电子邮件 dkphhh@foxmail.com 联系开发者。
If you have any questions about this Privacy Policy, please contact the developer via the email dkphhh@foxmail.com.
Dkphhh's MurmurCreated@ Fri Nov 28 2025 14:04:41 GMT+0800 (China Standard Time)
人类总是喜欢在显而易见的事情上追求完美。
我每次写 UI 的时候,都十分折磨,因为我总觉得不好看。写一点,改一点,再写,再改。一天下来什么进展都没有,一直在原地打转。
但我写后端代码时基本没遇见过这样的问题。
所谓金玉其外,败絮其中,就是这么来的。
Dkphhh's MurmurCreated@ Thu Oct 30 2025 19:32:40 GMT+0800 (China Standard Time)
用来用去还是 VS Code 好用……
在写前端项目的时候,Zed 的内存开销相比 VS Code 没有太大优势,但是 VS Code 的插件比 Zed 更好用,即便是同款插件,VS Code 版本的似乎也更智能一点。譬如 Svelte 的组件导入,VS Code 版本的 Svelte LSP 插件的补全提示很快能显示出来,而 Zed 版本几乎只能靠 AI 的 inline hint,插件好像就不会显示组件的补全。
另外 VS Code 的动画会更顺滑一点,不知道是动画还是字体效果的缘故。
Dkphhh's MurmurCreated@ Sat Oct 25 2025 15:00:27 GMT+0800 (China Standard Time)
因为 vitest 只能用 node 运行,所以 不得不吧 easy-office-2 的里所有直接调用 Bun Api 的代码全部改成兼容 Node Api 的形式。
质疑 node,理解 node,使用 node,但是我依然讨厌 node。