gpt4 book ai didi

emacs - 更改树小部件节点的文本

转载 作者:行者123 更新时间:2023-12-01 11:33:21 24 4
gpt4 key购买 nike

我写了一段代码来创建一个树小部件:

(require 'tree-widget)

(defun my-create-tree-widget ()
(interactive)
(with-current-buffer (get-buffer-create "*my-tree-widget*")
(setq-local my-tree-widget
(widget-create
'tree-widget
:open t
:tag "one"
:args
(list (widget-convert
'tree-widget
:tag "two"
:args (mapcar (apply-partially #'widget-convert 'item)
'("three" "four"))))))
(switch-to-buffer (current-buffer))))

生成的树小部件如下所示,其中 :tag 参数成为节点的标签:
[-] one
`-[+] two

现在我想更改程序中的标签,但是使用 :tag 设置 widget-put 值不会更改缓冲区中的任何内容。我怎样才能做到这一点?

最佳答案

出于某种原因,树小部件节点的标签存储为 :children 属性中的第一个元素,因此您需要检索该值,并更改其 :tag 属性,而不是树小部件本身的 :tag 属性。

更改 :tag 属性后,您需要强制小部件更新。您可以使用 widget-value-set 做到这一点。由于您实际上不想更改该值,只需再次分配相同的值即可;它仍然具有重绘小部件的相同效果。

例如,要更新顶级节点:

(defun my-change-tree-widget-first-level ()
(interactive)
(let ((node (car (widget-get my-tree-widget :children))))
(widget-put node :tag (format-time-string "%T"))
;; Redraw
(widget-value-set node (widget-value node))))

这导致:
[-] 12:39:19
`-[+] two

要更新子节点,只需使用 :children 属性向下挖掘,请记住,第一个“子”元素严格来说并不是子节点:
(defun my-change-tree-widget-second-level ()
(interactive)
(let ((second-level (cadr (widget-get my-tree-widget :children))))
(unless (tree-widget-p second-level)
(error "This is not the tree widget"))
(let ((node (car (widget-get second-level :children))))
(widget-put node :tag (format-time-string "%T"))
;; Redraw
(widget-value-set node (widget-value node)))))

有了这个最终结果:
[-] 12:39:19
`-[+] 12:40:41

关于emacs - 更改树小部件节点的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25104291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com