请教一个关于使用snippets的问题?

使用 snippet 的时候想插入一个代码片段,但是又不知道默认的 snippet里面是不是已经有了这个片段,有没有一个办法可以通过搜索片段的内容,找到这个片段的关键字呢。

github上的readme里有一个链接指向ivy 那个也可以

ivy-yasnippet

我用的是 helm-c-yasnippet, ivy 应该也有对应的包。

也可以自行手动解析:

(let ((yas-ht
       (yas--table-hash (car (yas--get-snippet-tables 'example-mode)))))
  ...TODO...)

yas-ht 是一个嵌套的哈希表:

#s(hashtable
   ("key1" #s(hastable ("name1" . template) ("name2" . template) ...))
   ("key2" #s(hastable ("name1" . template) ("name2" . template) ...))
   ...)

之所以需要嵌套哈希表,是因为一个 key 可以对应多个 template。以 python 为例,假如已存在 for 定义如下:

# -*- mode: snippet -*-
# name: for ... in ... : ...
# key: for
# group : control structure
# --
for ${var} in ${collection}:
    $0

你还可以再定一个展开形式为 [... for ... in ...] 的 for:

(ht-get yas-ht "for")
;; =>
;; #s(hashtable ("for ... in ... : ..." . template)
;;              ("[... for ... in ...]" . template))

把 key 和 name 抓出来就是了。