最近弄了一个微信小程序的layer(wxml -> web-mode,wxss -> css,js -> tern)
然后在layer文件夹中放置了一个snippets
文件夹(存放小程序各种片段,wxml和js)
但是不知道怎么加载到yasnippet
求解
最近弄了一个微信小程序的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
文件夹加入到列表中一起加载。确实达到了目的
(progn ...)
是多余的;post-init-
顾名思义是在某个动作之后执行,此时修改 yas-snippet-dirs
能否起到作用?我非 spacemacs 用户,不了解情况,但是从 spacemacs 本身代码来看:
pos-init-
中修改 dirs
:https://github.com/syl20bnr/spacemacs/search?q=post-init-yasnippet&type=Code&utf8=✓
init-
中修改 dirs
: Search · yas-snippet-dirs · GitHub
我要有相对应的任务我才会把这个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"))
如果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。
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都比我熟,“他会给代码的”。
谢了老哥!这么一来的话就都懂了
我lisp才看了几眼,所以比较难理解你上午说的应该怎么写出来…