gpt4 book ai didi

emacs - 在 Emacs 中评估随机 elisp 函数

转载 作者:行者123 更新时间:2023-12-01 08:40:37 26 4
gpt4 key购买 nike

所以,我一直在玩 this web site that creates random themes for Emacs .我一直在保存生成的 .el 文件并在启动 Emacs 时加载它们。每个颜色主题都可以通过评估以 inspiration- 为前缀的 elisp 表达式来启动。

不幸的是,我不知道 elisp。有人可以帮我弄清楚如何编写一个函数来查看可用的“灵感”前缀函数,并随机评估其中一个函数吗?

最佳答案

我喜欢逐步建立解决这些问题的方法。如果您只是想尝试我的答案,请跳到最后的 defun 代码块。我去 *scratch* 缓冲区,在 lisp-interaction-mode 中尝试这些代码片段。你可以在表达式之后输入 C-j,Emacs 会运行它并将结果插入到缓冲区中。

apropos 函数搜索匹配某些模式的符号,包括正则表达式。所以我们可以像这样找到所有以“inspiration-”开头的符号:

(apropos "^inspiration-\*" t)

但是该结果有一个包含其他信息的每个符号的列表。我们可以丢弃它,只使用 first 函数获取符号名称:

(mapcar #'first (apropos "^inspiration-\*" t))

其中一些不是函数,所以让我们删除任何未通过 functionp 测试的函数:

(let ((symbols (mapcar #'first (apropos "^inspiration-\*" t))))
(remove-if-not #'functionp symbols))

现在让我们随机选择其中之一。我正在从 let 切换到 let* 因为 let* 允许我在相同的初始化中引用早期的定义,例如在定义 functions 时使用 symbols

(let* ((symbols (mapcar #'first (apropos "^inspiration-\*" t)))
(functions (remove-if-not #'functionp symbols))
(number (random (length functions))))
(nth number functions))

现在让我们把它变成一个新的 lisp 函数(我们的名字不要以 inspiration- 开头)。我将它标记为 interactive 以便您可以通过 M-x use-random-inspiration 运行它,此外还可以在其他 elisp 代码中使用它。另一个大的变化是使用 funcall 来实际运行随机选择的函数:

(defun use-random-inspiration ()
(interactive)
(let* ((symbols (mapcar #'first (apropos "^inspiration-\*" t)))
(functions (remove-if-not #'functionp symbols))
(number (random (length functions))))
(funcall (nth number functions))))

所以将它添加到您的 $HOME/.emacs 文件中并尝试一下。

编辑:避免 Apropos 缓冲区弹出窗口

(defun use-random-inspiration ()
(interactive)
(let* ((pop-up-windows nil)
(symbols (mapcar #'first (apropos "^inspiration-\*" t)))
(functions (remove-if-not #'functionp symbols))
(number (random (length functions))))
(funcall (nth number functions)))
(kill-buffer (get-buffer "*Apropos*")))

关于emacs - 在 Emacs 中评估随机 elisp 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3606651/

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