读:让 Emacs proced 在 macOS 上显示 CPU 和内存

💡 原文中文,约4300字,阅读约需11分钟。
📝

内容提要

本文讨论了如何在macOS上使用Emacs的proced.el显示CPU和内存信息。由于默认情况下proced不显示这些数据,作者提供了解决方案:通过异步运行ps命令获取进程信息,并将结果存入哈希表。接着,利用自定义属性将CPU和内存信息注入proced中,并定期刷新数据。文章还介绍了异步处理和正则表达式的Elisp编程技巧。

🎯

关键要点

  • Emacs内置的proced在macOS上无法显示CPU和内存占用,原因在于系统API未填充相关字段。

  • 解决方案是异步运行ps命令获取进程信息,并将结果存入哈希表,以PID为键。

  • 通过自定义属性将CPU和内存信息注入proced,并使用定时器每2秒刷新数据。

  • 使用make-process异步执行ps命令,确保输出格式不受用户locale影响。

  • 查询函数从哈希表中获取CPU和内存数据,使用cons结构存储以提高访问效率。

  • proced-custom-attributes用于将CPU和内存信息作为新列显示,确保在proced模式下运行时才刷新数据。

  • 在proced buffer关闭时取消定时器,以避免悬空的定时器。

  • 学习到的技巧包括使用lambda列表添加新列、异步执行外部命令的标准方式、周期性执行任务的便利性,以及检测当前buffer是否在TRAMP远程主机上的方法。

延伸问答

如何在macOS上使用Emacs的proced显示CPU和内存信息?

可以通过异步运行ps命令获取进程信息,并将结果存入哈希表,然后利用自定义属性将CPU和内存信息注入proced中,定期刷新数据。

为什么Emacs的proced在macOS上无法显示CPU和内存占用?

因为Emacs的C层通过system_process_attributes函数获取进程属性时,未填充pcpu和pmem字段,导致这些数据为空。

如何使用Elisp编程技巧来处理异步进程?

可以使用make-process函数异步执行ps命令,并通过sentinel处理进程状态变化,确保在进程退出时获取完整输出。

在Emacs中如何定期刷新CPU和内存数据?

可以使用run-with-timer函数设置定时器,每2秒刷新一次哈希表中的数据。

为什么选择使用哈希表而不是列表来存储进程信息?

因为哈希表的查找时间是O(1),即使有几百个进程也能快速访问,而列表的查找时间较长。

如何在proced模式下添加新的CPU和内存列?

通过proced-custom-attributes定义lambda函数,将CPU和内存信息作为新列显示,并在proced模式下运行时刷新数据。

➡️

继续阅读