作者:无内功不5功 | 来源:互联网 | 2023-07-07 15:22
篇首语:本文由编程笔记#小编为大家整理,主要介绍了修复 Emacs 电量信息获取错误相关的知识,希望对你有一定的参考价值。
Emacs 在我的电脑上遇到一个诡异的问题,运行 battery 函数,输出信息为 Battery status not available
,导致状态栏上始终无法显示电量信息。每次看到这个小 bug 总感觉很不爽,于是自己试着修复了一下。记录下修复的思路
0x00 系统配置情况
0x01 battery 的运行机制
C-h f
查看 battery 信息,发现在 battery 的描述如下:
Display battery status information in the echo area.
The text being displayed in the echo area is controlled by the variables battery-echo-area-format and battery-status-function.
C-h v
查看 battery-status-function 变量,发现玄机在 battery-status-function 的 Symbol Property List 中。其中获取信息的关键点在 standard-value,定义如下:
standard-value
((cond
((and
(eq system-type 'gnu/linux)
(file-readable-p "/proc/apm"))
#'battery-linux-proc-apm)
((and
(eq system-type 'gnu/linux)
(file-directory-p "/proc/acpi/battery"))
#'battery-linux-proc-acpi)
((and
(eq system-type 'gnu/linux)
(file-directory-p "/sys/class/power_supply/")
(directory-files "/sys/class/power_supply/" nil battery-linux-sysfs-regexp))
#'battery-linux-sysfs)
......))
可以看到,emacs 尝试从 /proc/apm
、/proc/acpi/battery
目录下读取或 /sys/class/power_supply/
目录下通过 battery-linux-sysfs-regexp 匹配到存储电量信息的目录,然后再进行读取电量信息。很明显,在我的电脑上读取方式为第三种。
下一步,C-h v查看 battery-linux-sysfs-regexp
的值,结果为 [bB][aA][tT][0-9]?$
,这个正则表达式明显是失效的
0x02 解决方案
通过以上的分析,解决方案已经很明显了,需要修改 battery-linux-sysfs-regexp 变量。
那么,问题来了。怎么改,在哪改?
根据目录 /sys/class/power_supply/max170xx_battery/
,确定新正则表达式的值,由于不用考虑兼容性,简单粗暴就好,比如 battery$
具体修改有两种方式:一是简单粗暴,直接M-x customize-group
,然后输入 battery 打开自定义窗口找到对应变量进行修改。二是在配置文件中重定义,将下列代码放到 .emacs 文件中即可
(defcustom battery-linux-sysfs-regexp "battery$"
"custom regexp to read battery status correctly")