怎么把自己的snippets加载到yasnippets

最近弄了一个微信小程序的layer(wxml -> web-mode,wxss -> css,js -> tern)

然后在layer文件夹中放置了一个snippets文件夹(存放小程序各种片段,wxml和js)

但是不知道怎么加载到yasnippet

求解

写了一手臭的


(defun wxapp/post-init-yasnippet()
  (progn
    (setq yas-snippet-dirs (append '("~/.spacemacs.d/layers/wxapp/snippets") yas-snippet-dirs))
    ))

不知道有没有更优雅的方法,求各位前辈

你这样定义我觉得挺不优雅的,yasnippet 自带了新建自定义snippet的功能,你使用这个函数自定义snippet,它会帮你自动加载的,这个函数是 yas-new-snippet,要不你看看这个?

老哥我知道确实不优雅,但是会自动加载

我想让他能在load这个layer的时候,就能顺便把snippet加载进去,平时如果不做小程序的话我就要把layer关掉的

关于新建自定义,我函数确实是用这个新建的,不过保存的时候保存到wxapp这个layer下面,刚新建的时候确实没问题直接加载,但是重启之后就不加载了。写了这个方法之后才可以加载。

snippet 放着统一的文件夹。不会影响性能。

我的是可以在加载相应的major-mode 的时候可以把对应的snippet都加载进去的,我自己试过是没问题的.但是我使用的不是 Spacemacs,也没有layer这一说法.下面是我的配置,我yas-new-snippet新建之后,加载对应的major-mode 就能自动加载了

(use-package yasnippet
  :ensure t
  :diminish (yas-minor-mode . "γ")
  :commands (yas-expand-snippet yas-insert-snippet yas-new-snippet)
  :init (add-hook 'prog-mode-hook #'yas-minor-mode)
  :config (progn
	    (add-to-list 'yas-snippet-dirs "~/.emacs.d/snippets")
	    ))

你确定你有在加载layer的时候已经加载了yasnippet了么?

我已经能正常且正确加载了。单纯觉得这么写可能不是最优解而已。

我这个写法是想把这个snippets文件夹加入到列表中一起加载。确实达到了目的

我要有相对应的任务我才会把这个layer打开,因为这个东西的snippet比较多。我不想在我平时不用接触到这个东西的开发过程中,一堆我不喜欢的snippet脏了我的眼睛。

所以我才想把这部分snippets通过layer加载,并不希望这些平时也能用。平时能用的自己写的那些,没有这个问题。

layer是如果没人init过,你就init,spacemacs init过了,自己再init会覆盖(这点不完全确定),post-init会在原来的init之后执行。

我刚刚尝试了一下

不写(progn ...)的话,代码不会生效

按照我这么写的话,就能正常工作

写成这样试试,或者把lambda换成一个函数

(lambda ()
  (add-to-list 'yas-snippet-dirs "~/.spacemacs.d/layers/wxapp/snippets"))
1 个赞

如果web-mode里都用一样的snippets,就写到yas的web-mode文件夹里,比如~/.spacemacs.d/snippets/web-mode/

如果要只在.wxapp文件里加载某些snippets,可以(add-hook 'web-mode-hook ...),在hook里检查文件扩展名,是微信小程序就(make-local-variable yas-snippets-dir)(如果这个变量本来是buffer-local的就不用make-local-variable了),然后setq这个local-variable。

1 个赞

:scream:

spacemacs 施了什么黑暗魔法,使得这样写有效:

(defun foo ()
  (progn
    (message "foo")))

而这样写无效:

(defun foo ()
  (message "foo"))

(progn ...) 通常用在类似 if 存在多条语句的时候,它的作用看起来如此「鸡肋」,被嫌弃,才会有 when/unless 这样方便的写法。use-package 甚至「发明」了 pseudo-plist 来避免 progn (从 use-package 的代码和文档中能看出, 本论坛也有相关讨论):

(use-package foo
  :init
  (setq variable-a t)
  (setq variable-b t))

而不必:

(use-package foo
  :init
  (progn
    (setq variable-a t)
    (setq variable-b t)))

我一般也就在宏里面用 progn。因为 mapc 和 dolist 代价太高。

对不起哈哈哈哈哈,不是没有效,是我忘记激活layer了

我想尝试 @JJPandari 提供的做法。

另外有个问题请教 @JJPandari 现在模板的扩展名是.wxml,我应该怎么写

如果有个代码看的话,对我来说可能更好理解一点

(with-eval-after-load 'web-mode
  (add-hook 'web-mode-hook (lambda () (when
                                      (equal "wxml" (file-name-extension buffer-file-name))
                                    (add-to-list (make-local-variable 'yas-snippet-dirs) "~/.spacemacs.d/layers/wxapp/snippets")))))

你试试。

上午没直接给代码一来是懒,二来发言更多那几位lisp都比我熟,“他会给代码的”。

1 个赞

谢了老哥!这么一来的话就都懂了

我lisp才看了几眼,所以比较难理解你上午说的应该怎么写出来…