ELisp中无读取语法对象的内部信息查看方法咨询
查看ELisp特殊对象(如Window)的内部属性
在ELisp中,像Window这类特殊对象没有专属的读取语法,打印出来只会是类似#<window 3 on test.el>的哈希表风格字符串,但你没法像操作普通哈希表那样去检查它的内部结构:
(print (selected-window)) ;; 输出结果:#<window 3 on test.el>
要是硬用哈希表相关函数去操作,还会触发类型错误:
(require 'subr-x) (hash-table-keys (selected-window)) ;; 报错信息:hash-table-keys: Wrong type argument: hash-table-p, #<window 3 on test.el>
在调试(比如用edebug追踪代码)的时候,要是能导出这类对象的所有内部字段、配置和属性,对梳理程序逻辑会有很大帮助。下面分享几种实用的实现方法:
1. 用内置专用函数直接获取属性
绝大多数特殊对象都有配套的内置函数来读取它们的属性,这是最直接的方式:
- 针对Window对象,常用的函数包括:
window-edges:获取窗口的边界坐标window-buffer:获取窗口关联的缓冲区window-start:获取窗口显示内容的起始位置window-height/window-width:获取窗口的尺寸window-parameters:获取窗口的自定义参数列表
示例代码:
;; 一次性获取当前窗口的核心属性 (list :edges (window-edges (selected-window)) :buffer (buffer-name (window-buffer (selected-window))) :start-position (window-start (selected-window)) :height (window-height (selected-window)) :params (window-parameters (selected-window))) - 对于Frame对象,
frame-parameters可以直接返回所有参数的键值对列表:(frame-parameters (selected-frame))
2. 借助object-print包实现通用对象检查
如果需要一个能查看任意ELisp对象内部细节的通用工具,可以安装MELPA上的object-print包。它提供的object-print函数能递归解析并打印对象的内部结构,包括这类无读取语法的特殊对象:
(require 'object-print) (object-print (selected-window))
执行后会输出窗口的所有内部字段,比如窗口ID、关联缓冲区指针、显示配置等细节,非常适合深度调试。
3. 手动枚举相关操作函数
如果遇到没有专用检查函数的特殊对象,可以用apropos命令查找相关操作函数:
;; 查找所有和window相关的可调用函数 (apropos "window-" #'functionp)
这样会列出所有以window-开头的函数,从中筛选出能读取属性的接口。另外,也可以查阅Emacs自带的ELisp手册中对应对象的章节,里面会完整列出所有可用的操作函数。
4. 在edebug中实时检查属性
在edebug调试过程中,你可以使用e(eval)命令,在当前调试环境中执行上述检查函数,实时查看对象属性。比如在断点处输入(window-parameters (selected-window)),就能直接看到当前窗口的参数列表,无需退出调试环境。
内容的提问来源于stack exchange,提问作者grewil
相关产品推荐
相关产品推荐

