修复 Emacs 电量信息获取错误

Posted LazyMonk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修复 Emacs 电量信息获取错误相关的知识,希望对你有一定的参考价值。

Emacs 在我的电脑上遇到一个诡异的问题,运行 battery 函数,输出信息为 Battery status not available,导致状态栏上始终无法显示电量信息。每次看到这个小 bug 总感觉很不爽,于是自己试着修复了一下。记录下修复的思路

0x00 系统配置情况

  • 系统:Ubuntu Meta 19.04

  • 硬件:GPD Pocket 一代

  • 电量信息文件位置:

    /sys/class/power_supply/max170xx_battery/

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")



以上是关于修复 Emacs 电量信息获取错误的主要内容,如果未能解决你的问题,请参考以下文章

YASnippet - emacs 的代码片段管理工具

如何修复“代码应明确检查权限是不是可用”错误

Android获取当前电量信息(BroadcastReceiver的使用)

Android获取当前电量信息(BroadcastReceiver的使用)

如何修复“源文件比字节编译文件更新”错误?

APIWindows 获取电池电量信息