关于snippet 的一点疑惑

我一直使用yasnippet和yasnippet-snippets包,最近升级到emacs29,使用treesit-auto包来安装、管理各种tree-sitter mode,但此时打开c++文件就出现这样的Message:

Ignoring unknown directive “desc” in file: ~/.emacs.d/elpa/yasnippet-snippets-20240221.1621/snippets/c+±mode/class11 Ignoring unknown directive “\${[0-9N]*” in file: ~/.emacs.d/elpa/yasnippet-snippets-20240221.1621/snippets/c+±mode/class11 Ignoring unknown directive “References” in file: ~/.emacs.d/elpa/yasnippet-snippets-20240221.1621/snippets/c+±mode/class11

我没搞明白这是什么意思。是不是snippet和tree-sitter之间有冲突呢?

更新:突然发现"desc"、“\${[0-9N]*”、"References"好像是出现在文件头部以“#”开头的注释区中,难道是snippet包更新出bug了?

1 个赞

不是 bug,准确地说是 snippet 的问题

最近 yasnippet 包更新比较频繁,修了些 bug,现在会检查 snippet 的 directive 是不是合法的(也就是你说的 # 开头的注释区)

yasnippet 只支持以下的 directive

http://joaotavora.github.io/yasnippet/snippet-development.html#org5e87ae3

我这倒是发现不知道为什么我只有一个 snippet 也要让我选一下而不是直接展开,很烦

原来#开头的不是注释啊,我看语法高亮还以为仅仅是注释呢…… 这么说只能等包更新,去掉不合法的directive,才能消掉这Message了

也起到注释作用,不过 yasnippet 会从里面提取 # xxx: xxx 格式的内容,把它叫做 directive,自定义 snippet 的时候绑定的 key 啥的不也是写在那里的嘛;不是这样格式的内容,就单纯是注释了

如果 yasnippet 读取 snippet 时遇到了这样的格式,又不能正常解析,就会报你说的问题

可以直接给包提 pr,估计修得快一点 :eyes:

我最开始用 yasnippet-snippets,不过不少模板文件有 final-newline,提了几次 pr 感觉根本改不完并且作者合并也挺慢的,我就干脆自己维护自己的模板文件了 :joy:

那么像 class11 这个 snippet 中的大段注释应该放在哪个字段下?

应该避免这样的格式,否则 yasnippet 就会报错

那只能自己维护一份 snippet 了,上游修的很慢。

是的,我给 yasnippet-snippets 提了几次 pr 后忍受不了上游更新速度,就转而自己维护了;然后最近写 lisp 比较多,想提炼一下 lisp 系的公用模板,又受不了 yasnippet 复用模板时的麻烦,就转去用 tempel:joy:


像平时写 commonlisp, clojure 时,它们的 if and 一类的用法都一致,可以一并放到 lisp-data-mode 文件夹下来复用,cond 的用法有些许区别,我就需要分别为这俩 mode 建文件夹然后把模板放进去,日后调整更是费劲;而像 tempel 所有模板都在一个文件下,调整起来也方便