magit配置咨询

我配置了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-macroexpanduse-package 展开来验证。

加载 Autoload 只是注册个函数名,如果你后续用到这个函数,便会加载相应的文件。

确实是这个问题,如果if里面多语句组合,用prog就可以了吧

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变量啥的修改一些变量值,这是在文件加载前还是加载后起作用啊