如何将列表值添加到Emacs的radio-button-choice部件中?
问题解决:Emacs Widget单选按钮创建报错
错误原因
你代码里的(mapcar (lambda(x) '(item x)) cred-types)存在核心问题:'(item x)是字面量引用列表,其中的x不会被求值为循环变量的实际值,而是作为一个未定义的符号存在。这导致mapcar生成的每个元素都是(item x),Emacs Widget系统无法识别这种无效结构,从而抛出symbolp类型错误。
另外,你设置的初始值:value "One"不在cred-types列表中,这会导致单选按钮初始状态异常,建议一并修正。
修正后的代码
(require 'widget) (defconst cred-types (list "creds" "token")) (eval-when-compile (require 'wid-edit)) (defvar widget-example-repeat) (defun widget-example () "Create the widgets from the Widget manual." (interactive) (switch-to-buffer "*Widget Example*") (kill-all-local-variables) (make-local-variable 'widget-example-repeat) (let ((inhibit-read-only t)) (erase-buffer)) (remove-overlays) (widget-create 'radio-button-choice :value "creds" ; 修改为cred-types中存在的有效值 :notify (lambda (widget &rest ignore) (message "You selected %s" (widget-value widget))) (mapcar (lambda(x) (list 'item x)) cred-types)) ; 动态构建item结构 (use-local-map widget-keymap) (widget-setup))
关键修改点
- 替换item构建方式:将
'(item x)改为(list 'item x),list函数会对参数x求值,把cred-types中的每个字符串正确传入item部件。你也可以用更简洁的反引号写法,效果完全一致:(mapcar (lambda(x) `(item ,x)) cred-types) - 修正初始值:把
:value调整为"creds",确保初始选中的值是选项列表中存在的元素,避免单选按钮状态异常。
验证运行
执行M-x widget-example,会打开*Widget Example*缓冲区,显示"creds"和"token"两个单选按钮选项,点击任意选项会在minibuffer显示选中内容,无报错。
内容的提问来源于stack exchange,提问作者nigredo
相关产品推荐
相关产品推荐

