是这样的,按照 @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我慢慢体会吧,谢谢了!