【问题标题】:Emacs: Performance of keybinding to an anonymous functionEmacs:对匿名函数的键绑定性能
【发布时间】:2023-04-04 09:25:01
【问题描述】:

我的两个选择是

绑定前定义函数

例如:

(defun select-all ()
  (interactive)
  (mark-whole-buffer))

然后绑定它:

(global-set-key (kbd "C-a") 'select-all)

绑定匿名函数

一次性定义和绑定:

(global-set-key (kbd "C-a")
        (lambda ()
          (interactive)
          (mark-whole-buffer)))

我的问题

如果我一次性定义和绑定,对性能有影响吗?

参考文献

emacswiki.org - InteractiveKeybinding 似乎告诉我们这是可以接受的。

【问题讨论】:

  • global-set-key不是 global-key-set。性能上没有区别。如果是为你自己而你不关心C-h k 查找键绑定并跳转到源代码,那么无论哪种方式都可以。如果有一天您希望创建一个其他人将使用的库,那么您肯定需要第一种方法。如果您查看一些流行的库,您会发现没有人使用第二种方法。尝试使用 C-h k 自己查找键绑定,并亲自查看差异。
  • 我认为给函数起一个名字是值得的,这样C-h k 会给你一些有用的东西。如果给出一个键绑定足够重要,那么命名可能也足够重要。
  • 顺便说一句,mark-whole-buffer 已经是交互式的,因此没有理由定义包装函数。你可以(defalias 'select-all 'mark-whole-buffer) 给它一个别名。

标签: emacs lisp elisp


【解决方案1】:

对于绑定的一般使用没有性能影响。对于使用该信息的其他命令(例如 C-h k),性能可能会受到很小的影响,但这也太小了,您甚至不太可能注意到它,并且考虑到您可能不经常使用 C-h k,等式中效率最低的部分是用户。

定义一个函数然后绑定它而不是仅仅做一个 lambda 有两个主要好处

  1. 重复使用。拥有一个命名函数意味着您可以将它与 M-x 一起使用,或者可能在您编写的其他函数或库中使用它。

  2. 文档。这是一个重要的。我经常发现自己正在查看基于 lambda 的键绑定,并且必须通过它才能准确记住它的作用。另一方面,如果它是我绑定的命名函数,那么它可能会更明显。您还可以获得对命名函数的 C-h k 内容和适当的支持。

因此,我倾向于仅在 lambda 类型绑定非常琐碎且显而易见时才使用它,而在所有其他时间使用命名函数。

【讨论】:

  • 另外两个:(1)易于建议。 (2) 易于添加和(尤其是)从挂钩中移除。
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2012-08-03
  • 2019-05-25
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多