刚学习use-package,加载smartparens出了点问题……

是这样的,按照 @guanghui.qu文章,smartparens插件有一个函数sp-local-pair,可以通过它来修改成对补全,比如写lisp的时候不希望成对补全" ’ "和“ ` ”,而Emacs好心地补全了,那么可以通过这个函数修改为不进行补全。代码如下,的确是有效的:

(sp-local-pair 'emacs-lisp-mode "'" nil :actions nil)
(sp-local-pair 'lisp-interaction-mode "'" nil :actions nil)

而我刚学了use-package,试图把有关smartparens的代码都放进(use-package smartparens …)里面。

于是我的代码是这样写的:

(use-package smartparens
  :ensure t
  :pin melpa-stable
  :custom (smartparens-global-mode t)
  :config ((sp-local-pair 'emacs-lisp-mode "'" nil :actions nil)
		   (sp-local-pair 'lisp-interaction-mode "'" nil :actions nil)))
;; (sp-local-pair 'emacs-lisp-mode "'" nil :actions nil)
;; (sp-local-pair 'lisp-interaction-mode "'" nil :actions nil)

这会出现错误:Error (use-package): smartparens/:config: Invalid function: (sp-local-pair (quote emacs-lisp-mode) “’” nil :actions nil)

我不太明白,为什么会是Invalid function.

而当我把这两句代码也放到:custom而不是:config的时候,它确实不报错了,可是它并没有起到它应有的作用,quote依旧是成对出现的。

当然,如果把这两句从use-package中拿出来单独放在配置文件里,它们的确是有效的。

我反复摸索、折腾,始终没有找到正确的做法。我猜测可能是因为我没搞懂:custom和:config到底是干什么的,或者说我完全没搞明白use-package。或许这两句代码应该放进一个别的什么区域里。关于:custom和:config,我没太看懂GitHub上的英文描述,如果有哪位高手在解决我的问题的同时能顺便解释一下它们的含义,那就更好了,先行谢过

(use-package smartparens
:ensure t
:pin melpa-stable
:init (smartparens-global-mode t)
:config 
(sp-local-pair 'emacs-lisp-mode "'" nil :actions nil)
(sp-local-pair 'lisp-interaction-mode "'" nil :actions nil))

试试

1 个赞

或者

(use-package smartparens
  :ensure t
  :pin melpa-stable
  :custom (smartparens-global-mode t)
  :config (progn
                   (sp-local-pair 'emacs-lisp-mode "'" nil :actions nil)
		   (sp-local-pair 'lisp-interaction-mode "'" nil :actions nil)))

我习惯这样写,因为use-package

((sp-local-pair 'emacs-lisp-mode "'" nil :actions nil)
		   (sp-local-pair 'lisp-interaction-mode "'" nil :actions nil)))

解析成一个函数了,然而并没有这样的函数.

2 个赞

啊……是的你是对的,谢谢!但是我还想问一下,:init, :config, :custom之间的区别。为什么可以把那句话放在init里呢,假如smartparens没有被成功加载,那么这句话不会出问题么?

原来它不是一个函数是么……?

可是我用C-h f寻找sp-local-pair,得到的描述是“sp-local-pair is a compiled Lisp function in ‘smartparens.el’.”。这是怎么回事呢?

sp-local-pait是一个函数,但是这一串语句

((sp-local-pair 'emacs-lisp-mode "'" nil :actions nil)
		   (sp-local-pair 'lisp-interaction-mode "'" nil :actions nil)))

不是一个函数,而是两个函数,use-package 将其解析成一个函数了,你把他们写在一起了@lemon0910 的解决方法告诉use-package这是两个语句/函数,而我的解决方法是用 progn把两个函数当作一个语句。

2 个赞

哦。明白了,谢谢!

init是在包加载前执行的语句,config是在包加载后执行的,init中也可以执行一些autoload的函数,一般用这两个,custom我理解的是文件中那些defcustom定义的可定制变量

2 个赞

inti和config大致明白了,custom我慢慢体会吧,谢谢了!