加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

emacs – 从宏创建自动加载的功能

发布时间:2020-12-13 17:01:07 所属栏目:PHP教程 来源:网络整理
导读:如何从宏功能工厂创建自动加载功能?例如,假设我有一个宏来创建对齐函数,如下所示,但我希望能够指定一个选项,以便扩展的宏具有自动加载cookie. (defmacro align-by (name doc regex) "Alignment function factory." (declare (indent 1)) (let ((fn (intern
如何从宏功能工厂创建自动加载功能?例如,假设我有一个宏来创建对齐函数,如下所示,但我希望能够指定一个选项,以便扩展的宏具有自动加载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,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-*)\$")))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读