在Emacs Lisp中正确使用apply?

在Emacs Lisp中正确使用apply?,emacs,elisp,Emacs,Elisp,我不确定这里是否推荐使用apply。是否有更好的/标准的解决方案来动态设置主模式?我找不到别的了 背景: 每当我收到通知 X自动保存数据;考虑MX恢复这个文件< /代码> < /P> 消息在Emacs中,我想知道当前文件和自动保存版本之间的区别是什么。由于大多数时候我都懒得去查,所以我尝试将任务自动化: (defun ediff-auto-save () "Ediff current file and its auto-save pendant." (interactive) (le

我不确定这里是否推荐使用
apply
。是否有更好的/标准的解决方案来动态设置主模式?我找不到别的了

背景:

每当我收到通知

X自动保存数据;考虑MX恢复这个文件< /代码> < /P>
消息在Emacs中,我想知道当前文件和自动保存版本之间的区别是什么。由于大多数时候我都懒得去查,所以我尝试将任务自动化:

(defun ediff-auto-save ()
  "Ediff current file and its auto-save pendant."
  (interactive)
  (let ((auto-file-name (make-auto-save-file-name))
        (file-major-mode major-mode))
    (ediff-files buffer-file-name auto-file-name)
    (switch-to-buffer-other-window (file-name-nondirectory auto-file-name))
    (apply file-major-mode '())
    (other-window 1))) ;; back to ediff panel

代码实现了我想要的,它打开自动保存文件并启动ediff。我还将自动保存文件的主模式设置为原始文件的主模式,以实现一致的字体锁定。

我觉得这很好-这就是apply的用途


此外,你自己也说过:代码做你想要的

虽然apply肯定可以用于此,但funcall可能更适合

(funcall file-major-mode)
它与apply的不同之处在于它不接受参数列表,只接受参数。以下两项是等效的:

(funcall '+ 1 2)
(apply '+ '(1 2))

谢谢,这是一个很好的观点。有了funcall,我不必把那个空列表作为参数添加。看起来更好。这是一个非常方便的elisp块,无论“应用”是否是正确的选择。