读:让 Emacs proced 在 macOS 上显示 CPU 和内存
内容提要
本文讨论了如何在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模式下运行时刷新数据。