如何从宏函数工厂创建自动加载的函数?例如,说我有一个宏来创建对齐函数,如下所示,但是我希望能够指定一个选项,以便扩展后的宏具有自动加载cookie。

(defmacro align-by (name doc regex)
  "Alignment function factory."
  (declare (indent 1))
  (let ((fn (intern name)))
    `(defun ,fn (start end)
       ,doc
       (interactive "r")
       (align-regexp start end ,regex))))

(align-by "align-backslash"
  "Align backslashes at end of line in region."
  "\\(\\s-*\\)\\\\$")


我知道我可以写这个,但是我可以避免为每个函数写这个吗?

;;;###autoload (autoload 'align-backslash "this-file")

最佳答案

目前尚不清楚宏将在何处获取要自动加载的文件的名称-您当前没有将文件名传递给宏。

假设文件名来自宏扩展时正在访问的文件,则将执行以下操作:

(defmacro align-by (name doc regex)
  "Alignment function factory."
  (declare (indent 1))
  (let ((fn (intern name)))
    `(progn
       ,(and (buffer-file-name)
             `(autoload ',name ,(buffer-file-name)))
       (defun ,fn (start end)
         ,doc
         (interactive "r")
         (align-regexp start end ,regex)))))


测试:

(macroexpand '(align-by "align-backslash"
           "Align backslashes at end of line in region."
           "\\(\\s-*\\)\\\\$"))


C-u C-x C-e显示当当前缓冲区不访问文件时给出的信息:

(progn
  (autoload '"align-backslash" nil)
  (defun align-backslash
      (start end)
    "Align backslashes at end of line in region."
    (interactive "r")
    (align-regexp start end "\\(\\s-*\\)\\\\$")))


它在缓冲区访问文件foo.el时给出了此信息,其中".../foo.el"实际上是foo.el的绝对文件名:

(progn
  (autoload '"align-backslash" ".../foo.el")
  (defun align-backslash
      (start end)
    "Align backslashes at end of line in region."
    (interactive "r")
    (align-regexp start end "\\(\\s-*\\)\\\\$")))

关于emacs - 从宏创建自动加载的功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38779350/

10-08 21:43