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