如何动态添加Emacs中的小部件?

时间:2014-04-30 06:39:10

标签: dynamic emacs widget elisp

我是Emacs / Elisp的初学者。 我想要以下内容:

  • 我想放一个下拉菜单
  • 我想用列表中给出的值填充它(一个字符串作为标签,一个符号作为值)
  • 根据所选列表项我想在同一个缓冲区中生成小部件
  • 应该生成的小部件(当然是动态的)作为符号列表给出,因此特定符号表示应该将特定类型的小部件放在那里
  • 我的缓冲区的动态行为的原因有时也需要删除旧的小部件(为了能够添加新的小部件)

这怎么可能这样做?我正在搜索Emacs文档,但我发现了一些信息碎屑。如果可能,请包含示例代码。

1 个答案:

答案 0 :(得分:2)

恕我直言,您可以找到相当不错的信息here。作为起点,这是我从该手册改编的下拉菜单示例:

(require 'widget)
(require 'wid-edit)

(defun widget-example ()
  "Create the widgets from the Widget manual."
  (interactive)
  (switch-to-buffer "*Example*")
  (kill-all-local-variables)
  (make-local-variable 'widget-example-repeat)
  (let ((inhibit-read-only t))
    (erase-buffer))
  (remove-overlays)
  (widget-create 'menu-choice
                 :value "Funny option"
                 :help-echo "Choose me, please!"
                 :notify (lambda (widget &rest ignore)
                           (message "%s is a good choice!"
                                    (widget-value widget)))
                 '(choice-item "Example option")
                 '(choice-item "Funny option")
                 '(choice-item "Another Example option"))
  (widget-insert "\n")
  (use-local-map widget-keymap)
  (widget-setup))