我配置了magit
(use-package magit)
(defvar cycle-style t
"magit blame cycle style")
(defun lemon-magit-blame()
(interactive)
(magit-blame-echo)
(if (equal cycle-style t)
((magit-blame-cycle-style)
(setq cycle-style nil))))
执行lemon-magit-blame报错helm-M-x: Invalid function: (magit-blame-cycle-style),magit-blame-cycle-style在elpa/magit目录下是可以找到的,其实有一点我也想问,use-package中的:config配置会在包加载后执行,请问加载主要干啥,把所有变量和函数都读取一遍吗,还是只读取autoload标识的函数,没太明白emacs加载机制,求解答
1 个赞
别的不管,你的函数似乎有语法错误?括号多了一层。
(if (equal cycle-style t)
((magit-blame-cycle-style)
(setq cycle-style nil)))
这里这么着才对吧……
(when cycle-style
(magit-blame-cycle-style)
(setq cycle-style nil))
这里括号有问题,多了一层
报错的是 (magit-blame-cycle-style)
,不是 magit-blame-cycle-style
,类似错误 ((+ 1 2))
跟 with-eval-after
作用相同,用 M-x emacs-lisp-macroexpand
把 use-package
展开来验证。
加载 Autoload 只是注册个函数名,如果你后续用到这个函数,便会加载相应的文件。
确实是这个问题,如果if里面多语句组合,用prog就可以了吧
cireu
5
if的then子句如果是多个语句必须用progn包裹
有时会看到为了不写progn把·判断条件加not反转的
require
会完全加载,autoload
或者把有;;; autoload
标记的代码加到load-path
里(是加进来的时候吗?我不确定)会表示这个函数存在,然后在执行这个函数的时候加载相应的文件。
The autoload facility lets you register the existence of a function or macro, but put off loading the file that defines it. (manual)
use-package么稍微用一用看一点文档就明白了,:init
是无论如何都会被执行的代码,:config
是在load之后,【:bind
】 / 【:init
里面general-define-key
】 可以帮助你setup autoloads,有时候这一步不一定必要因为package作者写了;;; autoload
,如果没有,就需要写:bind
等自己来setup autoloads。
ps我目前的elisp水平可以随便写点代码,但是看macro展开结果仍然是一头雾水……
另外我作为一个经常犯傻的人…… 稍微提点醒:
写代码之间看看你要用到的函数/变量/macro/关键字的docstring……别闷头写……
我是看着展开结果还好,一看到macro的源码就彻底蒙圈了——***怎么展开成这样的……
config中的setq变量啥的修改一些变量值,这是在文件加载前还是加载后起作用啊