emacs - Elisp 在 progn 上使用 apply 函数列表

标签 emacs apply elisp elisp-macro

我是一个新的 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/

相关文章:

emacs - 使用 leiningen 和 swank/slime 在 emacs 中运行 clojure 测试时停止无限循环

emacs - 在 EVIL 中进行增量搜索时使用默认输入法?

python-3.x - 使用 shift() 比较行元素

r - 如何指定在 R 的 mapply 中迭代哪些参数

bash - 如何将 Emacs 缓冲区中的内容通过管道传输到外部程序,并打印结果?

emacs - 在Windows上进行提交时Magit非常慢

vim - 如何在 Emacs 中模拟 Vim 的 'softtabstop'?

r - 多个或多个时间序列绘制单个数据帧的输出

emacs - 如何避免意外杀死emacs中的文本?

emacs - 在 Emacs 中构建和维护数据库?