我是一个新的 emacs 用户。并尝试编写一些 Elisp 来更好地学习这个软件。虽然我遇到了一些问题。
我想在 progn
上使用 apply
来按顺序运行函数列表。但我得到如下错误。我只是很困惑,需要一些帮助来告诉我如何在 Elisp 中实现这一点,谢谢。
(progn
(+ 1 1)
(+ 2 2)
)
;; => 4
(apply #'progn ((+ 1 1) (+ 2 2)))
;; => Invalid function: (+ 1 1)
(apply #'progn ('(+ 1 1) '(+ 2 2)))
;; => Invalid function: '(+ 1 1)
(apply #'progn '((+ 1 1) (+ 2 2)))
;; => Invalid function: #<subr progn>
我玩上面的玩具因为我从 vim 来到 emacs。所以我安装了evil和evil number。并想要取回 vim 编号 inc 和 dec 绑定(bind) C-a,C-x。所以我写了一个宏来避免样板。
(defmacro set-evil-number-keymap (key-set func &rest modes)
`(apply 'progn
,(-map
(lambda (mode)
`(define-key ,(intern (concat "evil-" mode "-state-map")) (kbd ,key-set)
',(intern
(concat "evil-numbers/" func))))
,modes)))
(set-evil-number-keymap "C-a" "inc-at-pt" "normal" "insert")
(set-evil-number-keymap "C-x" "dec-at-pt" "normal" "insert")
我的期望如下。虽然它只是不运行。
(progn
(define-key evil-normal-state-map (kbd "C-a") ’evil-numbers/inc-at-pt) (define-key evil-visual-state-map (kbd "C-a") ’evil-numbers/inc-at-pt))
(progn
(define-key evil-normal-state-map (kbd "C-x") ’evil-numbers/dec-at-pt) (define-key evil-visual-state-map (kbd "C-x") ’evil-numbers/dec-at-pt))
最佳答案
您不能对像 progn
这样的“特殊形式”调用 apply
(请参阅 info (elisp)Special Forms),它们具有独特的评估规则。
progn
本身已经提供了一种顺序计算机制,因此您的初始尝试确实可以达到您想要的效果。然而,在顶层,表单将按顺序执行,因此那里不需要 progn
。
关于emacs - Elisp 在 progn 上使用 apply 函数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59115293/