Auto-YASnippet 详细使用方法

目前仅知 aya-create 可以创建代码片, 然后 aya-expand 可以加载出来. 但是如何去弄多个代码块… 试了半天也没弄明白aya-persist-snippet 是干啥的 网上据说这玩意可以创建不同语言文件的时候直接显示不同的模板. 求大神教怎么玩~

貌似 aya-create 只是让创建临时代码片段更方便了些 aya-persist-snippet 是保存临时代码片段?

据我所知是这样。

感觉上aya-persist-snippet 只是方便创建snippet,原来我创建snippet时都是手动编辑 snippet文件的……

测试了一下,确实是这样,只是帮助你创建snippet的

使用方法就是调用了 aya-create 后调用 aya-persist-snippet ,它会问你存成什么名字(的文件),然后打开这个snippet的文件,让你填入 key (也就是你按tab之前需要打的关键字),随后 C-c C-l你在原来的mode里就可以填入 key 然后 tab 展开你刚保存的 snippet 了

可是我自己写了, tab键的时候不好使, 请问你那个C-c C-l 是调用的哪个方法? 我用的是spacemacs, C-c C-lyas-load-snippet-buffer , 语义上看起来没错…

是这样, 主要是不知道咋回事保存后代码, 我按TAB不出来~

那你persist之后有提示保存吗? 按照abo-abo自己的说法,可能还要跑一下 yas/reload-all

Save the current auto-snippet to a user snippets folder (this defaults to ~/.emacs.d/snippets/.) The current major-mode name will be used to determine the snippets sub-directory to store the snippet. For example when working in js2-mode the snippet will be saved to (by default) ~/.emacs.d/snippets/js2-mode/.

You will be prompted for the snippet name. The appropriate file will be opened but not saved, with the point on the key: parameter of the snippet. If you wish to proceed, fill in the key, save the buffer and call C-c C-l (yas-load-snippet-buffer). Otherwise, simply kill the buffer - there will be no side effects.

You can customize aya-persist-snippets-dir to use a different folder for storing auto-snippets.

You will need to run yas/reload-all before using the new snippet with its key trigger.

保存了.

# -*- mode: snippet -*-
# contributor: Mzy
# name: log
# key: log 
# -- 
console.log("$1", $2);

我怀疑是否因为我用的spacemacs的原因, 因为我记得之前有次报错, 说我.spacemacs.d下面没有snippet文件夹, 我自己创建了一个后好了, 但是我把.emacs.d下的snippet复制过去也不行… 真是捉急~

spacemacs啊……你改过 aya-persist-snippets-dir吗,把这个变量改成原本spacemacs用的snippet文件夹看看?

还是不行 '(aya-persist-snippets-dir "/Users/Mzy/.spacemacs.d/snippets/" t) 它的路径是正确的, 但是我发现我保存的时候那个路径还是.emacs.d/xxx.. 的那个. 真是个大坑… 我把 aya-persist-snippets-dir 设置为 .emacs.d/xxx 那个也不行… 这玩意既不是加载的路径也不是保存的路径么…

是这样子设置路径的嘛……?试试 (setq aya-persist-snippets-dir "/Users/Mzy/.spacemacs.d/snippets/")? 或者根据 C-h v aya-persist-snippets-dir 确定了这个变量是对的再尝试?

之前设置这个变量是用的 customize-variable 不生效. 现在用 setq 写在 user-config 生效了. 保存的路径是 .spacemacs/snippets/ 了 但是敲出代码 keyTAB 还是不生效呢, 我查看了下 TAB 绑定的是 indent-for-tab-command. 这个有关系么?

你先试试写完 key之后调用 M-x yas-expand(或者 M-j) 看看, 我试了试 indent-for-tab-command 这个命令确实不会展开snippet, tab 展开应该是我自己绑定的,默认好像是 M-j

1 个赞

确实是, M-x yas-expand 好使, 弹出了选项. 但是官网上说的貌似默认就是绑定的 TAB.

我在 user-config 方法里绑定了快捷键 TAB 也可以达到效果了. web-mode 使用还是不行, 这个无所谓了

不过效果略差. 还弹个确认框出来

弹框应该是同一个key绑定了多个snippet, 你去文件夹里看看是不是之前测试设置时的重复了, web-modeM-j绑定了 emmet 功能,应该是冲突了, tab的问题估计和spacemacs的配置有关系,坐等子龙山人或者其他开发者来说明一下?

没错, 是因为绑定了多个, 不过我觉得这个可能是缓存, 因为我把之前的删了它还在… 这样已经能用了. Thank you very much!

唔,那可以重启一下emacs或者 yas/reload-all一下~

不好使, 这个确实原因不明, .emacs.d/xxx 的那些我已经完全删掉了, 而.spacemacs.d里面没有那个代码块… 不过我换了个key , 暂时可以不用理会了. 有了这个就好多了

哈哈好的。也许等你对emacs的配置文件再熟悉一点就能找出原因啦~加油 :smile:

慢慢来吧, 共勉!

小tip:yas/reload-all的帮助里面说This function is obsolete since yasnippet 0.8; use yas-reload-all instead.