You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将列表值添加到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))

关键修改点

  1. 替换item构建方式:将'(item x)改为(list 'item x),list函数会对参数x求值,把cred-types中的每个字符串正确传入item部件。你也可以用更简洁的反引号写法,效果完全一致:
    (mapcar (lambda(x) `(item ,x)) cred-types)
    
  2. 修正初始值:把:value调整为"creds",确保初始选中的值是选项列表中存在的元素,避免单选按钮状态异常。

验证运行

执行M-x widget-example,会打开*Widget Example*缓冲区,显示"creds"和"token"两个单选按钮选项,点击任意选项会在minibuffer显示选中内容,无报错。

内容的提问来源于stack exchange,提问作者nigredo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 16:32:42